$ oc policy add-role-to-user \
system:image-puller system:serviceaccount:project-a:default \
--namespace=project-b
如果您正在使用 OpenShift 镜像注册表并从位于同一项目中的镜像流中拉取镜像,则您的 Pod 服务帐户应该已经拥有正确的权限,不需要执行任何其他操作。
但是,对于其他场景,例如跨 OpenShift Dedicated 项目引用镜像或从安全注册表引用镜像,需要额外的配置步骤。
您可以从 Red Hat OpenShift 集群管理器获取镜像 拉取密钥。此拉取密钥称为pullSecret
。
您可以使用此拉取密钥来验证包含的授权机构(Quay.io 和 registry.redhat.io)提供的服务,这些服务为 OpenShift Dedicated 组件提供容器镜像。
使用 OpenShift 镜像注册表时,要允许project-a
中的 Pod 引用project-b
中的镜像,必须将project-a
中的服务帐户绑定到project-b
中的system:image-puller
角色。
创建 Pod 服务帐户或命名空间时,请等待服务帐户使用 Docker 拉取密钥进行配置;如果您在服务帐户完全配置之前创建 Pod,则 Pod 将无法访问 OpenShift 镜像注册表。 |
要允许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
拉取镜像。
要允许project-a
中的任何服务帐户访问,请使用组
$ oc policy add-role-to-group \
system:image-puller system:serviceaccounts:project-a \
--namespace=project-b
要从其他私有或安全注册表拉取安全容器,必须从容器客户端凭据(例如 Docker 或 Podman)创建拉取密钥,并将其添加到您的服务帐户。
Docker 和 Podman 都使用配置文件来存储登录安全或不安全注册表的身份验证详细信息。
Docker:默认情况下,Docker 使用$HOME/.docker/config.json
。
Podman:默认情况下,Podman 使用$HOME/.config/containers/auth.json
。
如果您之前已登录到安全或不安全注册表,则这些文件会存储您的身份验证信息。
Docker 和 Podman 凭据文件以及关联的拉取密钥可以包含对同一注册表的多个引用,如果它们具有唯一的路径,例如 |
config.json
文件{
"auths":{
"cloud.openshift.com":{
"auth":"b3Blb=",
"email":"[email protected]"
},
"quay.io":{
"auth":"b3Blb=",
"email":"[email protected]"
},
"quay.io/repository-main":{
"auth":"b3Blb=",
"email":"[email protected]"
}
}
}
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
从现有的身份验证文件创建密钥
对于使用.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
如果您还没有安全注册表的 Docker 凭据文件,您可以通过运行以下命令来创建密钥:
$ oc create secret docker-registry <pull_secret_name> \
--docker-server=<registry_server> \
--docker-username=<user_name> \
--docker-password=<password> \
--docker-email=<email>
要使用密钥为 Pod 拉取镜像,必须将密钥添加到您的服务帐户。此示例中的服务帐户名称应与 Pod 使用的服务帐户名称匹配。默认服务帐户是default
。
$ oc secrets link default <pull_secret_name> --for=pull
私有注册表可以将身份验证委托给单独的服务。在这种情况下,必须为身份验证和注册表端点都定义镜像拉取密钥。
为委托身份验证服务器创建密钥
$ oc create secret docker-registry \
--docker-server=sso.redhat.com \
--docker-username=[email protected] \
--docker-password=******** \
--docker-email=unused \
redhat-connect-sso
secret/redhat-connect-sso
为私有注册表创建密钥
$ oc create secret docker-registry \
--docker-server=privateregistry.example.com \
--docker-username=[email protected] \
--docker-password=******** \
--docker-email=unused \
private-registry
secret/private-registry