OpenShift 4 - 向内部Image Registry导入Image

了解OpenShift内部Image Registry

OpenShift容器平台提供了一个内置的Container Image Registry,该Image Registry用户提供了一个开箱即用的解决方案来管理运行OpenShift工作负载所用到的Image。Image Registry可以像其他任何集群工作负载一样扩展,不需要特定的基础设施配置。此外,它集成到了集群用户认证和授权系统中,这意味着通过定义Image资源的用户权限来控制创建和检索Image的访问。

Image Registry Operator在 openshift-image-registry 命名空间中运行,并在该位置管理Image Registry实例。Image Registry的所有配置和工作负载资源都位于该命名空间中。Image数据存储在两个位置。实际的Image数据存储在可配置的存储位置,如云存储或文件系统卷等。Image元数据被存储为标准的API资源,这些API资源包括Image和ImageStream。

当使用podman工具向OpenShift内部Image Registry推送Image的时候,OpenShift会自动为Image创建对应的ImageStream,这样在OpenShift中就可以使用ImageStream访问这些保存在本地的Image了。

podman push命令会将外部Image传到内部Image Registry中并保存,并根据Image的元数据生成对应的ImageStream对象;而oc import-image命令只是根据外部镜像的元数据生成ImageStream对象,ImageSteam还是指向外部镜像。

向内部Image Registry推送Image

为podman的pull/push操作赋权
为了能操作内部Image Registry,首先要有权限。用OpenShift集群管理员(例如admin)登录后执行命令,为自己赋权

$ oc policy add-role-to-user registry-viewer $(oc whoami)
$ oc policy add-role-to-user registry-editor $(oc whoami)

新建项目

本文未来手动导入到内部Image Registry的Image是被放在以下命令新建的特定的新建项目中。其实导入的Image也可放在所有用户都可访问的公共项目OpenShift中。

$ oc new-project myproject 

进入OpenShift集群内部

首先需要进入的某个OpenShift节点,这样我们就可以用OpenShift集群内部地址访问Image Registry了。

  1. 查看集群节点名称
$ oc get nodes
NAME                           STATUS   ROLES    AGE    VERSION
ip-10-0-133-204.ec2.internal   Ready    master   3d8h   v1.17.1
ip-10-0-134-17.ec2.internal    Ready    worker   3d7h   v1.17.1
ip-10-0-147-125.ec2.internal   Ready    master   3d8h   v1.17.1
ip-10-0-154-19.ec2.internal    Ready    worker   3d7h   v1.17.1
ip-10-0-161-178.ec2.internal   Ready    master   3d8h   v1.17.1
  1. 进入一个节点,例如第一个master节点。
$ oc debug nodes/ip-10-0-133-204.ec2.internal
Starting pod/ip-10-0-133-204ec2internal-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.133.204
If you don't see a command prompt, try pressing enter.
  1. 为了运行可执行程序,要先执行以下命令。
sh-4.2# chroot /host
  1. 执行命令,用集群管理员(例如admin)登录OpenShift。
sh-4.4# oc login -u admin -p <password> https://api-int.<cluster_name>.<base_domain>:6443

Pull Image/Push Image

方法1:在集群节点内部操作

  1. 执行podman pull命令,将远程Image拉到本地。
sh-4.4#  podman pull openshift/hello-openshift
Trying to pull registry.access.redhat.com/openshift/hello-openshift...
  name unknown: Repo not found
Trying to pull docker.io/openshift/hello-openshift...
Getting image source signatures
Copying blob 4f4fb700ef54 done
Copying blob 8b32988996c5 done
Copying config 7af3297a3f done
Writing manifest to image destination
Storing signatures
7af3297a3fb4487b740ed6798163f618e6eddea1ee5fa0ba340329fcae31c8f6
  1. 确认本地已有该openshift/hello-openshift镜像。
sh-4.4# podman images | grep hello-openshift
docker.io/openshift/hello-openshift                        latest       7af3297a3fb4   2 years ago     6.1 MB
  1. 对本地的镜像重新打tag标签。注意:在Image的新标签中使用了名为myproject的项目名作为Image Repository。
sh-4.4# podman tag docker.io/openshift/hello-openshift:latest image-registry.openshift-image-registry.svc:5000/myproject/hello-openshift-1:latest
  1. 再次查看本地镜像,确认hello-openshift镜像已经有新标签了。
sh-4.4# podman images | grep hello-openshift
image-registry.openshift-image-registry.svc:5000/myproject/hello-openshift-1                latest       7af3297a3fb4   2 years ago     6.1 MB
docker.io/openshift/hello-openshift                                                         latest       7af3297a3fb4   2 years ago     6.1 MB
  1. 把打过新标签的Image推送到OpenShift内部Image Registry,其中myproject是上面创建的项目。
sh-4.4# podman push image-registry.openshift-image-registry.svc:5000/myproject/hello-openshift-1:latest
Getting image source signatures
Copying blob 5f70bf18a086 skipped: already exists
Copying blob da0e4d9121c7 [--------------------------------------] 0.0b / 0.0b
Copying config 7af3297a3f [--------------------------------------] 0.0b / 1.3KiB
Writing manifest to image destination
Storing signatures

方法2:在集群节点外部操作

