本文介绍如何使用阿里云容器镜像服务提供的免密插件拉取容器镜像。

前提条件

创建Kubernetes集群

注意
  • 在Kubernetes资源(例如无状态应用Deployment)模板中配置拉取凭证(imagePullSecret)会导致免密插件失效,如需使用免密插件,请避免手工配置拉取凭证(imagePullSecret)。
  • 如果部署的Kubernetes资源(例如无状态应用Deployment)使用了自定义的ServiceAccount,必须先调整免密插件配置文件中service-account字段,使其作用于自定义的ServiceAccount,再进行部署资源操作。

背景信息

  • 镜像支持
    • 支持拉取容器镜像服务企业版实例和默认实例中的私有镜像。
    • 支持拉取集群当前用户容器镜像服务中的私有镜像,通过跨账号授权可以拉取其他用户的私有镜像。
    • 支持跨地域拉取容器镜像服务中的私有镜像。
  • 支持集群
    • 支持集群多命名空间免密拉取。
    • 支持的集群类型:
      • 专有版Kubernetes集群。
      • 托管版Kubernetes集群。
      • Serverless Kubernetes集群。
    • 支持的集群版本
      • 专有版Kubernetes集群:高于或等于1.11.2的版本默认支持免密拉取镜像。低于1.11.2版本的用户请手动升级,请参见升级集群
      • 托管版Kubernetes集群:所有版本。
      • Serverless Kubernetes集群:所有版本。

升级组件并对组件进行配置

  1. 升级组件。
    1. 请登录容器服务管理控制台
    2. 在左侧导航栏选择集群 > 集群,在集群列表中对需要升级的集群单击更多 > 系统组件管理
    3. 在组件列表区域中找到aliyun-acr-credential-helper,单击升级
  2. 配置组件。
    1. 在容器服务管理控制台左侧导航栏选择应用配置 > 配置项
    2. 选择您的集群,命名空间选择为kube-system,在配置项列表中,找到acr-configuration配置项,若您没有该配置项,请创建一个。acr配置项

      以下是一个组件的配置示例。

      • 企业版实例:
        acr-registry-info: |
             - instanceId: cri-xxx
               regionId: cn-hangzhou
               domains: xxx.com,yyy.com
           watch-namespace: "all"
           service-account: "default"
           expiring-threshold: "15m"
      • 默认版实例:
        acr-registry-info: 
           watch-namespace: "all"
           service-account: "default"
           expiring-threshold: "15m"
      配置项 配置项说明 默认值
      service-account 使免密插件作用于指定的服务账号。 default。
      说明 若要配置多个请以逗号分隔, 若为“*”, 表示支持Namespace下的所有ServiceAccount。
      acr-registry-info 容器镜像的实例信息数组,yaml多行字符串格式,每个实例以三元组方式配置。
      说明 实例信息三元组:
      • instanceId:实例ID,企业版实例必须配置此项。
      • regionId:可选,默认为本地region。
      • domains:可选,默认为相应实例的所有域名。若要指定个别域名,多个以逗号分隔。
      空,表示免密拉取本地Region的默认容器镜像实例仓库。
      watch-namespace 期望能免密拉取镜像的Namespace。 default。
      说明 当取值为all时,表示期望所有Namespace都能免密拉取。如果需要配置多个Namespace时,以逗号分隔。
      expiring-threshold 本地Cache Token过期阈值。 15m(建议使用15m)。

场景一:跨账号拉取私有镜像

支持在A用户的ACK集群中拉取B用户的私有镜像。

说明
配置原则如下:
  1. B账号(ram角色)可以拉取指定私有仓库下的私有镜像(B ram role有cr.* 相关的权限)。
  2. B账号(ram角色)允许让A账号下的ACK worker role扮演。 (信任策略)。
  3. A账户下的ACK集群的worker role有扮演B账号(ram角色)的权限。(AliyunAssumeRoleAccess)。
  4. 设置A账户下的worker role扮演B账号(configMap中的assumeRoleARN)。
  1. 创建B用户的受信实体为阿里云账号类型的RAM角色,并确保该RAM角色拥有拉取B用户私有镜像的权限。在RAM访问控制页面,点击RAM角色管理创建RAM角色
    说明 该RAM有cr.*的相关权限。RAM有CR的相关权限
  2. 在创建的B用户的RAM角色上配置trust policy,允许A用户 (需要拉取B账号名下镜像的)ACK集群的Worker role RAM角色来扮演B用户,在策略Principal处填写A用户的ACK集群的Worker RAM角色的RamRoleARN。RamRoleARN
  3. 确认A用户的Worker RAM角色拥有AssumeRule权限。AssumeRule权限
  4. 调整组件配置,新增assumeRoleARN配置,内容为B用户RAM角色的ramRoleARN。配置示例:
    data:   
        service-account: "default"
        watch-namespace: "all"
        expiring-threshold: "15m"
        notify-email: "cs@aliyuncs.com"
        acr-registry-info: |
        - instanceId: ""
           regionId: cn-beijing
           domains: registry.cn-beijing.aliyuncs.com
           assumeRoleARN: acs:ram::.*:role/kubernetesworkerrole-test

场景二:当前账号免密拉取失败

您需要检查当前账号ACR拉取的权限。

  1. 在集群控制台左侧导航栏选择集群 > 集群,在集群列表中对需要操作的集群名称进行单击。
  2. 集群资源区域中单击Worker RAM角色WorkRam
  3. RAM访问控制页面,单击权限策略名称单击权限策略名称
  4. 单击修改策略内容,进行修改。
  5. 策略内容区域增加以下字段后,单击确定
    {
      "Action": [
        "cr:Get*",
        "cr:List*",
        "cr:PullRepository"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }
  6. 添加字段位置如下图所示。
    修改示例
说明 您可能还需要检查pod中镜像字段的值是否存在于当前账号的ACR仓库里面。
  • 如果存在,但不在当前账号下,您可能需要使用跨账号镜像拉取(参考场景一)。
  • 如果存在,且在当前账号下,您可以提交工单
  • 如果不存在,您需要确认该镜像是否存在于阿里云容器镜像服务上。如果不存在,则需要同步外部镜像到阿里云容器镜像服务商,或者变更改镜像为公网可拉取状态。

场景三:配置多region拉取

如果需要拉取的镜像与当前ACK集群不属于同一个集群的时候,需要修改configMap。

例如,默认仓库同时拉取北京region与杭州region的镜像,配置示例如下。

data:   
    service-account: "default"
    watch-namespace: "all"
    expiring-threshold: "15m"
    notify-email: "cs@aliyuncs.com"
    acr-registry-info: |
    - instanceId: ""
       regionId: cn-beijing
    - instanceId: ""
       regionId: cn-hangzhou