OpenShift 4 之 Image Registry、Image 和 ImageStream 概念和相关操作
概念篇
1. Container Image(容器镜像)
不用再解释了,就是容器镜像。以前叫Docker Image,现在叫Container Image更准确些,因为有了OCI容器规范后,容器不再是Docker一家的了。
2. ImageStream
ImageStream是OpenShift独有的一种对象,在Kubernetes中没有对应的对象。它主要目标是简化容积镜像管理,机制就是通过使用标签实现镜像指针。ImageStream包括一系列”标签指针“指向实际的容器,例如下图有latest、8和7版本的容器指针,它们分别指向了不同位置和版本的容器镜像。ImageStream本身并不保存镜像,而是只保存容器元数据和”标签指针“。
ImageStream记录OpenShift使用的Container Image的元数据,这些元数据包括:
- ImageStreamTag: 指向Container Image的标签。
- ImageStreamImage: 是ImageStreamTag实际指向的Image。
- ImageStreamTrigger: 当ImageStreamImage发生变化后,通过ImageStreamTrigger可获取该事件。通常使用ImageStreamTrigger触发依赖变化Image的上层Image进行自动镜像更新。
3. Internal Registry和External Registry
OpenShift内部自带Image Registry用来保存两类Container Image。
- 一种是Base Image:顾名思义,就是应用使用的基础镜像。Base Image里主要包括应用运行环境,一般不包括应用代码。例如Java应用的Base Image至少要包括JDK。
- 另一种是App Image:即将应用+Base Image打包的应用镜像。
OpenShift内部自带Image Registry和外部Image Registry的关系如下图。Base Image可以由OpenShift自动从External Registry上拉到Internal Registry,另外OpenShift会将构建好的App Image推送到Internal Registry。
操作篇
以下子章节之间有依赖关系,请从开始进行操作
根据ImageStream的Image元数据自动拉取容器镜像
- 执行命令创建项目my-container-image。
$ oc new-project my-container-image
- 然后获取的容器元数据,并建立ImageStream。
#方法1:为dockerhub上的openshift/deployment-example:v1镜像打标签deployment-example:v1
$ oc tag docker.io/openshift/deployment-example:v1 deployment-example:v1
#方法2:导入外部Image的元数据到OOpenShift
$ oc import-image docker.io/openshift/deployment-example:v1 --confirm
- 在对外部镜像打标签后,OpenShift会自动获取Image元数据,并在OpenShift中通过ImageStream(简写 IS)记录这些Image的元数据信息。执行命令查看ImageStream信息,下面是包括tag为v1版容器镜像的ImageStream。
$ oc describe is deployment-example
Namespace: my-container-image
Created: 9 minutes ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2019-12-06T06:23:26Z
Image Repository: default-route-openshift-image-registry.apps-crc.testing/my-container-image/deployment-example
Image Lookup: local=false
Unique Images: 1
Tags: 1
v1
tagged from docker.io/openshift/deployment-example:v1
*docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
- 运行以下命令,查看ImageStream的tag列表。
$ oc get istag
NAME IMAGE REF UPDATED
deployment-example:v1 docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b 12 minutes ago
- 查看上面istag指向Image的详细信息,其中包括分层文件。
$ oc get istag
NAME IMAGE REF UPDATED
deployment-example:v1 docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b 12 minutes ago
[dawnsky@rhel76 crc]$ oc describe istag deployment-example:v1
Image Name: sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
Docker Image: docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
Name: sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
Created: 14 minutes ago
Annotations: image.openshift.io/dockerLayersOrder=ascending
Image Size: 5.77MB in 6 layers
Layers: 0B sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
5.77MB sha256:50438f3701c47319ff1c8189ff19f5a8c779f2479aa2066979b930c7dbb3bde8
0B sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
0B sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
0B sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
0B sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
Image Created: 4 years ago
Author: Clayton Coleman <ccoleman@redhat.com>
Arch: amd64
Entrypoint: /deployment v1
Working Dir: <none>
User: <none>
Exposes Ports: 8080/tcp
Docker Labels: <none>
Environment: COLOR=#006e9c
- 基于ImageStream的v1指向的Image创建应用。最后访问应用,可以看到页面返回的v1版的应用。
$ oc new-app my-container-image/deployment-example:v1
$ oc expose svc deployment-example
$ curl $(oc get route deployment-example -o template --template '{{.spec.host}}') | grep h1
- 执行命令查看events事件,可以看到有3项,其中名为deployment-example的Image是在第一次部署应用的时候才从网上pulled到OpenShift本地的Internal Registry。
$ oc get events | grep Pull
15m Normal Pulled pod/deployment-example-1-deploy Container image "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9ac5a8dceed67e3c3e1c018dc581bf5f03d77a20a2f1ca1bf00c32b5e75b19f6" already present on machine
14m Normal Pulling pod/deployment-example-1-djw48 Pulling image "openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b"
14m Normal Pulled pod/deployment-example-1-djw48 Successfully pulled image "openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b"
增加标签
- 在ImageStream中增加“latest”的标签,并让它指向v1版的Image。此时可以看到v1和latest指向的同一个Image。
$ oc tag docker.io/openshift/deployment-example:v1 deployment-example:latest
$ oc get istag
NAME IMAGE REF UPDATED
deployment-example:latest docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b 8 seconds ago
deployment-example:v1 docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b 19 minutes ago
- 设置ImageStream的latest标签指向v2版的Image。然后通过查看ImageStream信息,其中记录了每个tag指向的历史Image。可以看到当前latest指向v2的Image,不过以前指向的是v1的Image。
$ oc tag docker.io/openshift/deployment-example:v2 deployment-example:latest
$ oc describe is deployment-example
Name: deployment-example
Namespace: my-container-image
Created: 26 minutes ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2019-12-06T07:50:11Z
Image Repository: default-route-openshift-image-registry.apps-crc.testing/my-container-image/deployment-example
Image Lookup: local=false
Unique Images: 2
Tags: 2
latest
tagged from docker.io/openshift/deployment-example:v2
* docker.io/openshift/deployment-example@sha256:1318f08b141aa6a4cdca8c09fe8754b6c9f7802f8fc24e4e39ebf93e9d58472b
4 minutes ago
docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
7 minutes ago
v1
tagged from docker.io/openshift/deployment-example:v1
* docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
26 minutes ago
删除并恢复标签
- 删除ImageStream中v1的tag。然后再查看ImageStream,确认已经没有单独的v1版tag的信息了。但是还可通过latest的历史查到v1版tag指向的ImageStreamImage。
$ oc tag -d deployment-example:v1
$ oc describe is deployment-example
Name: deployment-example
Namespace: my-container-image
Created: 45 minutes ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2019-12-06T07:50:11Z
Image Repository: default-route-openshift-image-registry.apps-crc.testing/my-container-image/deployment-example
Image Lookup: local=false
Unique Images: 2
Tags: 1
latest
tagged from docker.io/openshift/deployment-example:v2
* docker.io/openshift/deployment-example@sha256:1318f08b141aa6a4cdca8c09fe8754b6c9f7802f8fc24e4e39ebf93e9d58472b
23 minutes ago
docker.io/openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b
25 minutes ago
- 从历史的ImageStreamImage恢复istag。
$ oc tag --source=docker openshift/deployment-example@sha256:c505b916f7e5143a356ff961f2c21aee40fbd2cd906c1e3feeb8d5e978da284b deployment-example:v1
$ oc get istag
其它镜像操作
- 参考《OpenShift 4 之通过直接访问内部的 Image Registry 操作容器镜像》,实现对Internal Registry的直接操作。
- 查看所有ImageStreamImage(即ImageStream包括的每个以版本的Image)的镜像大小。
$ oc adm top images
- 查看所有ImageStream的大小(包括了每个ImageStream中所有ImageStreamImage)。
oc adm top imagestreams