OKD ImageStream 电脑版发表于:2021/8/25 15:02 ![](https://img.tnblog.net/arcimg/hb/6070b5726c184417b10c0c4ca6546931.png) >#OKD ImageStream [TOC] ImageStream ------------ tn2>ImageStream是OpenShift独有的一种对象,在Kubernetes中没有对应的对象。它主要目标是简化容积镜像管理,机制就是通过使用标签实现镜像指针。ImageStream包括一系列”标签指针“指向实际的容器,例如下图有latest、8和7版本的容器指针,它们分别指向了不同位置和版本的容器镜像。ImageStream本身并不保存镜像,而是只保存容器元数据和”标签指针“。 (可以简单理解为:存放image名称与image地址的一个键值队集合) ImageStreamTag ------------ tn2>内部镜像链接指向外部镜像链接的键值对 ImageStream简单实践 ------------ tn2>首先我们登录,并拉取一个`helloword`的镜像 ```bash oc login -u admin -p admin docker pull mcr.microsoft.com/mcr/hello-world ``` tn2>然后我们创建项目 ```bash oc new-project is-project ``` tn2>我们可以用以下`oc import-image`命令和`oc tag`命令创建一个存放在is-project下的ImageStream,并让它指向外部Image,这个外部Image就是`mcr.microsoft.com/mcr/hello-world:latest` ```bash 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 ``` tn2>然后我们可以查看这个ImageStream和ImageStreamTag的详细信息。 ![](https://img.tnblog.net/arcimg/hb/e513ca296c1945d786a62b56e6a27c74.png) tn2>名为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。 ```bash mcr.microsoft.com/mcr/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a ``` tn2>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。 ```bash oc set image-lookup <<IMAGESTREAM>> ``` tn2>就拿我们刚刚的举例,当我们不开`本地名称查询`时 ```bash oc run myhelloword --image=myhelloword oc get pod -w ``` ![](https://img.tnblog.net/arcimg/hb/5a9b94a9d32945cd9b692532ab3fafc8.png) tn2>下面在使用了`set image-lookup`后就可通过`--image=myhelloword`使用该镜像了。 ```bash oc delete dc myhelloword oc set image-lookup myhelloword oc run myhelloword --image=myhelloword oc get pod ``` ![](https://img.tnblog.net/arcimg/hb/c1a98ae232794a20a5f029ee84b41083.png) tn2>我们可以看到它已经执行完成了,最后清理资源。 ```bash oc delete dc myhelloword ```