×

如果您使用的是OpenShift镜像注册表并从位于同一项目中的镜像流中拉取镜像,则您的Pod服务帐户应该已经拥有正确的权限,无需任何其他操作。

但是,对于其他场景,例如引用跨Red Hat OpenShift Service on AWS项目或来自安全注册表的镜像,需要额外的配置步骤。

您可以从Red Hat OpenShift集群管理器获取镜像 拉取密钥。此拉取密钥称为pullSecret

您可以使用此拉取密钥来验证包含的授权机构提供的服务,Quay.ioregistry.redhat.io,它们为Red Hat OpenShift Service on AWS组件提供容器镜像。

允许Pod引用跨项目镜像

使用OpenShift镜像注册表时,要允许project-a中的Pod引用project-b中的镜像,必须将project-a中的服务帐户绑定到project-b中的system:image-puller角色。

创建Pod服务帐户或命名空间时,请等待服务帐户配置带有Docker拉取密钥;如果您在服务帐户完全配置之前创建Pod,则Pod将无法访问OpenShift镜像注册表。

步骤
  1. 要允许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拉取镜像。

  2. 要允许project-a中的任何服务帐户访问,请使用组

    $ oc policy add-role-to-group \
        system:image-puller system:serviceaccounts:project-a \
        --namespace=project-b

允许Pod引用来自其他安全注册表的镜像

要从其他私有或安全注册表拉取安全容器,必须根据您的容器客户端凭据(例如Docker或Podman)创建拉取密钥,并将其添加到您的服务帐户。

Docker和Podman都使用配置文件来存储登录安全或不安全注册表的身份验证详细信息。

  • Docker:默认情况下,Docker使用$HOME/.docker/config.json

  • Podman:默认情况下,Podman使用$HOME/.config/containers/auth.json

如果您以前登录过安全或不安全注册表,则这些文件会存储您的身份验证信息。

Docker和Podman凭据文件以及关联的拉取密钥如果具有唯一路径,例如quay.ioquay.io/,可以包含对同一注册表的多个引用。但是,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

使用委托身份验证从私有注册表拉取镜像

私有注册表可以将身份验证委托给单独的服务。在这些情况下,必须为身份验证和注册表端点定义镜像拉取密钥。

步骤
  1. 为委托身份验证服务器创建密钥

    $ 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
  2. 为私有注册表创建密钥

    $ oc create secret docker-registry \
        --docker-server=privateregistry.example.com \
        --docker-username=[email protected] \
        --docker-password=******** \
        --docker-email=unused \
        private-registry
    
    secret/private-registry