免密拉取ACR鏡像
容器計(jì)算服務(wù) ACS(Container Compute Service)支持免密拉取容器鏡像服務(wù) ACR(Container Registry)中的鏡像,以提升效率和安全性。本文介紹如何在ACS集群中免密拉取ACR鏡像。
背景信息
容器鏡像服務(wù) ACR(Container Registry)提供了多種版本的標(biāo)準(zhǔn)云原生制品安全托管及高效分發(fā)服務(wù),其中包括ACR個(gè)人版、ACR企業(yè)版等。更多信息,請(qǐng)參見容器鏡像服務(wù)ACR簡(jiǎn)介。對(duì)于不同版本的ACR服務(wù),ACS提供了統(tǒng)一的免密拉取鏡像配置方式。
通過為ACS集群配置免密服務(wù),ACS實(shí)例在創(chuàng)建時(shí)將自動(dòng)為ACR鏡像注入鑒權(quán)信息,可以簡(jiǎn)化實(shí)例創(chuàng)建流程,同時(shí)避免密碼泄露的風(fēng)險(xiǎn),加強(qiáng)安全性。
Docker鏡像,自建倉庫等非ACR鏡像不支持免密。
前提條件
配置ACS集群免密拉取ACR鏡像前,請(qǐng)確保您已經(jīng)完成以下操作:
創(chuàng)建ACS集群。具體操作,請(qǐng)參見創(chuàng)建ACS集群。
已創(chuàng)建ACR實(shí)例,并完成鏡像倉庫、鏡像等相關(guān)配置。
關(guān)于如何配置ACR個(gè)人版實(shí)例,請(qǐng)參見使用個(gè)人版實(shí)例推送拉取鏡像。
關(guān)于如何配置ACR企業(yè)版實(shí)例,請(qǐng)參見使用企業(yè)版實(shí)例推送和拉取鏡像。
如果使用ACR企業(yè)版實(shí)例,需要配置實(shí)例的訪問方式。
新創(chuàng)建的ACR企業(yè)版實(shí)例默認(rèn)處于非連接狀態(tài),需要配置相應(yīng)的ACL策略后,才可以通過公網(wǎng)或者專有網(wǎng)絡(luò)訪問該實(shí)例。
公網(wǎng)訪問:開啟公網(wǎng)訪問入口后,可以直接通過公網(wǎng)域名地址來訪問ACR企業(yè)版實(shí)例的鏡像(可跨域)。具體操作,請(qǐng)參見配置公網(wǎng)的訪問控制。
專有網(wǎng)絡(luò)訪問:使用專有網(wǎng)絡(luò)VPC訪問ACR企業(yè)版實(shí)例,需要開啟相關(guān)授權(quán)。具體操作,請(qǐng)參見配置專有網(wǎng)絡(luò)的訪問控制。
原理說明
免密組件通過讀取用戶控制臺(tái)的配置,進(jìn)行私有鏡像拉取。免密組件配置完成后將會(huì)在集群中自動(dòng)創(chuàng)建Secret,并關(guān)聯(lián)到配置中已指定的ServiceAccount。任何使用此ServiceAccount的Pod都會(huì)默認(rèn)使用免密組件生成的Secret進(jìn)行鏡像拉取,從而達(dá)到免密拉取鏡像的效果。
安裝和配置免密組件
登錄容器計(jì)算服務(wù)控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群頁面,單擊目標(biāo)集群ID,然后在左側(cè)導(dǎo)航欄,選擇運(yùn)維管理 > 組件管理。
在組件管理頁面,選擇安全頁簽,找到aliyun-acr-credential-helper,單擊安裝。
在彈出的參數(shù)配置頁面,單擊AcrInstanceInfo右側(cè)添加,即可添加多個(gè)ACR實(shí)例信息。您可以參考以下示例進(jìn)行配置,然后單擊確定。
添加AcrInstanceInfo。
說明默認(rèn)場(chǎng)景的配置方式如下:
使用AcrInstanceInfo的默認(rèn)配置,即可同步ACR個(gè)人版實(shí)例。
填寫實(shí)例instanceID,其他項(xiàng)使用AcrInstanceInfo的默認(rèn)配置,即可同步ACR企業(yè)版實(shí)例。
配置項(xiàng)鍵
配置項(xiàng)鍵說明
配置項(xiàng)值
instanceID
ACR實(shí)例ID。
容器鏡像服務(wù)中找到所創(chuàng)建的實(shí)例。
企業(yè)版:在實(shí)例信息中可以找到實(shí)例ID,值為
cri-
開頭的字符串。個(gè)人版:如果希望為個(gè)人版配置免密能力,此處留空即可。
默認(rèn)值為空,即配置為該Region個(gè)人版實(shí)例。
regionID
ACR實(shí)例所在的RegionID。
ACR實(shí)例所在Region的ID,如:杭州Region的實(shí)例Region ID為
cn-hangzhou
。默認(rèn)值為ACS集群所在Region,若與ACR實(shí)例同Region,此處留空即可。
domains
訪問ACR實(shí)例的域名。
訪問鏡像的域名,多個(gè)以英文半角逗號(hào)(,)分隔。
默認(rèn)值為instanceID對(duì)應(yīng)ACR實(shí)例的所有域名(公網(wǎng)域名registry.*,VPC域名registry-vpc.*,內(nèi)網(wǎng)域名registry-internal.*)。
assumeRoleARN
(可選)配置跨賬號(hào)拉取鏡像步驟4中獲取的鏡像倉庫所有者RAM角色ARN,非跨賬號(hào)拉取留空即可。
示例:acs:ram::123456789012****:test-rrsa-acr
默認(rèn)值為空。
expireDuration
(可選)跨賬號(hào)場(chǎng)景下臨時(shí)憑證的有效時(shí)間。非跨賬號(hào)拉取留空即可。
重要expireDuration的值應(yīng)不大于配置跨賬號(hào)拉取鏡像步驟4中設(shè)置的鏡像倉庫所有者角色最大會(huì)話時(shí)間。
默認(rèn)值為
3600
。rrsaRoleARN
(可選)配置跨賬號(hào)拉取鏡像步驟3中獲取的ACS集群RAM角色ARN,非跨賬號(hào)拉取留空即可。
示例:acs:ram::987654321012****:demo-role-for-rrsa
默認(rèn)值為空。
rrsaOIDCProviderRoleARN
(可選)配置跨賬號(hào)拉取鏡像步驟2中獲取的ACS集群RRSA OIDC提供商ARN,非跨賬號(hào)拉取留空即可。
示例:acs:ram::987654321012****:oidc-provider/ack-rrsa-abcd1234****
默認(rèn)值為空。
填寫其他配置項(xiàng)。
配置項(xiàng)鍵
配置項(xiàng)鍵說明
配置項(xiàng)值
是否開啟RRSA
勾選后即可開啟RRSA(需完成RRSA相關(guān)配置)。
默認(rèn)不勾選。配置RRSA相關(guān)配置項(xiàng)并勾選后,能夠跨賬號(hào)拉取ACR鏡像。
watchNamespace
期望能免密拉取鏡像的Namespace。
默認(rèn)值為
default
。當(dāng)取值為all時(shí),表示期望所有Namespace均能免密拉取。如需配置多個(gè)Namespace時(shí),以英文半角逗號(hào)(,)分隔。說明推薦配置生效Namespace為您的業(yè)務(wù)Namespace,盡量避免配置all或者集群系統(tǒng)組件相關(guān)Namespace,使集群系統(tǒng)組件鏡像無法拉取。
serviceAccount
使免密組件作用于指定的服務(wù)賬號(hào)。
默認(rèn)值為
default
。說明如果需要配置多個(gè),請(qǐng)以英文半角逗號(hào)(,)分隔。如果設(shè)置為(*),表示支持指定命名空間下的所有ServiceAccount。
expiringThreshold
本地緩存憑證過期閾值。
默認(rèn)值為
15m
。說明建議使用15m,即在緩存過期15分鐘前進(jìn)行憑證更新。
notifyEmail
由免密組件生成的保密字典中的Email標(biāo)記。
默認(rèn)值為
xxx@aliyun.com
。
配置跨賬號(hào)拉取鏡像
使用RRSA進(jìn)行跨賬號(hào)拉取
適用于服務(wù)賬戶的RAM角色(RAM Roles for Service Accounts,簡(jiǎn)稱RRSA)功能可以實(shí)現(xiàn)ACS集群內(nèi)Pod維度的權(quán)限隔離。通過為ACS集群開啟RRSA功能,并將授權(quán)角色的ARN分發(fā)給不同的鏡像倉庫所有者,免密組件可以實(shí)現(xiàn)跨賬號(hào)拉取ACR鏡像。
RRSA功能目前僅支持拉取ACR企業(yè)版實(shí)例(基礎(chǔ)版、標(biāo)準(zhǔn)版、高級(jí)版)的鏡像。
當(dāng)開啟RRSA功能后,由組件生成的憑證將不支持個(gè)人版非公開鏡像拉取,同時(shí)也不支持本文中提到的其他的鑒權(quán)方式。
啟用免密插件的RRSA功能首先需要啟用RRSA,再進(jìn)行免密插件RRSA的相關(guān)配置。若操作順序顛倒,在配置完成后,則需要?jiǎng)h除免密插件的Pod,RRSA功能才會(huì)生效。
啟用ACS集群的RRSA功能。具體操作,請(qǐng)參見啟用RRSA功能。
ACS將自動(dòng)為集群創(chuàng)建RRSA OIDC提供商,在集群控制臺(tái)的查看提供商URL和提供商ARN。
集群所有者使用OIDC提供商配置RAM角色,并授予角色扮演權(quán)限。
使用OIDC提供商創(chuàng)建RAM角色或為已存在的RAM角色關(guān)聯(lián)OIDC提供商,以便免密組件使用該角色權(quán)限訪問OpenAPI。
使用OIDC提供商創(chuàng)建RAM角色
使用阿里云賬號(hào)登錄RAM控制臺(tái)。
在左側(cè)導(dǎo)航欄,選擇 ,然后在角色頁面,單擊創(chuàng)建角色。
在創(chuàng)建角色面板,選擇可信實(shí)體類型為身份提供商,然后單擊下一步。
在配置角色頁面,配置如下角色信息后,單擊完成。
本示例配置如下。
配置項(xiàng)
描述
角色名稱
demo-role-for-rrsa。
備注
選填有關(guān)該角色的備注信息。
身份提供商類型
OIDC。
選擇身份提供商
acs-rrsa-<cluster_id>。其中,<cluster_id>為您的集群ID。
限制條件
oidc:iss:保持默認(rèn)。
oidc:aud:選擇sts.aliyuncs.com。
oidc:sub:條件判定方式選擇StringEquals,值的格式為system:serviceaccount:<namespace>:<serviceAccountName>。
<namespace>:應(yīng)用所在的命名空間。
<serviceAccountName>:服務(wù)賬戶名稱。
根據(jù)免密插件要求,此處必須填入
system:serviceaccount:kube-system:aliyun-acr-credential-helper
。
為已存在的RAM角色關(guān)聯(lián)OIDC提供商
使用阿里云賬號(hào)登錄RAM控制臺(tái)。
在左側(cè)導(dǎo)航欄,選擇 ,單擊目標(biāo)RAM角色名稱
在信任策略頁簽,單擊編輯信任策略。詳細(xì)操作,請(qǐng)參見修改RAM角色的信任策略。
在信任策略中
Statement
條目列表新增內(nèi)容示例如下。{ "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
權(quán)限策略,以便免密組件進(jìn)行角色扮演。具體操作,請(qǐng)參見為RAM角色授權(quán)。在角色
查看該RAM角色的ARN。
鏡像倉庫所有者配置RAM角色,信任集群所有者的RAM角色,并授予鏡像拉取權(quán)限。
創(chuàng)建RAM角色。詳細(xì)操作,請(qǐng)參見創(chuàng)建可信實(shí)體為阿里云賬號(hào)的RAM角色。
信任ACS集群RAM角色,允許其扮演倉庫所有者。詳細(xì)操作,請(qǐng)參見修改RAM角色的信任策略。策略文檔示例如下:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "<acs_role_arn>" ] } } ], "Version": "1" }
重要其中
<acs_role_arn>
需要替換為步驟3中獲取的ACS集群RAM角色ARN。為該RAM角色配置鏡像拉取權(quán)限
通過腳本編輯模式創(chuàng)建自定義權(quán)限策略,策略文檔內(nèi)容如下,推薦策略名稱為
AliyunACRBasicAccess
。具體操作,請(qǐng)參見創(chuàng)建自定義權(quán)限策略。{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
為該RAM角色授予
AliyunACRBasicAccess
權(quán)限。具體操作,請(qǐng)參見為RAM角色授權(quán)。
[可選] 可以為該RAM角色設(shè)置角色最大會(huì)話時(shí)間,有效范圍為3600秒到43200秒。如果設(shè)置角色最大會(huì)話時(shí)間,下文配置AcrInstanceInfo時(shí)也應(yīng)當(dāng)設(shè)置參數(shù)expireDuration。
在角色
查看該RAM角色的ARN。
在免密組件配置中勾選是否開啟RRSA。并配置AcrInstanceInfo。
按照如下配置內(nèi)容,修改AcrInstanceInfo。
配置項(xiàng)鍵
配置項(xiàng)說明
配置項(xiàng)值
是否開啟RRSA
勾選后即可開啟RRSA(需完成RRSA相關(guān)配置)。
勾選
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
免密組件生成的臨時(shí)憑證的有效期。
重要expireDuration的值應(yīng)不大于步驟4中設(shè)置的鏡像倉庫所有者角色最大會(huì)話時(shí)間。
默認(rèn)為3600。取值范圍為[3600, 43200],單位為秒。