×

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

但是,对于其他场景,例如跨OpenShift Container Platform项目或从安全注册表引用镜像,需要额外的配置步骤。

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

您可以使用此拉取密钥来验证包含的授权机构(Quay.ioregistry.redhat.io)提供的服务,这些服务为OpenShift Container Platform组件提供容器镜像。

允许 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.io` 和 `quay.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

更新全局集群拉取密钥

您可以通过替换当前拉取密钥或追加新的拉取密钥来更新集群的全局拉取密钥。

要将您的集群转移到另一个所有者,您必须首先在 OpenShift 集群管理器 中启动转移,然后更新集群上的拉取密钥。在未在 OpenShift 集群管理器中启动转移的情况下更新集群的拉取密钥会导致集群停止在 OpenShift 集群管理器中报告遥测指标。

有关集群所有权转移 的更多信息,请参阅 Red Hat OpenShift 集群管理器文档中的“转移集群所有权”。

先决条件
  • 您可以作为具有 `cluster-admin` 角色的用户访问集群。

步骤
  1. 可选:要将新的拉取密钥追加到现有的拉取密钥,请完成以下步骤:

    1. 输入以下命令下载拉取密钥:

      $ oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' ><pull_secret_location> (1)
      1 提供拉取密钥文件的路径。
    2. 输入以下命令添加新的拉取密钥:

      $ oc registry login --registry="<registry>" \ (1)
      --auth-basic="<username>:<password>" \ (2)
      --to=<pull_secret_location> (3)
      
      1 提供新的注册表。您可以包含同一注册表中的多个资源库,例如:`--registry=""`。
      2 提供新注册表的凭据。
      3 提供拉取密钥文件的路径。

      或者,您可以对拉取密钥文件执行手动更新。

  2. 输入以下命令更新集群的全局拉取密钥:

    $ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location> (1)
    1 提供新的拉取密钥文件的路径。

    此更新将部署到所有节点,具体时间取决于集群的大小。

    从 OpenShift Container Platform 4.7.4 开始,对全局拉取密钥的更改不再触发节点清空或重启。