设置映像注册表
Red Hat® OpenShift® on IBM Cloud® 集群包含内部注册表,用于在本地构建、部署和管理容器映像。 要使专用注册表能够管理和控制对整个企业中映像的访问权,您还可以将集群设置为使用 IBM Cloud® Container Registry。
选择映像注册表解决方案
您的容器映像必须存储在容器注册表中,以便您的集群可以访问,将应用程序部署到集群中。 您可以选择使用 Red Hat OpenShift 集群的内置注册表、仅限特定用户访问的专用注册表或公共注册表。 查看下表以选择适合您用例的最佳选项。
- 内部 Red Hat OpenShift Container Registry (OCR)
-
您的集群通过内部 Red Hat OpenShift Container Registry 进行设置,这样 Red Hat OpenShift 就能在集群内自动构建、部署和管理应用程序生命周期。 图像存储在备份的 IBM Cloud 经典文件存储设备中,该设备在群集创建时就已配置。 如果需要更多存储空间,可以调整该设备的大小。 用例:
-
有关更多信息,请参阅使用内部注册表。
- 专用注册表
-
专用注册表是保护映像免受未经授权的用户的良好选择。 专用注册表必须由集群管理员设置,以确保访问权、存储配额、映像信任和其他功能按预期工作。 缺省情况下,Red Hat OpenShift 集群 通过
default
项目中的映像拉取私钥与专用 IBM Cloud Container Registry 集成。IBM Cloud Container Registry 是一个高可用性的多租户专用注册表,用于存储您自己的映像。 您还可以从全局icr.io
注册表中拉取 IBM 提供的映像,并从授权注册表中获取经许可的软件。 通过 IBM Cloud Container Registry,您可以管理多个集群的映像,并与 IBM Cloud IAM 和计费集成。 将 IBM Cloud Container Registry 与内部注册表配合使用的优点:- 通过内部注册表进行本地映像高速缓存以实现更快的构建。
- 其他项目中的部署可以看到映像流,因此您不必将拉取私钥复制到每个项目。
- 跨多个集群共享映像,而无需将映像推送到多个注册表。
- 自动扫描映像漏洞。
- 通过 IBM Cloud IAM 策略和单独的区域注册表来控制访问权。
- 保留映像,而无需占用集群或连接的存储设备中的存储空间。 您还可以设置策略来管理映像数量,以防止映像占用的空间太多。
- VPC 基础结构: 使用专用注册表服务端点,以便仅使用专用云服务端点的集群仍可访问注册表。
- 设置存储和映像拉取流量配额,以更好地控制映像的存储、使用和计费。
- 从授权注册表中拉取获得许可的 IBM 内容。
-
首先,请参阅以下主题:
- 公共注册表
-
Docker Hub 等公共注册中心是跨团队、公司、集群或云提供商共享图像的一种方式。 一些公共注册表还可能会提供专用注册表组件。 用例:
- 在公用网络上推送和拉取映像。
- 跨云提供商快速测试容器
- 不需要企业级功能,如漏洞扫描或访问管理。
-
有关更多信息,请参阅公共注册表的文档,例如 Quay 或 Docker Hub。
在内部注册表中存储图像
缺省情况下,Red Hat OpenShift 集群具有内部注册表。 将备份内部注册表中的映像,但根据 Red Hat OpenShift on IBM Cloud 集群的基础结构提供程序而有所不同。
- 经典集群
- 缺省情况下,使用使用 File Storage for Classic 作为支持存储器的内部注册表来设置 Red Hat OpenShift 集群。 删除集群时,还将删除内部注册表及其映像。 如果要持久化映像,可以考虑使用私有注册表(如 IBM Cloud Container Registry ),将映像备份到持久化存储(如 Object Storage ),或创建一个单独的、独立的 Red Hat OpenShift 容器注册表 (OCR) 集群。 有关更多信息,请参阅 Red Hat OpenShift 文档。
- VPC 集群
- Red Hat OpenShift 集群的内部注册表将映像备份到帐户中的 IBM Cloud Object Storage 实例中自动创建的存储区。 即使删除集群,也会保留 Object Storage 存储区中存储的任何数据。
- 经典集群,VPC 集群或 Satellite 集群
- 您可以选择设置内部注册表以将数据存储在运行内部注册表 pod 的工作程序节点的
emptyDir
中。 请记住,此数据不是持久数据,如果重新启动 pod 或工作程序节点,那么将删除存储的数据并且不可恢复。 如果您定期从大型映像构建容器,那么可以将这些映像存储在emptyDir
本地以提高性能。
将内部映像注册表备份到 IBM Cloud Object Storage
虚拟私有云
Red Hat OpenShift 集群内部注册表中的映像将自动备份到 IBM Cloud Object Storage 存储区。 即使删除集群,也会保留 Object Storage 存储区中存储的任何数据。
但是,如果在创建集群时存储区未能创建,那么必须手动创建存储区并将集群设置为使用该存储区。 同时,内部注册表使用 emptyDir
Kubernetes 卷,该卷将容器映像存储在工作程序节点的辅助磁盘上。 emptyDir
卷不会被视为持久高可用性存储器,如果删除使用该映像的 pod,那么将自动删除该映像。
要为内部注册表手动创建存储区,请参阅 集群创建有关云对象存储区的错误。
在经典集群中的内部注册表中存储映像
默认情况下,Red Hat OpenShift 集群的内部注册表使用 IBM Cloud File Storage for Classic 卷来存储注册表映像。 可以查看存储卷的缺省大小,或者更新卷大小。
查看卷详细信息
要查看卷详细信息(包括存储类和大小),可以描述持久卷声明。
oc describe pvc -n openshift-image-registry image-registry-storage
更改卷详细信息
如果注册表需要更多千兆字节的存储空间来存储映像,那么可以调整文件存储器卷的大小。 有关更多信息,请参阅更改现有存储设备的大小和 IOPS。 调整 IBM Cloud 基础架构帐户中的卷大小时,不会更新连接的 PVC 描述。 相反,您可以登录使用 registry-backing
PVC 的 openshift-image-registry
pod 来验证卷的大小是否已调整。
将映像存储在工作程序节点空目录中
如果您定期从大型映像构建容器,那么可以将内部注册表映像本地存储在工作程序节点 (例如裸机工作程序节点) 的 emptyDir
中,以提高性能。
请记住,此数据不是持久数据,如果重新启动 pod 或工作程序节点,那么将删除存储的数据并且不可恢复。
- 访问 Red Hat OpenShift 集群。
- 更新映像注册表操作程序 configmap 以将存储器设置为使用工作程序节点的
emptyDir
。 请注意,更新 configmap 以使用emptyDir
不会 除去映像注册表的原始 PVC。oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
- 如果 映像注册表操作员管理状态 设置为
Unmanaged
,例如在 Satellite 集群中,请将管理状态更新为Managed
。 现在,操作程序将更新内部注册表 pod。oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
- 获取内部注册表 pod 的详细信息,以便您可以验证更新。
-
检查
image-registry
pod 是否正在运行,以及 pod 是否在集群中的每个工作程序节点上运行。oc get pods -n openshift-image-registry
示例输出
NAME READY STATUS RESTARTS AGE cluster-image-registry-operator-695bf78ffc-zvkhd 2/2 Running 0 33m image-registry-6774598589-65cnx 1/1 Running 0 112s node-ca-gg66r 1/1 Running 0 113s node-ca-n8jpq 1/1 Running 0 113s node-ca-p2d7j 1/1 Running 0 113s
-
获取运行
image-registry
pod 的 Node 的公共 IP 地址。oc describe pod -n openshift-image-registry <image-registry-pod> | grep Node
示例输出
Node: 169.xx.xxx.xxx/169.xx.xxx.xxx
如果工作程序节点 IP 地址是专用的,请运行
ibmcloud oc worker ls -c <cluster> | grep <private_IP>
并记下相应的公共 IP 地址。 -
获取 pod YAML 中
metadata.uid
部分中image-registry
pod 的 UID (而不是metadata.ownerReferences.uid
部分中副本集的 UID)。oc get pod -n openshift-image-registry <image-registry-pod> -o yaml
示例输出
apiVersion: v1 kind: Pod metadata: uid: e8d7718d-b0bd-47e2-9aaa-05f3a608fd9b ...
-
- 验证内部注册表是否将数据存储到工作程序节点的
emptyDir
。-
使用先前检索的工作程序节点 直接从集群访问注册表。 遵循步骤将测试映像推送到内部注册表。
要在 Red Hat OpenShift 文档中完成这些步骤,您需要
podman
CLI 工具。 缺省情况下,工作程序节点可能没有此 CLI 工具。 请参阅 Podman 安装指南 以了解可用的 RHEL 版本。 -
浏览至保存到
emptyDir
的内部注册表 pod 文件夹。 对于<pod_uid>
,请使用先前检索的 pod UID。cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift
-
验证映像是否在存储库目录中。
ls
示例输出
<myimage> nginx ...
-
除去内部映像注册表
虚拟私有云
图像注册操作员部署仅在 Red Hat OpenShift on IBM Cloud管理的集群中可用。 HyperShift 托管集群在控制平面运行映像注册操作员。
如果您不想使用内部映像注册表,那么可以完成以下步骤以将其除去。
- 保存内部注册表配置的副本。
oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
- 运行以下补丁命令以将映像注册表的管理状态更改为
Removed
。kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge'
- 更改管理状态后,将从集群中的
openshift-image-registry
名称空间中除去映像注册表服务和部署。 您可以运行以下命令来验证是否已除去这些命令。 请注意,仅会除去映像注册表部署和服务。 将保留映像注册表操作程序部署和服务。oc get deployment -n openshift-image-registry
oc get svc -n openshift-image-registry
为内部注册表设置安全的外部路径
默认情况下,Red Hat OpenShift 集群有一个内部注册表,可通过带有内部 IP 地址的服务使用。 如果要使内部注册表在公用网络上可用,可以设置安全的重新加密路径。 例如,可以将集群的内部注册表设置为充当其他项目或集群中的部署的公共注册表。
开始之前:
- 确认您具有集群的 Manager IBM Cloud IAM 服务访问角色。
- 确保集群具有公用网络连接,以使用公共路径公开内部注册表。
- 在本地计算机上安装 Docker。
- 访问 Red Hat OpenShift 集群。
要使用内部注册表,请设置用于访问此注册表的公共路径。 然后,创建包含用于访问此注册表的凭证的映像拉取私钥,以便其他项目中的部署可以从此注册表中拉取映像。
-
从
openshift-image-registry
项目中,确保内部注册表中存在image-registry
服务。oc get svc -n openshift-image-registry
示例输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE image-registry ClusterIP 172.21.xxx.xxx <none> 5000/TCP 36d image-registry-operator ClusterIP None <none> 60000/TCP 36d
-
为
image-registry
服务创建安全路由,使用reencrypt
TLS 终止。 通过重新加密,路由器会使用一个证书终止 TLS 连接,然后使用其他证书来重新加密与内部注册表的连接。 通过这种方法,将加密用户和内部注册表之间的连接的完整路径。 要提供自己的自定义域名,请使用--hostname
选项。oc create route reencrypt --service=image-registry -n openshift-image-registry
-
检索分配给
image-registry
路由的主机名 (HOST/PORT )和端口。oc get route image-registry -n openshift-image-registry
示例输出
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD image-registry image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud image-registry 5000-tcp reencrypt None
-
编辑路由,将 负载平衡策略设置为
source
,以便同一客户端 IP 地址到达同一服务器,如直通路由设置。 可以通过在metadata.annotations
部分中添加注释haproxy.router.openshift.io/balance: source
来设置该策略。 您可以通过 Red Hat OpenShift 应用程序控制台或在命令行中运行以下命令编辑配置文件。oc edit route image-registry -n openshift-image-registry
添加注释。
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/balance: source ...
-
如果企业网络策略阻止通过代理或防火墙从本地系统访问公共端点,那么 允许访问您在以下步骤中为内部注册表创建的路由子域。
-
使用与主机名相同的路径登录到内部注册表。
docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
-
既然您已登录,现在可尝试将样本
hello-world
应用程序推送到内部注册表。-
从 DockerHub 中拉取
hello-world
映像,或在本地计算机上构建映像。docker pull hello-world
-
使用内部注册表的主机名、要将映像部署到的项目以及映像名称和标记来标记本地映像。
docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
-
将映像推送到集群的内部注册表。
docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
-
验证图像是否已添加到 Red Hat OpenShift 图像流中。
oc get imagestream
示例输出
NAME DOCKER REPO TAGS UPDATED hello-world image-registry-openshift-image-registry.svc:5000/default/hello-world latest 7 hours ago
-
-
要支持项目中的部署从内部注册表中拉取映像,请在项目中创建映像拉取私钥,以保存用于访问内部注册表的凭证。 然后,将映像拉取私钥添加到每个项目的缺省服务帐户。
-
列出缺省服务帐户使用的映像拉取私钥,并记下以
default-dockercfg
开头的私钥。oc describe sa default
示例输出
... Image pull secrets: all-icr-io default-dockercfg-mpcn4 ...
-
从配置文件的
data
字段中获取已编码的私钥信息。oc get secret <default-dockercfg-name> -o yaml
示例输出
apiVersion: v1 data: .dockercfg: ey...=
-
对
data
字段的值进行解码。echo "<ey...=>" | base64 -D
示例输出
{"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
-
为内部注册表创建新的映像拉取私钥。
secret_name
:为图像提取秘密命名,如internal-registry
。--namespace
:输入要创建图像拉秘的项目,如default
。--docker-server
:输入image-registry
路由的主机名和端口 (image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000
),而不是内部服务 IP 地址 (172.21.xxx.xxx:5000
)。--docker-username
:从上一个图像提取密文中复制"username"
,如serviceaccount
。--docker-password
:从上一个图像中复制"password"
。--docker-email
:如果有,请输入您的 Docker 电子邮件地址。 如果没有,请输入一个虚构的电子邮件地址,如a@b.c
。 此电子邮件对于创建 Kubernetes 私钥是必需的,但在创建后不会再使用此电子邮件。
oc create secret docker-registry internal-registry --namespace default --docker-server image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000 --docker-username serviceaccount --docker-password <eyJ...> --docker-email a@b.c
-
将映像拉取私钥添加到项目的 default 服务帐户。
oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
-
针对要从内部注册表中拉取映像的每个项目,重复上述步骤。
-
既然您已为内部注册表设置了可访问的路径,接下来就可以登录到注册表,将映像推送到注册表以及从注册表中拉取映像。 有关更多信息,请参阅 Red Hat OpenShift 文档。
将映像从 IBM Cloud Container Registry 导入内部注册表映像流
缺省情况下,Red Hat OpenShift on IBM Cloud 集群设置为从 default
项目中的远程专用 IBM Cloud Container Registry icr.io
域中拉取映像。 您可以通过将映像标记为 映像流,将映像从 IBM Cloud Container Registry 导入到 Red Hat OpenShift 集群的内部注册表中。 通过此设置,您可以使用内部注册表的本地高速缓存从映像部署应用程序,这可使应用程序部署构建速度更快。 此外,其他项目中的部署可以引用映像流,以便您不必在每个项目中创建到 IBM Cloud Container Registry 的映像拉取私钥凭证。
如果在 IBM Cloud Container Registry中更新映像,那么不会将该映像自动拉入 Red Hat OpenShift 集群的内部注册表。 而是 配置定期导入,或者重复这些步骤来标记映像。 根据您在部署中使用的映像拉取策略,您可能还需要重新启动部署。
想要了解有关构建,映像流和内部注册表如何协同工作的更多信息? 请阅读 Red Hat OpenShift 文档,或者查看 此博客关于管理容器映像。
-
切换到
default
项目以将映像拉入映像流。 已使用凭证设置default
项目以访问icr.io
注册表。oc project default
-
列出 IBM Cloud Container Registry中的可用映像。 请注意要拉入 Red Hat OpenShift 集群内部注册表的映像的 存储库 和 标记。
ibmcloud cr images
-
标记映像,以将其作为映像流从 IBM Cloud Container Registry 名称空间拉入内部注册表。 有关更多信息,请参阅 Red Hat OpenShift 文档 或运行
oc tag --help
。oc tag <region>.icr.io/<namespace>/<image>:<tag> default/<image>:<tag> --reference-policy=local [--scheduled]
<region>.icr.io/<namespace>/<image>:<tag>
:使用先前检索到的存储库和标记信息完成 IBM Cloud Container Registry 区域、命名空间、图像和要提取的图像的标记名称。default/<image>:<tag>
: 输入从 IBM Cloud Container Registry 标记的映像创建的内部映像流的信息。 在default
项目中创建此映像流,如果未指定项目,那么该项目也是创建映像流的项目。<image>:<tag>
的值通常与先前检索的值相匹配。--reference-policy=local
: 将此值设置为local
,以便将来自 IBM Cloud Container Registry 的映像副本导入到内部注册表的本地高速缓存中,并将其作为映像流提供给集群的项目。 如果不包含此值,那么当您在部署中使用映像流时,该映像流将返回到 IBM Cloud Container Registry,因此需要项目中的凭证。--scheduled
: 设置此可选选项以设置将映像从 IBM Cloud Container Registry 定期导入到内部注册表中。 默认频率为 15 分钟。 有关更多信息,请参阅 Red Hat OpenShift 文档。
-
验证是否已创建映像流。
oc get imagestreams
-
验证映像流是否已成功从 IBM Cloud Container Registry中拉取映像。 在输出中,检查 最新标记自 映像是否与
* <region>.icr.io/<namespace>/<image>@<digest>
映像匹配。oc describe is/<imagestream>
示例输出
NAME: <imagestream> Namespace: default Created: 2 days ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2020-03-31T09:41:36Z Image Repository: image-registry.openshift-image-registry.svc:5000/default/ant1 Image Lookup: local=false Unique Images: 1 Tags: 1 latest tagged from <region>.icr.io/<namespace>/<image>:<tag> * <region>.icr.io/<namespace>/<image>@<digest> 2 days ago
现在,开发者可以 在应用程序部署中使用映像流。 映像已成功从内部注册表中本地拉取的映像进行构建。 您不需要将项目中的映像拉取私钥设置为 IBM Cloud Container Registry,因为映像流是集群的本地映像流。
在内部注册表中设置构建以将映像推送到 IBM Cloud Container Registry
在 Red Hat OpenShift on IBM Cloud 集群中创建 构建 时,可以在 IBM Cloud Container
Registry中 设置内部注册表以将映像推送到外部存储库。 缺省情况下,集群的 default
项目中的映像拉取私钥仅具有从
IBM Cloud Container Registry拉取映像的读访问权。 要推送映像,必须添加具有写访问权的私钥。
-
切换到
default
项目。oc project default
-
遵循设置 IBM Cloud IAM API 密钥的步骤 具有
Reader
和Writer
服务访问角色,可从icr.io
注册表中提取映像并将其推送到注册表。请记住,有权访问项目的任何用户都可以使用此私钥将映像推送到专用注册表。 您可能想要设置 日志记录和监视 工具,以便可以观察谁在集群中执行哪些操作。
-
对要将映像推送到的每个
icr.io
区域重复上一步。 -
将私钥添加到构建服务帐户,并引用构建配置文件中的私钥。 有关更多信息,请参阅 Red Hat OpenShift 文档。
-
通过将刚刚创建的私钥链接到集群中使用的所有构建的
builder
角色,将该私钥添加到构建服务帐户。oc secrets link builder <secret_name>
-
列出构建配置,并记下要授予对 IBM Cloud Container Registry的推送和拉取访问权的配置。
oc get bc
-
设置构建配置的映像推送私钥,以使用您刚刚通过
Writer
服务访问权 IBM Cloud Container Registry创建的私钥。oc set build-secret --push bc/<build_config_name> <secret_name>
-
设置要从要从中拉取初始构建映像的注册表拉取的构建配置的映像拉取私钥。 例如,如果源映像位于 IBM Cloud Container Registry 存储库中,那么您可以使用刚刚通过
Reader
服务访问 IBM Cloud Container Registry 创建的私钥。oc set build-secret --pull bc/<build_config_name> <secret_name>
-
-
更新构建服务帐户和构建配置文件以推送到 IBM Cloud Container Registry之后,请重新启动构建。
oc start-build <build_name>
-
获取构建 pod 的名称,例如
<build>-2-build
。oc get pods
-
检查构建的日志,并记下推送映像的位置。
oc logs <build_pod>
成功的映像推送日志的示例。
... Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash> Push successful
-
请检查专用注册表中的映像,以确认是否已创建该映像。
ibmcloud cr image list
示例输出
Repository Tag Digest Namespace Created Size Security status <region>.icr.io/<namespace>/<build_name> latest <digest> <namespace> 2 minutes ago 182 MB 33 Issues
现在,您的 Red Hat OpenShift 构建可以将映像从 IBM Cloud Container Registry拉取并推送到映像。
使用 IBM Cloud Container Registry
缺省情况下,Red Hat OpenShift on IBM Cloud 集群设置为从 default
项目中的远程专用 IBM Cloud Container Registry icr.io
域中拉取映像。 如果要将存储在 IBM Cloud Container Registry 中的映像用于其他项目,那么可以将该映像拉取到映像流中的内部注册表,或者为每个项目中的每个全局和区域注册表创建映像拉取私钥。
要将映像导入到内部注册表中: 请参阅 将映像从 IBM Cloud Container Registry 导入到内部注册表映像流中。
直接从外部 IBM Cloud Container Registry 中拉取映像: 请参阅以下主题。
- 了解如何授权集群从注册表中拉取映像。
- 复制
all-icr-io
秘密 来自default
project 到您想要从中提取图像的项目。 - 创建您自己的映像拉取私钥。
- 在部署配置或项目服务账户中 添加图像拉取秘钥。
了解如何授权群集从专用注册表中提取映像
为了从注册表中拉取映像,Red Hat OpenShift on IBM Cloud 集群会使用一种特殊类型的 Kubernetes 私钥,即 imagePullSecret
。 此映像拉取私钥存储了用于访问容器注册表的凭证。
容器注册表可以是:
- 您自己的 IBM Cloud Container Registry中的专用名称空间。
- IBM Cloud Container Registry 中属于其他 IBM Cloud 帐户的专用名称空间。
- 任何其他专用注册表,例如 Docker。
但是,缺省情况下,集群设置为仅从 IBM Cloud Container Registry中的帐户名称空间拉取映像,并将容器从这些映像部署到集群中的 default
Red Hat OpenShift 项目。 如果需要在集群的其他项目中或从其他容器注册表中拉取映像,那么必须设置自己的映像拉取私钥。
缺省映像拉取私钥设置
通常,Red Hat OpenShift on IBM Cloud 集群设置为仅从 default
Red Hat OpenShift 项目的所有 IBM Cloud Container Registry icr.io
域中提取映像。 查看以下常见问题解答,了解如何在其他 Red Hat OpenShift 项目或帐户中提取图像、限制提取访问权限,或者为什么您的集群可能没有默认的图像提取密钥。
- 如何设置我的集群才能从
default
Red Hat OpenShift 项目中提取图像? - 创建集群时,集群会具有 IBM Cloud IAM 服务标识,此标识已被授予对 IBM Cloud Container Registry 的 IAM 读取者服务访问角色策略。 在存储于集群的映像拉取私钥中的非到期 API 密钥中,会模拟服务标识凭证。 图像提取秘密会被添加到
default
Kubernetes 命名空间和default
服务账户中该 Red Hat OpenShift 项目的秘密列表中。 通过使用映像拉取私钥,部署可以从 全局和区域 IBM Cloud Container Registry 拉取映像 (只读访问),以在default
Red Hat OpenShift 项目中部署容器。
- 全局注册表安全地存储 IBM提供的公共映像。 您可以在部署中引用这些公共映像,而不是对存储在每个区域注册表中的映像具有不同的引用。
- 区域注册表用于安全地存储您自己的专用 Docker 映像。
- 如果我在
default
Red Hat OpenShift 项目中没有映像拉取私钥怎么办? - 您可以通过 登录到集群 并运行
oc get secrets -n default | grep "icr-io"
来检查映像拉取私钥。 如果未列出icr
私钥,那么创建集群的人员可能没有对 IAM 中的 IBM Cloud Container Registry 的必需许可权。 请参阅 更新现有群集以使用 API 密钥映像提取密钥。 - 我能否限制对某个地区注册表的访问权限?
- 可以,可以编辑服务标识的现有 IAM 策略,以将读取者服务访问角色限制为只能访问该区域注册表或注册表资源(例如,名称空间)。 必须为 IBM Cloud 启用 IBM Cloud Container Registry IAM 策略后,才能定制注册表 IAM 策略。
要使注册表凭证更安全,请让集群管理员 启用集群中的密钥管理服务提供者,以加密集群中的 Kubernetes 私钥,例如用于存储注册表凭证的映像拉取私钥。
- 我能否在除
default
以外的 Red Hat OpenShift 项目中拉取映像? - 缺省情况下不能。 通过使用默认的群集设置,你可以将存储在 IBM Cloud Container Registry 命名空间中的任何映像的容器部署到群集的
default
Red Hat OpenShift 项目中。 要在任何其他 Red Hat OpenShift 项目或其他 IBM Cloud 账户中使用这些图片,您可以选择复制或创建自己的图片提取秘密。 - 我可以从不同的 IBM Cloud 账户中提取图片吗?
- 可以,在要使用的 IBM Cloud 帐户中创建 API 密钥。 然后,在要从 IBM Cloud 帐户中提取映像的每个集群的每个项目中,创建保存 API 密钥的私钥。 如需了解更多信息,请 参考这个使用授权服务 ID API 密钥的示例。
要使用非 IBM Cloud 注册表(如 Docker),请参阅访问存储在其他专用注册表中的映像。
- API 密钥必须是服务 ID 的密钥吗? 如果我的账户服务 ID 达到上限,会发生什么情况?
- 缺省集群设置会创建服务标识,用于将 IBM Cloud IAM API 密钥凭证存储在映像拉取私钥中。 但是,您还可以为单个用户创建 API 密钥,并将这些凭证存储在一个映像拉取私钥中。 如果达到 服务 ID 的 IAM 限制,创建的群集将没有服务 ID 和映像拉取密钥,默认情况下也无法从
icr.io
注册域拉取映像。 您必须 创建自己的映像拉取私钥,但创建时须使用单个用户(例如功能标识,而不是 IBM Cloud IAM 服务标识)的 API 密钥。 - 我看到区域注册表域和所有注册表域的映像拉取私钥。 我使用哪一个?
- 先前,Red Hat OpenShift on IBM Cloud 为每个区域公共
icr.io
注册表域创建了单独的映像拉取私钥。 现在,所有区域的所有公共和专用icr.io
注册表域都存储在集群的default
Kubernetes 项目中自动创建的单个all-icr-io
映像拉取私钥中。
对于集群中其他 Kubernetes 名称空间中用于从专用注册表拉取容器映像的工作负载,现在只能将 all-icr-io
映像拉取私钥复制到该 Kubernetes 项目。 然后,在服务帐户或部署中指定 all-icr-io
私钥。 您无需再复制与映像的区域注册表匹配的映像拉取私钥。 此外,请记住,对于不需要认证的公共注册表,您不需要映像拉取私钥。
- 我在另一个 Red Hat OpenShift 项目中复制或创建了一个图像提取秘密后,我的工作就完成了吗?
- 还没完。 容器必须有权使用所创建的私钥来拉取映像。 可以将映像拉取私钥添加到该名称空间的服务帐户,或者在每个部署中引用此私钥。 有关指示信息,请参阅使用映像拉取私钥部署容器。
到 icr.io
注册表的专用网络连接
当您设置 IBM Cloud 帐户以使用服务端点时,可以使用专用网络连接将映像推送到 IBM Cloud Container Registry并从中提取映像。
我需要执行哪些操作来设置集群以使用与 icr.io
注册表的专用连接?
- 为 IBM Cloud 基础架构帐户启用 虚拟路由器功能(VRF),以便您可以使用 IBM Cloud Container Registry 私有云服务端点。 要启用 VRF,请参阅 启用 VRF。
要检查是否已启用 VRF,请使用
ibmcloud account show
命令。 - 启用 IBM Cloud 帐户以使用服务端点。
IBM Cloud Container Registry 自动使用私有云服务端点。 您无需为 Red Hat OpenShift on IBM Cloud 集群启用私有云服务端点。
更新现有集群以使用 API 密钥映像拉取私钥
新的 Red Hat OpenShift on IBM Cloud 集群在 图像拉取机密中存储 API 密钥,以授权访问 IBM Cloud Container Registry。 使用这些映像拉取私钥时,可以通过存储在 icr.io
注册表域中的映像来部署容器。 如果未使用私钥创建集群,那么可以将映像拉取私钥添加到集群。
准备工作
-
确保您具有以下许可权: IBM Cloud IAM 操作员或管理员 平台访问角色 Red Hat OpenShift on IBM Cloud。 账户所有者可以通过运行以下命令赋予你该角色。
ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
-
IBM Cloud IBM Cloud Container Registry 的 IAM 管理员平台访问角色,跨越所有区域和资源组。 该策略不能作用于特定区域或资源组。 账户所有者可以通过运行以下命令赋予你该角色。
验证秘密是否已成功创建
ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
-
如果帐户 限制服务标识创建,请在控制台 (API 或 CLI 中的
iam-identity
) 中将 服务标识创建者 角色添加到 Identity and Access Management。 -
如果帐户 限制 API 密钥创建,请在控制台 (API 或 CLI 中的
iam-identity
) 中将 用户 API 密钥创建者 角色添加到 Identity and Access Management。
更新映像拉取私钥
在 default
Kubernetes 命名空间中更新群集镜像拉取秘密。
-
获取集群标识。
ibmcloud oc cluster ls
-
运行以下命令以创建集群的服务标识,并为该服务标识分配 IBM Cloud Container Registry的 IAM 读者 服务访问角色。 此命令还会创建 API 密钥以模拟服务标识凭证,并将 API 密钥存储在集群中的 Kubernetes 映像拉取私钥中。 图像提取秘诀在
default
Red Hat OpenShift 项目中。ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
运行此命令时,IAM 凭证和映像拉取私钥的创建操作将启动,并且可能需要一些时间才能完成。 在创建映像拉取机密之前,无法部署从 IBM Cloud Container Registry
icr.io
域拉取映像的容器。 -
验证是否在集群中创建了映像拉取私钥。
oc get secrets | grep icr-io
示例输出
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
更新 容器部署 以从
icr.io
域名中提取映像。 -
可选:如果您有防火墙,请确保对于使用的域,允许出站网络流量流至注册表子网。
-
使用下列其中一个选项来完成设置。
- 要从 Red Hat OpenShift 项目中提取
default
以外的图像,或从其他 IBM Cloud 账户中提取图像,请 复制或创建另一个图像提取密文。 - 要将映像拉取私钥限制为只能访问特定注册表资源(例如,名称空间或区域),请执行以下操作:
- 要从 Red Hat OpenShift 项目中提取
使用图像提取秘密访问外部私人注册表中的图像
在群集中设置自己的镜像拉取秘钥,将容器部署到 Red Hat OpenShift 项目( default
除外),使用存储在其他 IBM Cloud 账户中的镜像,或使用存储在外部私有注册表中的镜像。 此外,您还可以创建自己的映像拉取私钥来应用 IAM 访问策略,以将许可权作用对象限制为特定注册表映像名称空间或操作(例如,push
或 pull
)。
创建映像拉取私钥后,容器必须使用该私钥才有权从注册表中拉取映像。 您可以将图像拉取秘钥添加到项目的服务账户中,或在每次部署中引用该秘钥。 有关指示信息,请参阅使用映像拉取私钥部署容器。
图像提取机密仅对 Red Hat OpenShift 项目有效。 对要部署容器的每个名称空间,重复这些步骤。
开始之前:
要使用您自己的映像拉取私钥,请从以下选项中进行选择:
- 将镜像拉取密钥 从默认的 Red Hat OpenShift 项目复制到集群中的其他项目。
- 创建新的 IAM API 密钥凭证并将其存储在映像拉取私钥中,以访问其他 IBM Cloud 帐户中的映像,或应用 IAM 策略来限制对特定注册表域或名称空间的访问权。
- 创建映像拉取私钥以访问外部专用注册表中的映像。
如果您已经在项目中创建了要在部署中使用的映像 pull secret,请参阅 通过使用创建的 imagePullSecret
部署容器。
复制现有映像拉取私钥
您可以将图像拉取秘钥(如为 default
Red Hat OpenShift 项目自动创建的秘钥)复制到群集中的其他项目。 如果要为该项目使用不同的 IBM Cloud IAM API 密钥凭证,例如限制对特定项目的访问,或从其他 IBM Cloud 账户提取图像,请 创建图像提取密钥。
-
列出集群中可用的 Red Hat OpenShift 项目,或创建一个项目使用。
oc get projects
示例输出
default Active ibm-cert-store Active ibm-system Active kube-public Active kube-system Active
创建项目
oc new-project <project_name>
-
为 IBM Cloud Container Registry 列出
default
Red Hat OpenShift 项目中的现有图像提取秘密。oc get secrets -n default | grep icr-io
示例输出
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
将
default
项目中的all-icr-io
图像提取秘密复制到您选择的项目中。 新的图像提取秘密被命名为<project_name>-icr-<region>-io
。oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f -
-
验证私钥是否已成功创建。
oc get secrets -n <project_name> | grep icr-io
-
要部署容器,请向每个部署或项目的服务帐户 添加映像拉取私钥,以便项目中的任何部署都可以从注册表拉取映像。
使用不同的 IAM API 密钥凭证创建映像拉取私钥
可以将 IBM Cloud IAM 访问策略分配给用户或服务标识,以将许可权作用对象限制为特定注册表映像名称空间或操作(例如,push
或 pull
)。 然后,创建 API 密钥并将这些注册表凭证存储在集群的映像拉取私钥中。
例如,要访问其他 IBM Cloud 帐户中的映像,请创建 API 密钥,用于存储该帐户中用户或服务标识的 IBM Cloud Container Registry 凭证。 然后,在群集账户中,将 API 密钥凭证保存在每个群集和群集项目的图像拉取秘钥中。
以下步骤创建 API 密钥,用于存储 IBM Cloud IAM 服务标识的凭证。 您可能希望为具有对 IBM Cloud 的 IBM Cloud Container Registry IAM 服务访问策略的用户标识创建 API 密钥,而不使用服务标识。 但是,请确保用户是功能标识,或者有计划来应对用户离开的情况,以便集群始终可以访问注册表。
-
列出集群中可用的 Red Hat OpenShift 项目,或创建一个项目用于从注册表映像部署容器。
oc get projects
示例输出
default Active ibm-cert-store Active ibm-system Active kube-public Active kube-system Active
创建项目
oc new-project <project_name>
-
为集群创建 IBM Cloud IAM 服务标识,此标识用于映像拉取私钥中的 IAM 策略和 API 密钥凭证。 请务必为服务 ID 提供有助于以后检索服务 ID 的描述,例如包括群集和项目名称。
ibmcloud iam service-id-create <cluster_name>-<project>-id --description "Service ID for IBM Cloud Container Registry in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
-
为集群服务标识创建定制 IBM Cloud IAM 策略,以授予对 IBM Cloud Container Registry 的访问权。
ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
cluster_service_ID
- 必需。 替换为之前为 Kubernetes 集群创建的
<cluster_name>-<kube_namespace>-id
服务 ID。 --service-name container-registry
- 必需。 输入
container-registry
,以便 IAM 策略可用于 IBM Cloud Container Registry。 --roles <service_access_role>
- 必需。 输入 IBM Cloud Container Registry 的 服务访问角色,以确定服务 ID 的访问范围。 可能的值为
Reader
(读取者)、Writer
(写入者)和Manager
(管理者)。 --region <IAM_region>
- 可选。 如果要将访问策略的作用域限定为特定 IAM 区域,请以逗号分隔列表格式输入各区域。 可能的值为
global
和 本地注册表区域。 --resource-type namespace --resource <registry_namespace>
- 可选。 如果要限制只访问某些 IBM Cloud Container Registry 命名空间 中的图像,请输入
namespace
作为资源类型,并指定<registry_namespace>
。 要列出注册表名称空间,请运行ibmcloud cr namespaces
。
-
为服务标识创建 API 密钥。 将 API 密钥命名为与服务 ID 相似的名称,并包含之前创建的服务 ID、
<cluster_name>-<kube_namespace>-id
. 请确保为 API 密钥提供描述,以帮助您日后检索该密钥。ibmcloud iam service-api-key-create <cluster_name>-<project>-key <cluster_name>-<project>-id --description "API key for service ID <service_id> in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
-
从上一个命令的输出中检索 API 密钥值。
Please preserve the API key! It can't be retrieved after it's created. Name <cluster_name>-<kube_namespace>-key Description key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test Bound To crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh Created At 2019-02-01T19:06+0000 API Key i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1 Locked false UUID ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4
-
在群集项目中创建图像拉取秘钥,以存储 API 密钥凭证。 对要从中拉取映像的每个
icr.io
域的每个集群的每个项目重复此步骤。oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
--namespace <project>
- 必需。 指定用于服务 ID 名称的群集 Red Hat OpenShift 项目。
<secret_name>
- 必需。 输入映像拉取私钥的名称。
--docker-server <registry_URL>
- 必需。 设置在其中设置注册表名称空间的映像注册表的 URL。 有关可用域,请参阅 本地区域。
--docker-username iamapikey
- 必需。 输入用户名以登录您的私人注册表。 如果使用 IBM Cloud Container Registry,请输入
iamapikey
。 --docker-password <token_value>
- 必需。 输入您之前检索到的
API Key
的值。 --docker-email <docker-email>
- 必需。 如果您有 Docker 电子邮件地址,请输入该地址。 如果没有,请输入一个虚构的电子邮件地址,如
a@b.c
。 此电子邮件对于创建 Kubernetes 私钥是必需的,但在创建后不会再使用此电子邮件。
-
验证私钥是否已成功创建。 将
<project>
替换为您创建图像提取密文的project
。oc get secrets --namespace <project>
访问存储在其他专用注册表中的映像
如果您已经拥有专用注册表,那么必须将相应的注册表凭证存储在 Kubernetes 映像拉取私钥中,并在配置文件中引用此私钥。
开始之前:
要创建映像拉取私钥,请执行以下操作:
-
创建 Kubernetes 私钥以用于存储专用注册表凭证。
oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
--namespace <project>
- 必需。 集群的 Red Hat OpenShift 项目,您希望在该项目中使用秘密并部署容器。 要列出集群中的可用项目,请运行
oc get projects
。 <secret_name>
- 必需。 要用于映像拉取私钥的名称。
--docker-server <registry_URL>
- 必需。 要在其中存储专用映像的注册表的 URL。
--docker-username <docker_username>
- 必需。 登录私人注册表的用户名。
--docker-password <token_value>
- 必需。 用于登录到专用注册表的密码,例如令牌值。
--docker-email <docker-email>
- 必需。 如果您有 Docker 电子邮件地址,请输入该地址。 如果没有,请输入一个虚构的电子邮件地址,如
a@b.c
。 此电子邮件对于创建 Kubernetes 私钥是必需的,但在创建后不会再使用此电子邮件。
-
验证私钥是否已成功创建。 将
<project>
替换为在其中创建映像拉取私钥的项目的名称。oc get secrets --namespace <project>
使用映像拉取私钥来部署容器
您可以在 pod 部署中定义镜像拉取密钥,也可以将镜像拉取密钥存储在 Kubernetes 服务账户中,这样所有未在项目中指定 Kubernetes 服务账户的部署都可以使用该密钥。
要规划如何在集群中使用映像拉取私钥,请在以下选项之间进行选择。
- 请参阅 pod 部署中的图像拉取秘钥:如果不想默认授予项目中所有 pod 对注册表的访问权限,请使用此选项。 开发者可以 在每个必须访问注册表的 pod 部署中包含映像拉取私钥。
- 在 Kubernetes 服务账户中存储图像拉取密钥:使用此选项可为所选 Red Hat OpenShift 项目中的所有部署授予访问注册表中映像的权限。 要将映像拉取私钥存储在 Kubernetes 服务帐户中,请使用 以下步骤。
在 Kubernetes 服务账户中为选定项目存储图像提取密文
每个 Red Hat OpenShift 项目都有一个名为 default
的 Kubernetes 服务账户。 在项目中,您可以将映像拉取私钥添加到此服务帐户,以授予 pod 从注册表拉取映像的访问权。 未指定服务账户的部署会自动为 Red Hat OpenShift 项目使用 default
服务账户。
-
检查 default 服务帐户是否已存在映像拉取私钥。
oc describe serviceaccount default -n <project_name>
当
<none>
显示在图像提取秘密条目中时,表示不存在图像提取秘密。 -
将映像拉取私钥添加到 default 服务帐户。
-
示例命令,用于在未定义图像调用密码时添加图像调用密码。
oc patch -n <project_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
-
示例命令,用于在已定义图像调用密码的情况下添加图像调用密码。
oc patch -n <project_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
-
-
验证映像拉取私钥是否已添加到 default 服务帐户。
oc describe serviceaccount default -n <project_name>
示例输出
Name: default Namespace: <namespace_name> Labels: <none> Annotations: <none> Image pull secrets: <image_pull_secret_name> Mountable secrets: default-token-sh2dx Tokens: default-token-sh2dx Events: <none>
如果 映像拉取私钥 显示
<secret> (not found)
,请通过运行oc get secrets -n project
来验证映像拉取私钥是否存在于与服务帐户相同的项目中。 -
创建名为
mypod.yaml
的 pod 配置文件,以从注册表中的 映像 部署容器。apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod-container image: <region>.icr.io/<project>/<image>:<tag>
-
通过应用
mypod.yaml
配置文件在集群中创建 pod。oc apply -f mypod.yaml
设置集群以拉取授权软件
您可以设置 Red Hat OpenShift on IBM Cloud 集群以拉取授权软件,授权软件是受保护的容器映像的集合,这些映像包装在由 IBM 许可您使用的 Helm chart 中。 授权软件存储在特殊的 IBM Cloud Container Registry cp.icr.io
域中。 要访问此域,必须为群集创建一个带有权限密钥的镜像拉取密钥,并将此镜像拉取密钥添加到要部署此权限软件的每个项目的 Kubernetes 服务账户中。
开始之前: 访问 Red Hat OpenShift 集群。
-
获取授权软件库的权利密钥。
- 登录 MyIBM.com,滚动到容器软件库部分。 单击查看库。
- 在访问容器软件 > 权利密钥页面中,单击复制密钥。 此密钥授权访问容器软件库中的所有授权软件。
-
在要部署有权容器的项目中,创建一个镜像拉取密文,以便访问
cp.icr.io
有权注册表。 使用先前检索到的 权利密钥 作为--docker-password
值。 有关更多信息,请参阅访问存储在其他专用注册表中的映像。oc create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <project>
-
将图像拉取密钥添加到命名空间的服务账户中,以便项目中的任何容器都能使用权限密钥拉取有权限的图像。 有关更多信息,请参阅使用映像拉取私钥部署容器。
oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
-
在项目中创建 pod,从有权注册表中的映像构建容器。
oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1
-
通过验证 pod 是否处于 Running 状态,检查是否能够基于授权映像成功构建容器。
oc get pod <pod_name> -n <project>
想知道接下来要做什么吗? 您可以设置授权 Helm chart 存储库,其中存储了包含授权软件的 Helm chart。 如果已在集群中安装 Helm,请运行 helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled
。
将专用注册表添加到全局拉取私钥
RHEL 工作节点
在只使用 RHEL 工作节点的群集中,可以设置一个全局映像提取秘密,群集中的每个工作节点都可以使用该秘密从私有注册表中提取映像。
缺省情况下,Red Hat OpenShift on IBM Cloud 集群具有以下注册表的全局映像拉取私钥,因此可以部署缺省 Red Hat OpenShift 组件。
cloud.openshift.com
quay.io
registry.connect.redhat.com
registry.redhat.io
请勿将全局拉取私钥替换为不具有缺省 Red Hat 注册表凭证的拉取私钥。 如果这样做,群集中安装的默认 Red Hat OpenShift 组件(如 OperatorHub, 组件)可能会失败,因为它们无法从这些注册表中提取映像。
开始之前:
- 下载
jq
JSON 处理器命令行包。 您可以使用jq
将缺省全局拉取私钥的 JSON 值与要添加的专用注册表拉取私钥相结合。 - 访问 Red Hat OpenShift 集群。
要添加专用注册表,请在 openshift-config
项目中编辑全局 pull-secret
。
-
创建用于保存用于访问专用注册表的凭证的私钥值,并将解码后的私钥值存储在 JSON 文件中。 创建私钥值时,凭证将自动编码为 base64。 通过使用
--dry-run
选项,将仅创建私钥值,并且不会在集群中创建任何私钥对象。 然后,解码后的私钥值将存储在 JSON 文件中,以便稍后在全局拉取私钥中使用。oc create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email> --dry-run=true --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > myregistryconfigjson
--namespace <project>
- 必需。 集群的 Red Hat OpenShift 项目,您希望在该项目中使用秘密并部署容器。 要列出集群中的可用项目,请运行
oc get ns
。 <secret_name>
- 必需。 要用于映像拉取私钥的名称。
--docker-server <registry_URL>
- 必需。 要在其中存储专用映像的注册表的 URL。
--docker-username <docker_username>
- 必需。 登录私人注册表的用户名。
--docker-password <token_value>
- 必需。 用于登录到专用注册表的密码,例如令牌值。
--docker-email <docker-email>
- 必需。 如果您有 Docker 电子邮件地址,请输入该地址。 如果没有,请输入一个虚构的电子邮件地址,如
a@b.c
。 此电子邮件对于创建 Kubernetes 私钥是必需的,但在创建后不会再使用此电子邮件。 --dry-run=true
- 包含此选项以仅创建私钥值,而不创建私钥对象并将其存储在集群中。
--output="jsonpath={.data.\.dockerconfigjson}"
- 仅从 Kubernetes 私钥的数据部分获取
.dockerconfigjson
值。 | base64 --decode > myregistryconfigjson
- 将解码后的密钥数据下载到本地
myregistryconfigjson
文件。
-
检索缺省全局拉取私钥的解码私钥值,并将该值存储在
dockerconfigjson
文件中。oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson
-
将下载的专用注册表拉取私钥
myregistryconfigjson
文件与缺省全局拉取私钥dockerconfigjson
文件组合在一起。jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
-
使用组合的
dockerconfigjson-merged
文件更新全局拉取私钥。oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged
-
验证全局拉取私钥是否已更新。 检查专用注册表和每个缺省 Red Hat 注册表是否在以下命令的输出中。
oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
示例输出
{ "auths": { "cloud.openshift.com": { "auth": "<encoded_string>", "email": "email@example.com" }, "quay.io": { "auth": "<encoded_string>", "email": "email@example.com" }, "registry.connect.redhat.com": { "auth": "<encoded_string>", "email": "email@example.com" }, "registry.redhat.io": { "auth": "<encoded_string>", "email": "email@example.com" }, "<private_registry>": { "username": "iamapikey", "password": "<encoded_string>", "email": "email@example.com", "auth": "<encoded_string>" } } }
-
要选取全局配置更改,请重新装入集群中的所有工作程序节点。
-
记下集群中工作程序节点的 标识。
ibmcloud oc worker ls -c <cluster_name_or_ID>
-
对于经典集群 重新装入每个工作程序节点。 您可以通过包含多个
-w
选项来重新装入多个工作程序节点,但请确保为应用程序同时运行足够多的工作程序节点以避免中断。ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2>
-
对于 VPC 集群 替换每个工作程序节点。 开始之前,请确保集群具有足够的其他工作程序节点,以便可以重新调度 pod 并继续运行。
ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID>
-
-
在工作程序节点恢复为正常状态后,请验证是否在工作程序节点上更新了全局拉取私钥。
-
启动调试 pod 以登录到工作程序节点。 使用先前为
<node_name>
检索的 专用 IP。oc debug node/<node_name>
-
将根目录切换到主机,以便您可以查看工作程序节点上的文件。
chroot /host
-
验证 Docker 配置文件是否具有与您设置的全局拉取私钥匹配的注册表凭证。
vi /.docker/config.json
-
更新全局拉动秘钥
RHCOS 工作节点 RHEL 工作节点
在使用 RHCOS Worker 或 RHCOS 和 RHEL Worker 组合的群集中,可以完成以下步骤更新 Red Hat OpenShift on IBM Cloud 群集中的全局拉取密钥。
缺省情况下,Red Hat OpenShift on IBM Cloud 集群具有以下注册表的全局映像拉取私钥,因此可以部署缺省 Red Hat OpenShift 组件。
cloud.openshift.com
quay.io
registry.connect.redhat.com
registry.redhat.io
请勿将全局拉取私钥替换为不具有缺省 Red Hat 注册表凭证的拉取私钥。 如果这样做,群集中安装的默认 Red Hat OpenShift 组件(如 OperatorHub, 组件)可能会失败,因为它们无法从这些注册表中提取映像。
- 创建一个秘密,其中包含要使用的注册表的凭据。
示例oc create secret docker-registry docker-auth-secret \ --docker-server=REGISTRY \ --docker-username=USERNAME \ --docker-password=PASSWORD \ --namespace kube-system
create secret
命令。oc create secret docker-registry docker-auth-secret \ --docker-server=REGISTRY \ --docker-username=cp \ --docker-password=ENTITLEMENT-KEY \ --namespace kube-system
- 创建DaemonSet,以便在所有工作节点上应用秘密。
cat << EOF | oc create -f - apiVersion: apps/v1 kind: DaemonSet metadata: name: update-docker-config namespace: kube-system labels: app: update-docker-config spec: selector: matchLabels: name: update-docker-config template: metadata: labels: name: update-docker-config spec: initContainers: - command: ["/bin/sh", "-c"] args: - > echo "Checking if RHEL or RHCOS host"; [[ -s /docker-config/.docker/config.json ]] && CONFIG_PATH=/docker-config/.docker || CONFIG_PATH=/docker-config/root/.docker; echo "Backing up or restoring config.json"; [[ -s \$CONFIG_PATH/config.json ]] && cp \$CONFIG_PATH/config.json \$CONFIG_PATH/config.json.bak || cp \$CONFIG_PATH/config.json.bak \$CONFIG_PATH/config.json; echo "Merging secret with config.json"; /host/usr/bin/jq -s '.[0] * .[1]' \$CONFIG_PATH/config.json /auth/.dockerconfigjson > \$CONFIG_PATH/config.tmp; mv \$CONFIG_PATH/config.tmp \$CONFIG_PATH/config.json; echo "Sending signal to reload crio config"; pidof crio; kill -1 \$(pidof crio) image: icr.io/ibm/alpine:latest imagePullPolicy: IfNotPresent name: updater resources: {} securityContext: privileged: true volumeMounts: - name: docker-auth-secret mountPath: /auth - name: docker mountPath: /docker-config - name: bin mountPath: /host/usr/bin - name: lib64 mountPath: /lib64 containers: - resources: requests: cpu: 0.01 image: icr.io/ibm/alpine:latest name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done hostPID: true volumes: - name: docker-auth-secret secret: secretName: docker-auth-secret - name: docker hostPath: path: / - name: bin hostPath: path: /usr/bin - name: lib64 hostPath: path: /lib64 hostPathType: Directory EOF
- 验证 pod 是否正在运行。
oc get daemonset -n kube-system update-docker-config
更新 IBM Cloud Kubernetes Service containerd 定制注册表配置
通过 Kubernetes V 1.22 或更高版本,可以使用工作程序节点上的 containerd 配置文件来配置从容器注册表中拉取。 您可以使用 daemonset 来更新集群中所有节点的配置,这将防止在工作程序节点重新装入或添加新工作程序时擦除配置。
用于更新 containerd 定制注册表配置的示例 daemonset
使用示例 YAML 文件来定义在所有工作程序节点上运行的 daemonset,以设置或更新 containerd 注册表主机配置并安装到相应的 containerd 注册表路径。
此示例为 dockerhub 设置以下注册表主机配置。 此注册表主机配置已提供并在工作程序供应阶段自动配置。 在部署之后以及在工作程序节点重新装入或重新启动之后,init
容器会在每个工作程序节点上初始化 hosts.toml
。
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
YAML 文件示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
matchLabels:
name: containerd-dockerhub-registry-config
template:
metadata:
labels:
name: containerd-dockerhub-registry-config
spec:
initContainers:
- image: alpine:3.13.6
name: containerd-dockerhub-registry-config
command:
- /bin/sh
- -c
- |
#!/bin/sh
set -uo pipefail
cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
EOF
volumeMounts:
- mountPath: /etc/containerd/certs.d/docker.io/
name: dockerhub-registry-config
containers:
- name: pause
image: "us.icr.io/armada-master/pause:3.5"
imagePullPolicy: IfNotPresent
volumes:
- name: dockerhub-registry-config
hostPath:
path: /etc/containerd/certs.d/docker.io/
有关更新 containerd 注册表主机配置的更多信息,请参阅 containerd 文档。