5.4. 使用镜像 pull secret
如果您使用 OpenShift 镜像 registry,并且从位于同一项目中的镜像流拉取 (pull),则您的 Pod 服务帐户应已具备正确的权限,且无需额外操作。
但是,对于其他场景,比如在 Red Hat OpenShift Service on AWS 项目或从安全 registry 引用镜像,需要额外的配置步骤。
您可以从 Red Hat OpenShift Cluster Manager 获取镜像 pull secret。此 pull secret 名为 pullSecret
。
您可以使用此 pull secret 与所含授权机构( Quay.io 和 registry.redhat.io )提供的服务进行身份验证,这些服务为 Red Hat OpenShift Service on AWS 组件提供容器镜像。
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