5.4. 使用镜像 pull secret
如果您使用 OpenShift 镜像 registry,并且从位于同一项目中的镜像流拉取 (pull),则您的 Pod 服务帐户应已具备正确的权限,且无需额外操作。
然而,对于其他场景,例如在 OpenShift Container Platform 项目间或从安全 registry 引用镜像,则还需其他配置步骤。
您可以从 Red Hat OpenShift Cluster Manager 获取镜像 pull secret。此 pull secret 名为 pullSecret
。
您可以使用此 pull secret 来使用所含授权机构提供的服务进行身份验证,这些服务包括为 OpenShift Container Platform 组件提供容器镜像的 Quay.io 和 registry.redhat.io。
5.4.1. 允许 pod 在项目间引用镜像
使用 OpenShift 镜像 registry 时,要允许 project-a
中的 pod 引用 project-b
中的镜像,project-a
中的服务帐户必须绑定到 project-b
中的 system:image-puller
角色:
在创建 pod 服务帐户或命名空间时,请等待服务帐户置备了 docker pull secret;如果在其服务帐户被完全置备前创建 pod,则 pod 无法访问 OpenShift 镜像 registry。
流程
要允许
project-a
中的 pod 引用project-b
中的镜像,请将project-a
中的服务帐户绑定到project-b
中的system:image-puller
角色。$ oc policy add-role-to-user \ system:image-puller system:serviceaccount:project-a:default \ --namespace=project-b
添加该角色后,
project-a
中引用默认服务帐户的 pod 能够从project-b
拉取(pull)镜像。要允许访问
project-a
中的任意服务帐户,请使用组:$ oc policy add-role-to-group \ system:image-puller system:serviceaccounts:project-a \ --namespace=project-b
5.4.2. 允许 Pod 引用其他安全 registry 中的镜像
要从其他私有或安全 registry 中拉取安全容器,您必须从容器客户端凭证(如 Docker 或 Podman)创建一个 pull secret,并将其添加到您的服务帐户中。
Docker 和 Podman 都使用配置文件来存储身份验证详情,以登录到安全或不安全的 registry:
-
docker :默认情况下,Docker 使用
$HOME/.docker/config.json
。 -
Podman: 默认情况下,Podman 使用
$HOME/.config/containers/auth.json
。
如果您之前已登录到安全或不安全的 registry,则这些文件会存储您的身份验证信息。
如果 Docker 和 Podman 凭证文件和关联的 pull secret 都包含对同一 registry 的多个引用,如 quay.io
和 quay.io/<example_repository>
。但是,Docker 和 Podman 都不支持完全相同的 registry 路径的多个条目。
config.json
文件示例
{ "auths":{ "cloud.openshift.com":{ "auth":"b3Blb=", "email":"you@example.com" }, "quay.io":{ "auth":"b3Blb=", "email":"you@example.com" }, "quay.io/repository-main":{ "auth":"b3Blb=", "email":"you@example.com" } } }
pull secret 示例
apiVersion: v1 data: .dockerconfigjson: ewogICAiYXV0aHMiOnsKICAgICAgIm0iOnsKICAgICAgIsKICAgICAgICAgImF1dGgiOiJiM0JsYj0iLAogICAgICAgICAiZW1haWwiOiJ5b3VAZXhhbXBsZS5jb20iCiAgICAgIH0KICAgfQp9Cg== kind: Secret metadata: creationTimestamp: "2021-09-09T19:10:11Z" name: pull-secret namespace: default resourceVersion: "37676" uid: e2851531-01bc-48ba-878c-de96cfe31020 type: Opaque
流程
从现有身份验证文件创建 secret:
对于使用
.docker/config.json
的 Docker 客户端,请输入以下命令:$ oc create secret generic <pull_secret_name> \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson
对于使用
.config/containers/auth.json
的 Podman 客户端,请输入以下命令:$ oc create secret generic <pull_secret_name> \ --from-file=<path/to/.config/containers/auth.json> \ --type=kubernetes.io/podmanconfigjson
如果您还没有安全 registry 的 Docker 凭证文件,则可运行以下命令创建一个 secret:
$ oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
要使用 secret 为 Pod 拉取镜像,您必须将 secret 添加到您的服务帐户中。本例中服务帐户的名称应与 Pod 使用的服务帐户的名称匹配。默认服务帐户是
default
:$ oc secrets link default <pull_secret_name> --for=pull
5.4.2.1. 通过委托身份验证从私有 registry 拉取(pull)
私有 registry 可将身份验证委托给单独服务。这种情况下,必须为身份验证和 registry 端点定义镜像 pull secret。
流程
为委托的身份验证服务器创建 secret:
$ oc create secret docker-registry \ --docker-server=sso.redhat.com \ --docker-username=developer@example.com \ --docker-password=******** \ --docker-email=unused \ redhat-connect-sso secret/redhat-connect-sso
为私有 registry 创建 secret:
$ oc create secret docker-registry \ --docker-server=privateregistry.example.com \ --docker-username=developer@example.com \ --docker-password=******** \ --docker-email=unused \ private-registry secret/private-registry
5.4.3. 更新全局集群 pull secret
您可以通过替换当前的 pull secret 或附加新的 pull secret 来更新集群的全局 pull secret。
要将集群转让到另一个所有者,您必须首先在 OpenShift Cluster Manager Hybrid Cloud Console 中启动转让,然后更新集群中的 pull secret。在不启动 OpenShift Cluster Manager 中的传输的情况下更新集群的 pull secret 会导致集群停止在 OpenShift Cluster Manager 中报告 Telemetry 指标。
有关 传输集群所有权的更多信息,请参阅 Red Hat OpenShift Cluster Manager 文档中的 "Transferring cluster ownership"。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
可选: 要将新的 pull secret 附加到现有 pull secret 中,请完成以下步骤:
输入以下命令下载 pull secret:
$ oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' ><pull_secret_location> 1
- 1
- 提供 pull secret 文件的路径。
输入以下命令来添加新 pull secret:
$ oc registry login --registry="<registry>" \ 1 --auth-basic="<username>:<password>" \ 2 --to=<pull_secret_location> 3
另外,您可以对 pull secret 文件执行手动更新。
输入以下命令为您的集群更新全局 pull secret:
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location> 1
- 1
- 提供新 pull secret 文件的路径。
该更新将推广至所有节点,可能需要一些时间,具体取决于集群大小。
注意从 OpenShift Container Platform 4.7.4 开始,对全局 pull secret 的更改不再触发节点排空或重启。