确保已经在集群外部的执行节点中安装了podman。

  1. 首先确认OpenShift的DefaultRoute是可用的。
$ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
  1. 获得OpenShift内部Image Registry对外的访问地址
$ HOST=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
  1. 使用podman登录Image Registry对外的访问地址。注意:这里需要切换root身份执行命令。
$ sudo podman login -u $(oc whoami) -p $(oc whoami -t) --tls-verify=false $HOST 
Login Succeeded!
  1. 执行podman pull命令,将远程Image拉到本地。说明:我们可以从返回结果看到,由于pull命令中没有提供完整的外部Registry地址,因此podman命令首先去registry.access.redhat.com、registry.fedoraproject.org和registry.centos.org查找镜像,最后在docker.io查找到openshift/hello-openshift,然后pull到本地。
$ sudo podman pull openshift/hello-openshift
Trying to pull registry.access.redhat.com/openshift/hello-openshift...
  name unknown: Repo not found
Trying to pull registry.fedoraproject.org/openshift/hello-openshift...
  manifest unknown: manifest unknown
Trying to pull registry.centos.org/openshift/hello-openshift...
  manifest unknown: manifest unknown
Trying to pull docker.io/openshift/hello-openshift...
Getting image source signatures
Copying blob 4f4fb700ef54 done
Copying blob 8b32988996c5 done
Copying config 7af3297a3f done
Writing manifest to image destination
Storing signatures
7af3297a3fb4487b740ed6798163f618e6eddea1ee5fa0ba340329fcae31c8f6
  1. 确认本地已有该openshift/hello-openshift镜像。
$ sudo podman images | grep hello-openshift
docker.io/openshift/hello-openshift   latest   7af3297a3fb4   2 years ago   6.1 MB
  1. 对本地的镜像重新打tag标签。注意:在Image的新标签中使用了名为myproject的项目名作为Image Repository。
$ sudo podman tag docker.io/openshift/hello-openshift:latest $HOST/myproject/hello-openshift-2:latest
  1. 再次查看本地镜像,确认hello-openshift镜像已经有新标签了。
$ sudo podman images | grep hello-openshift
default-route-openshift-image-registry.apps.cluster-beijing-1374.beijing-1374.example.opentlc.com/myproject/hello-openshift-2   latest   7af3297a3fb4   2 years ago   6.1 MB
docker.io/openshift/hello-openshift                                                                                             latest   7af3297a3fb4   2 years ago   6.1 MB
  1. 把打过新标签的Image推送到OpenShift内部Image Registry,其中myproject是上面创建的项目。
$sudo podman push $HOST/myproject/hello-openshift-2:latest --tls-verify=false
Getting image source signatures
Copying blob da0e4d9121c7 done
Copying blob 5f70bf18a086 done
Copying config 7af3297a3f done
Writing manifest to image destination
Storing signatures

验证推送的Image

以下从OpenShift集群外部的节点操作。

  1. 查看OpenShift的myproject项目中是否有名为hello-openshift的Image。
$ oc get image -n myproject | grep hello-openshift
sha256:a79c6182e8581564bcdd6c6c91e3a9bfe5acc3e48903a1640f6effe12243cb7f   image-registry.openshift-image-registry.svc:5000/myproject/hello-openshift-1@sha256:a79c6182e8581564bcdd6c6c91e3a9bfe5acc3e48903a1640f6effe12243cb7f
sha256:03e2cf83f6ec05a187a86bbbde9a2d47f62463ace5308a2446b828b2aeefe04e   image-registry.openshift-image-registry.svc:5000/myproject/hello-openshift-2@sha256:03e2cf83f6ec05a187a86bbbde9a2d47f62463ace5308a2446b828b2aeefe04e
  1. 查看OpenShift的myproject项目中已经有了ImageStream。说明:这说明OpenShift会根据Push到Image Registry的Image自动创建ImageStream对象。
$ oc get is -n myproject
NAME              IMAGE REPOSITORY                                                                                                                TAGS     UPDATED
hello-openshift-1   default-route-openshift-image-registry.apps.cluster-beijing-1374.beijing-1374.example.opentlc.com/myproject/hello-openshift-1   latest   11 seconds ago
hello-openshift-2   default-route-openshift-image-registry.apps.cluster-beijing-fd91.beijing-fd91.example.opentlc.com/myproject/hello-openshift-2   latest   About a minute ago
  1. 基于名为hello-openshift-1的Image或名为hello-openshift-2的ImageSteam,部署podhello-openshift-1和podhello-openshift-2应用。
$ oc new-app hello-openshift-1 --docker-image=image-registry.openshift-image-registry.svc:5000/myproject/hello-openshift-1:latest
$ oc new-app hello-openshift-2 --image-stream=myproject/hello-openshift-2:latest
  1. 根据Service生成Route
$ oc expose svc hello-openshift-1
$ oc expose svc hello-openshift-2
  1. 最后访问hello-openshift-1和hello-openshift-2的route查看结果
$ curl $(oc get route hello-openshift-1 -o template --template '{{.spec.host}}')
Hello OpenShift!
$ curl $(oc get route hello-openshift-2 -o template --template '{{.spec.host}}')
Hello OpenShift!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章