容器计算服务 ACS(Container Compute Service)支持免密拉取容器镜像服务 ACR(Container Registry)中的镜像,以提升效率和安全性。本文介绍如何在ACS集群中免密拉取ACR镜像。
背景信息
容器镜像服务 ACR(Container Registry)提供了多种版本的标准云原生制品安全托管及高效分发服务,其中包括ACR个人版、ACR企业版等。更多信息,请参见容器镜像服务ACR简介。对于不同版本的ACR服务,ACS提供了统一的免密拉取镜像配置方式。
通过为ACS集群配置免密服务,ACS实例在创建时将自动为ACR镜像注入鉴权信息,可以简化实例创建流程,同时避免密码泄露的风险,加强安全性。
Docker镜像,自建仓库等非ACR镜像不支持免密。
前提条件
配置ACS集群免密拉取ACR镜像前,请确保您已经完成以下操作:
创建ACS集群。具体操作,请参见创建ACS集群。
已创建ACR实例,并完成镜像仓库、镜像等相关配置。
关于如何配置ACR个人版实例,请参见使用个人版实例推送拉取镜像。
关于如何配置ACR企业版实例,请参见使用企业版实例推送和拉取镜像。
如果使用ACR企业版实例,需要配置实例的访问方式。
新创建的ACR企业版实例默认处于非连接状态,需要配置相应的ACL策略后,才可以通过公网或者专有网络访问该实例。
公网访问:开启公网访问入口后,可以直接通过公网域名地址来访问ACR企业版实例的镜像(可跨域)。具体操作,请参见配置公网的访问控制。
专有网络访问:使用专有网络VPC访问ACR企业版实例,需要开启相关授权。具体操作,请参见配置专有网络的访问控制。
原理说明
免密组件通过读取用户控制台的配置,进行私有镜像拉取。免密组件配置完成后将会在集群中自动创建Secret,并关联到配置中已指定的ServiceAccount。任何使用此ServiceAccount的Pod都会默认使用免密组件生成的Secret进行镜像拉取,从而达到免密拉取镜像的效果。
安装和配置免密组件
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群页面,单击目标集群ID,然后在左侧导航栏,选择运维管理 > 组件管理。
在组件管理页面,选择安全页签,找到aliyun-acr-credential-helper,单击安装。
在弹出的参数配置页面,单击AcrInstanceInfo右侧添加,即可添加多个ACR实例信息。您可以参考以下示例进行配置,然后单击确定。
添加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****
默认值为空。
填写其他配置项。
配置项键
配置项键说明
配置项值
是否开启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功能才会生效。
启用ACS集群的RRSA功能。具体操作,请参见启用RRSA功能。
ACS将自动为集群创建RRSA OIDC提供商,在集群控制台的查看提供商URL和提供商ARN。
集群所有者使用OIDC提供商配置RAM角色,并授予角色扮演权限。
使用OIDC提供商创建RAM角色或为已存在的RAM角色关联OIDC提供商,以便免密组件使用该角色权限访问OpenAPI。
使用OIDC提供商创建RAM角色
使用阿里云账号登录RAM控制台。
在左侧导航栏,选择 ,然后在角色页面,单击创建角色。
在创建角色面板,选择可信实体类型为身份提供商,然后单击下一步。
在配置角色页面,配置如下角色信息后,单击完成。
本示例配置如下。
配置项
描述
角色名称
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提供商
使用阿里云账号登录RAM控制台。
在左侧导航栏,选择 ,单击目标RAM角色名称
在信任策略页签,单击编辑信任策略。详细操作,请参见修改RAM角色的信任策略。
在信任策略中
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。
为该RAM角色配置
AliyunSTSAssumeRoleAccess
权限策略,以便免密组件进行角色扮演。具体操作,请参见为RAM角色授权。在角色
查看该RAM角色的ARN。
镜像仓库所有者配置RAM角色,信任集群所有者的RAM角色,并授予镜像拉取权限。
创建RAM角色。详细操作,请参见创建可信实体为阿里云账号的RAM角色。
信任ACS集群RAM角色,允许其扮演仓库所有者。详细操作,请参见修改RAM角色的信任策略。策略文档示例如下:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<acs_role_arn>" ] } } ], "Version": "1" }
重要其中
<acs_role_arn>
需要替换为步骤3中获取的ACS集群RAM角色ARN。为该RAM角色配置镜像拉取权限
[可选] 可以为该RAM角色设置角色最大会话时间,有效范围为3600秒到43200秒。如果设置角色最大会话时间,下文配置AcrInstanceInfo时也应当设置参数expireDuration。
在角色
查看该RAM角色的ARN。
在免密组件配置中勾选是否开启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],单位为秒。