
OKD ImageStream
ImageStream
ImageStream是OpenShift独有的一种对象,在Kubernetes中没有对应的对象。它主要目标是简化容积镜像管理,机制就是通过使用标签实现镜像指针。ImageStream包括一系列”标签指针“指向实际的容器,例如下图有latest、8和7版本的容器指针,它们分别指向了不同位置和版本的容器镜像。ImageStream本身并不保存镜像,而是只保存容器元数据和”标签指针“。
(可以简单理解为:存放image名称与image地址的一个键值队集合)
ImageStreamTag
内部镜像链接指向外部镜像链接的键值对
ImageStream简单实践
首先我们登录,并拉取一个helloword
的镜像
oc login -u admin -p admin
docker pull mcr.microsoft.com/mcr/hello-world
然后我们创建项目
oc new-project is-project
我们可以用以下oc import-image
命令和oc tag
命令创建一个存放在is-project下的ImageStream,并让它指向外部Image,这个外部Image就是mcr.microsoft.com/mcr/hello-world:latest
oc import-image is-project/myhelloword:latest --from="mcr.microsoft.com/mcr/hello-world:latest" --confirm
oc tag mcr.microsoft.com/mcr/hello-world:latest is-project/myhelloword:latest
然后我们可以查看这个ImageStream和ImageStreamTag的详细信息。
名为myhelloword的ImageSteamTag指向的是DockerImage类型的External Image,外部镜像URL(名称+Tag)是mcr.microsoft.com/mcr/hello-world:latest
这个ImageSteam的mytag实际指向的外部Image是由dockerImageReference所指的sha256 ID,即下面的字符串。在生成ImageStreamTag的时候,OpenShift是使用了mcr.microsoft.com/mcr/hello-world:latest
获得的该Image的sha256 ID。这样当在build或deployment命令中引用ImageStreamTag来创建Pod的时候,实际上使用的是用sha256 ID代表的Image。
mcr.microsoft.com/mcr/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
1.每次通过ImageSteamTag使用Image的时候使用的是source类型的referencePolicy,即直接从source访问Image。因此如果当时网络不通,则无法访问该Image。
2.当生成ImageSteamTag指向sha256 ID后,修改升级外部镜像的tag就不再影响ImageSteamTag了,也就是说即便把外部镜像从mcr.microsoft.com/mcr/hello-world:latest
改为mcr.microsoft.com/mcr/hello-world:v1
,只要sha256 ID没有变化,OpenShift的ImageSteamTag就可以继续使用该外部镜像。
3.当外部镜像发生变化后需要自动更新ImageSteamTag对应的sha256 ID,那么可以使用oc tag
或oc import-image
命令的-–scheduled=true
参数,它会在YAML中设置importPolicy: {scheduled: true}
。
4.ImageStream是OpenShift扩展的对象,因此OpenShift的Build、DeploymentConfig等对象可以直接使用它。如果需要在Kubernetes的RC、Pod等对象使用ImageStream,可执行以下的命令启动ImageStream的本地名称查询功能。该命令将把ImageStream的Imagestream.spec.lookupPolicy.local
设为true。
oc set image-lookup <<IMAGESTREAM>>
就拿我们刚刚的举例,当我们不开本地名称查询
时
oc run myhelloword --image=myhelloword
oc get pod -w
下面在使用了set image-lookup
后就可通过--image=myhelloword
使用该镜像了。
oc delete dc myhelloword
oc set image-lookup myhelloword
oc run myhelloword --image=myhelloword
oc get pod
我们可以看到它已经执行完成了,最后清理资源。
oc delete dc myhelloword
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

