免密拉取ACR镜像

容器计算服务 ACS(Container Compute Service)支持免密拉取容器镜像服务 ACR(Container Registry)中的镜像,以提升效率和安全性。本文介绍如何在ACS集群中免密拉取ACR镜像。

背景信息

容器镜像服务 ACR(Container Registry)提供了多种版本的标准云原生制品安全托管及高效分发服务,其中包括ACR个人版、ACR企业版等。更多信息,请参见容器镜像服务ACR简介。对于不同版本的ACR服务,ACS提供了统一的免密拉取镜像配置方式。

通过为ACS集群配置免密服务,ACS实例在创建时将自动为ACR镜像注入鉴权信息,可以简化实例创建流程,同时避免密码泄露的风险,加强安全性。

说明

Docker镜像,自建仓库等非ACR镜像不支持免密。

前提条件

配置ACS集群免密拉取ACR镜像前,请确保您已经完成以下操作:

  1. 创建ACS集群。具体操作,请参见创建ACS集群

  2. 已创建ACR实例,并完成镜像仓库、镜像等相关配置。

  3. 如果使用ACR企业版实例,需要配置实例的访问方式。

    新创建的ACR企业版实例默认处于非连接状态,需要配置相应的ACL策略后,才可以通过公网或者专有网络访问该实例。

    • 公网访问:开启公网访问入口后,可以直接通过公网域名地址来访问ACR企业版实例的镜像(可跨域)。具体操作,请参见配置公网的访问控制

    • 专有网络访问:使用专有网络VPC访问ACR企业版实例,需要开启相关授权。具体操作,请参见配置专有网络的访问控制

原理说明

免密组件通过读取用户控制台的配置,进行私有镜像拉取。免密组件配置完成后将会在集群中自动创建Secret,并关联到配置中已指定的ServiceAccount。任何使用此ServiceAccount的Pod都会默认使用免密组件生成的Secret进行镜像拉取,从而达到免密拉取镜像的效果。

安装和配置免密组件

  1. 登录容器计算服务控制台,在左侧导航栏选择集群

  2. 集群页面,单击目标集群ID,然后在左侧导航栏,选择运维管理组件管理

  3. 组件管理页面,选择安全页签,找到aliyun-acr-credential-helper,单击安装

    image

  4. 在弹出的参数配置页面,单击AcrInstanceInfo右侧添加,即可添加多个ACR实例信息。您可以参考以下示例进行配置,然后单击确定

    1. 添加AcrInstanceInfo

      说明

      默认场景的配置方式如下:

      • 使用AcrInstanceInfo的默认配置,即可同步ACR个人版实例。

      • 填写实例instanceID,其他项使用AcrInstanceInfo的默认配置,即可同步ACR企业版实例。

      配置项键

      配置项键说明

      配置项值

      instanceID

      ACR实例ID。

      容器镜像服务中找到所创建的实例。

      • 企业版:在实例信息中可以找到实例ID,值为cri-开头的字符串。

      • 个人版:如果希望为个人版配置免密能力,此处留空即可。

      默认值为空,即配置为该Region个人版实例。

      regionID

      ACR实例所在的RegionID。

      ACR实例所在Region的ID,如:杭州Region的实例Region ID为cn-hangzhou

      默认值为ACS集群所在Region,若与ACR实例同Region,此处留空即可。

      domains

      访问ACR实例的域名。

      访问镜像的域名,多个以英文半角逗号(,)分隔。

      默认值为instanceID对应ACR实例的所有域名(公网域名registry.*,VPC域名registry-vpc.*,内网域名registry-internal.*)。

      assumeRoleARN

      (可选)配置跨账号拉取镜像步骤4中获取的镜像仓库所有者RAM角色ARN,非跨账号拉取留空即可。

      示例:acs:ram::123456789012****:test-rrsa-acr

      默认值为空。

      expireDuration

      (可选)跨账号场景下临时凭证的有效时间。非跨账号拉取留空即可。

      重要

      expireDuration的值应不大于配置跨账号拉取镜像步骤4中设置的镜像仓库所有者角色最大会话时间

      默认值为3600

      rrsaRoleARN

      (可选)配置跨账号拉取镜像步骤3中获取的ACS集群RAM角色ARN,非跨账号拉取留空即可。

      示例:acs:ram::987654321012****:demo-role-for-rrsa

      默认值为空。

      rrsaOIDCProviderRoleARN

      (可选)配置跨账号拉取镜像步骤2中获取的ACS集群RRSA OIDC提供商ARN,非跨账号拉取留空即可。

      示例:acs:ram::987654321012****:oidc-provider/ack-rrsa-abcd1234****

      默认值为空。

    2. 填写其他配置项。

      配置项键

      配置项键说明

      配置项值

      是否开启RRSA

      勾选后即可开启RRSA(需完成RRSA相关配置)。

      默认不勾选。配置RRSA相关配置项并勾选后,能够跨账号拉取ACR镜像。

      watchNamespace

      期望能免密拉取镜像的Namespace。

      默认值为default。当取值为all时,表示期望所有Namespace均能免密拉取。如需配置多个Namespace时,以英文半角逗号(,)分隔。

      说明

      推荐配置生效Namespace为您的业务Namespace,尽量避免配置all或者集群系统组件相关Namespace,使集群系统组件镜像无法拉取。

      serviceAccount

      使免密组件作用于指定的服务账号。

      默认值为default

      说明

      如果需要配置多个,请以英文半角逗号(,)分隔。如果设置为(*),表示支持指定命名空间下的所有ServiceAccount。

      expiringThreshold

      本地缓存凭证过期阈值。

      默认值为15m

      说明

      建议使用15m,即在缓存过期15分钟前进行凭证更新。

      notifyEmail

      由免密组件生成的保密字典中的Email标记。

      默认值为xxx@aliyun.com

配置跨账号拉取镜像

使用RRSA进行跨账号拉取

适用于服务账户的RAM角色(RAM Roles for Service Accounts,简称RRSA)功能可以实现ACS集群内Pod维度的权限隔离。通过为ACS集群开启RRSA功能,并将授权角色的ARN分发给不同的镜像仓库所有者,免密组件可以实现跨账号拉取ACR镜像。

RRSA功能目前仅支持拉取ACR企业版实例(基础版、标准版、高级版)的镜像。

重要
  • 当开启RRSA功能后,由组件生成的凭证将不支持个人版非公开镜像拉取,同时也不支持本文中提到的其他的鉴权方式。

  • 启用免密插件的RRSA功能首先需要启用RRSA,再进行免密插件RRSA的相关配置。若操作顺序颠倒,在配置完成后,则需要删除免密插件的Pod,RRSA功能才会生效。

  1. 启用ACS集群的RRSA功能。具体操作,请参见启用RRSA功能

  2. ACS将自动为集群创建RRSA OIDC提供商,在集群控制台的基本信息 > 安全与审计 > RRSA OIDC查看提供商URL提供商ARN

    image

  3. 集群所有者使用OIDC提供商配置RAM角色,并授予角色扮演权限。

    1. 使用OIDC提供商创建RAM角色为已存在的RAM角色关联OIDC提供商,以便免密组件使用该角色权限访问OpenAPI。

      使用OIDC提供商创建RAM角色

      1. 使用阿里云账号登录RAM控制台

      2. 在左侧导航栏,选择身份管理 > 角色,然后在角色页面,单击创建角色

      3. 创建角色面板,选择可信实体类型为身份提供商,然后单击下一步

      4. 配置角色页面,配置如下角色信息后,单击完成

      5. 本示例配置如下。

        配置项

        描述

        角色名称

        demo-role-for-rrsa。

        备注

        选填有关该角色的备注信息。

        身份提供商类型

        OIDC

        选择身份提供商

        acs-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。

        限制条件

        • oidc:iss:保持默认。

        • oidc:aud:选择sts.aliyuncs.com

        • oidc:sub:条件判定方式选择StringEquals,值的格式为system:serviceaccount:<namespace>:<serviceAccountName>

          • <namespace>:应用所在的命名空间。

          • <serviceAccountName>:服务账户名称。

          根据免密插件要求,此处必须填入system:serviceaccount:kube-system:aliyun-acr-credential-helper

      为已存在的RAM角色关联OIDC提供商

      1. 使用阿里云账号登录RAM控制台

      2. 在左侧导航栏,选择身份管理 > 角色,单击目标RAM角色名称

      3. 信任策略页签,单击编辑信任策略详细操作,请参见修改RAM角色的信任策略

      4. 在信任策略中Statement条目列表新增内容示例如下。

        {
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "oidc:aud": "sts.aliyuncs.com",
                    "oidc:iss": "<oidc_issuer_url>",
                    "oidc:sub": "system:serviceaccount:kube-system:aliyun-acr-credential-helper"
                }
            },
            "Effect": "Allow",
            "Principal": {
                "Federated": [
                    "<oidc_provider_arn>"
                ]
            }
        }
        重要

        其中<oidc_issuer_url><oidc_provider_arn>分别需要替换为步骤2中获取的提供商URL提供商ARN

    2. 为该RAM角色配置AliyunSTSAssumeRoleAccess权限策略,以便免密组件进行角色扮演。具体操作,请参见为RAM角色授权

    3. 在角色基本信息 > ARN查看该RAM角色的ARN

      image

  4. 镜像仓库所有者配置RAM角色,信任集群所有者的RAM角色,并授予镜像拉取权限。

    1. 创建RAM角色。详细操作,请参见创建可信实体为阿里云账号的RAM角色

    2. 信任ACS集群RAM角色,允许其扮演仓库所有者。详细操作,请参见修改RAM角色的信任策略。策略文档示例如下:

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Principal": {
                      "RAM": [
                          "<acs_role_arn>"
                      ]
                  }
              }
          ],
          "Version": "1"
      }
      重要

      其中<acs_role_arn>需要替换为步骤3中获取的ACS集群RAM角色ARN

    3. 为该RAM角色配置镜像拉取权限

      1. 通过脚本编辑模式创建自定义权限策略,策略文档内容如下,推荐策略名称AliyunACRBasicAccess。具体操作,请参见创建自定义权限策略

        {
            "Version": "1",
            "Statement": [
                {
                    "Action": [
                        "cr:GetAuthorizationToken",
                        "cr:ListInstanceEndpoint",
                        "cr:PullRepository"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        }
      2. 为该RAM角色授予AliyunACRBasicAccess权限。具体操作,请参见为RAM角色授权

    4. [可选] 可以为该RAM角色设置角色最大会话时间,有效范围为3600秒到43200秒。如果设置角色最大会话时间,下文配置AcrInstanceInfo时也应当设置参数expireDuration

    5. 在角色基本信息 > ARN查看该RAM角色的ARN

      image

  5. 在免密组件配置中勾选是否开启RRSA。并配置AcrInstanceInfo

    按照如下配置内容,修改AcrInstanceInfo

    配置项键

    配置项说明

    配置项值

    是否开启RRSA

    勾选后即可开启RRSA(需完成RRSA相关配置)。

    勾选

    rrsaRoleARN

    步骤3中获取的ACS集群RAM角色ARN

    <acs_role_arn>

    rrsaOIDCProviderRoleARN

    步骤2中获取的ACS集群RRSA OIDC提供商ARN

    oidc_provider_arn

    assumeRoleARN

    步骤4中获取的镜像仓库所有者RAM角色ARN

    <acr_role_arn>

    expireDuration

    免密组件生成的临时凭证的有效期。

    重要

    expireDuration的值应不大于步骤4中设置的镜像仓库所有者角色最大会话时间

    默认为3600。取值范围为[3600, 43200],单位为秒。

相关文档