使用免密組件拉取容器鏡像
使用aliyun-acr-credential-helper組件,您可以配置ACK集群,以便在拉取企業(yè)版私有鏡像時(shí)自動(dòng)獲取訪問憑據(jù),無需手動(dòng)提供用戶名和密碼,從而實(shí)現(xiàn)在阿里云容器服務(wù)ACK集群中免密拉取容器鏡像服務(wù)ACR私有鏡像。
前提條件
已創(chuàng)建Kubernetes托管版集群或ACK專有集群。
使用說明
免密組件通過讀取ACK集群內(nèi)kube-system命名空間中acr-configuration的配置,進(jìn)行私有鏡像拉取。免密組件配置完成后將會(huì)在集群中自動(dòng)創(chuàng)建Secret,并關(guān)聯(lián)到配置中已指定的ServiceAccount。任何使用此ServiceAccount的Pod都會(huì)默認(rèn)使用免密組件生成的Secret進(jìn)行鏡像拉取,從而實(shí)現(xiàn)免密拉取鏡像的效果。
針對(duì)新創(chuàng)建ServiceAccount部署應(yīng)用的場(chǎng)景(例如部署Helm Chart),免密組件ServiceAccount關(guān)聯(lián)Secret可能存在延遲,建議使用Webhook功能。更多信息,請(qǐng)參見常見問題。
免密組件拉取私有鏡像的使用條件如下。
類別 | 說明 |
鏡像 |
|
集群及版本 |
|
注意事項(xiàng)
類別 | 注意事項(xiàng) |
拉取憑證imagePullSecrets |
|
ServiceAccount |
|
地域 | 確認(rèn)Kubernetes集群所屬地域與要拉取的鏡像所在地域是否一致。 默認(rèn)配置僅可以拉取本地域的鏡像。如需跨地域拉取鏡像,請(qǐng)參見下文場(chǎng)景二:配置跨地域拉取鏡像。 |
YAML格式 | 修改kube-system命名空間中的acr-configuration配置項(xiàng)時(shí),請(qǐng)確認(rèn)縮進(jìn)與給出的場(chǎng)景示例是否相同。建議直接復(fù)制對(duì)應(yīng)場(chǎng)景的YAML內(nèi)容到編輯器,修改對(duì)應(yīng)的值,然后直接應(yīng)用到集群,以保證YAML格式的正確性。 |
步驟一:安裝免密組件
如果您已安裝免密組件,請(qǐng)確保該組件為最新版本。否則,請(qǐng)升級(jí)該組件。此組件升級(jí)不會(huì)對(duì)業(yè)務(wù)造成影響。具體操作,請(qǐng)參見管理組件。關(guān)于aliyun-acr-credential-helper組件更多信息,請(qǐng)參見aliyun-acr-credential-helper。
免密組件aliyun-acr-credential-helper升級(jí)至最新版本后,會(huì)切換該組件所依賴的RAM角色。為兼容新老用戶的使用習(xí)慣,該組件提供了配置項(xiàng),您可以自定義依賴于哪個(gè)RAM角色。關(guān)于切換RAM角色對(duì)使用方式的影響,請(qǐng)參見【產(chǎn)品變更】關(guān)于變更aliyun-acr-credential-helper組件依賴權(quán)限的公告。
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁(yè)面,單擊安全頁(yè)簽,找到aliyun-acr-credential-helper,單擊安裝。
在參數(shù)配置頁(yè)面,組件使用的權(quán)限模式保持默認(rèn)值auto,然后單擊確定。
當(dāng)ACK托管版集群升級(jí)到最新版本,aliyun-acr-credential-helper組件提供了tokenMode配置項(xiàng),組件安裝后也可以進(jìn)行修改。組件修改后,Pod將會(huì)重建。2023年04月03日之前創(chuàng)建的集群為老集群,2023年04月03日及之后創(chuàng)建的集群為新集群。具體配置項(xiàng)內(nèi)容如下。
tokenMode
說明
auto
默認(rèn)值,表示自動(dòng)確定是否使用managedRole。新集群使用managedRole模式,老集群使用workerRole模式。
managedRole
使用managedRole模式。
workerRole
使用workerRole模式。
步驟二:修改配置項(xiàng)
企業(yè)版的容器鏡像服務(wù)參考如下配置,個(gè)人版請(qǐng)參見如何拉取個(gè)人版實(shí)例中的私有鏡像。
免密組件安裝完成后,在拉取鏡像時(shí),需要對(duì)免密組件配置項(xiàng)acr-configuration進(jìn)行配置。
通過控制臺(tái)配置
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇配置管理 > 配置項(xiàng)。
在配置項(xiàng)頁(yè)面頂部的命名空間下拉列表,選擇kube-system,然后找到配置項(xiàng)acr-configuration,設(shè)置配置項(xiàng)的值。
如果您沒有acr-configuration配置項(xiàng),請(qǐng)參見創(chuàng)建配置項(xiàng)。關(guān)于如何更新配置項(xiàng),請(qǐng)參見修改配置項(xiàng)。
單擊其右側(cè)的編輯,設(shè)置配置項(xiàng)鍵和值。
單擊其右側(cè)的YAML編輯,設(shè)置配置項(xiàng)鍵和值。
通過kubectl命令行配置
執(zhí)行以下命令,打開acr-configuration配置項(xiàng)的編輯頁(yè)。
kubectl edit cm acr-configuration -n kube-system
根據(jù)實(shí)際情況設(shè)置acr-configuration配置項(xiàng)的值。
acr-configuration配置項(xiàng)的鍵和值說明如下。
配置項(xiàng)鍵
配置項(xiàng)鍵說明
配置項(xiàng)值
service-account
使免密組件作用于指定的服務(wù)賬號(hào)。
默認(rèn)為default。
說明如果要配置多個(gè)請(qǐng)以英文半角逗號(hào)(,)分隔。如果設(shè)置為
“*”
, 表示支持指定命名空間下的所有ServiceAccount。acr-registry-info
容器鏡像的實(shí)例信息數(shù)組,YAML多行字符串格式,每個(gè)實(shí)例以三元組方式配置。
說明實(shí)例信息三元組:
instanceId:實(shí)例ID,企業(yè)版實(shí)例必須配置此項(xiàng)。
regionId:可選,默認(rèn)為本地地域。
domains:可選,默認(rèn)為相應(yīng)實(shí)例的所有域名。若要指定個(gè)別域名,多個(gè)以英文半角逗號(hào)(,)分隔。
企業(yè)版容器鏡像實(shí)例,配置示例如下:
- instanceId: <cri-instanceId> regionId: "cn-hangzhou" domains: "xxx.com,yyy.com"
watch-namespace
期望能免密拉取鏡像的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)組件鏡像的拉取。
expiring-threshold
本地緩存憑證過期閾值。
默認(rèn)值為15m。
說明建議使用15min。即在緩存過期15分鐘前進(jìn)行憑證更新。
步驟三:根據(jù)實(shí)際場(chǎng)景配置拉取鏡像
不同場(chǎng)景下,私有鏡像拉取權(quán)限的配置方式不同。
配置策略 | 適用場(chǎng)景 | |
默認(rèn)拉取策略,適用于同賬號(hào)場(chǎng)景。 | ||
跨地域場(chǎng)景。 | ||
使用RRSA進(jìn)行跨賬號(hào)拉取鏡像 | 跨賬號(hào)場(chǎng)景。 | |
使用角色扮演進(jìn)行跨賬號(hào)拉取鏡像 |
| |
使用RAM用戶(子賬號(hào))的AccessKey ID和AccessKey Secret進(jìn)行跨賬號(hào)拉取鏡像 | 跨賬號(hào)場(chǎng)景。 使用RAM用戶的AK(AccessKey ID)和SK(AccessKey Secret)進(jìn)行鏡像拉取時(shí),需要將訪問密鑰寫入ConfigMap,此方式存在一定的密鑰泄露風(fēng)險(xiǎn)。請(qǐng)確保AccessKey ID和AccessKey Secret所屬的RAM角色僅擁有拉取容器鏡像的相關(guān)權(quán)限。推薦使用其他兩種跨賬號(hào)拉取方式。 |
您可以根據(jù)實(shí)際場(chǎng)景需要,選擇以下三種場(chǎng)景中對(duì)應(yīng)的場(chǎng)景進(jìn)行配置。
場(chǎng)景一:配置同賬號(hào)拉取鏡像
創(chuàng)建自定義權(quán)限策略,策略內(nèi)容如下。具體操作,請(qǐng)參見步驟一:創(chuàng)建自定義權(quán)限策略。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
為集群的Worker RAM角色授權(quán)。具體操作,請(qǐng)參見步驟二:為集群的Worker RAM角色授權(quán)。
設(shè)置acr-configuration配置項(xiàng),即修改acr-configuration配置項(xiàng)中ConfigMap的配置,用于拉取企業(yè)版的私有鏡像。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email:"c*@aliyuncs.com" acr-registry-info:| - instanceId: "cri-instanceId" regionId: "cn-hangzhou" domains: "instance.default.domain.com,instance.custom.domain.com"
場(chǎng)景二:配置跨地域拉取鏡像
如需拉取的鏡像與當(dāng)前ACK集群不屬于同一地域時(shí),您需要修改配置項(xiàng)acr-configuration中的ConfigMap。
開啟跨地域拉取鏡像后,免密組件將通過公網(wǎng)調(diào)用目標(biāo)地域的OpenAPI,集群必須具有出公網(wǎng)能力。
例如,默認(rèn)倉(cāng)庫(kù)同時(shí)拉取北京地域與杭州地域的鏡像時(shí),需要按照以下內(nèi)容,修改acr-configuration配置項(xiàng)中ConfigMap的配置。
data:
service-account: "default"
watch-namespace: "all"
expiring-threshold: "15m"
notify-email:"c*@aliyuncs.com"
acr-registry-info: |
- instanceId: "cri-instanceId"
regionId: "cn-beijing"
- instanceId: "cri-instanceId"
regionId: "cn-hangzhou"
場(chǎng)景三:配置跨賬號(hào)拉取鏡像
您可以通過以下三種方式進(jìn)行跨賬號(hào)拉取鏡像。
使用RRSA進(jìn)行跨賬號(hào)拉取:A用戶扮演B用戶的角色拉取B用戶的私有鏡像。
使用角色扮演進(jìn)行跨賬號(hào)拉取:A用戶扮演B用戶的角色拉取B用戶的私有鏡像。
使用RAM用戶(子賬號(hào))的AK及SK進(jìn)行跨賬號(hào)拉取:A用戶使用B用戶的子賬號(hào)拉取B用戶的私有鏡像。
使用RRSA進(jìn)行跨賬號(hào)拉取
基于適用于服務(wù)賬戶的RAM角色(RAM Roles for Service Accounts,簡(jiǎn)稱RRSA)功能,可以在集群內(nèi)為組件實(shí)現(xiàn)Pod維度的權(quán)限隔離。
RRSA功能目前僅支持在1.22及以上版本的集群(即ACK標(biāo)準(zhǔn)版、ACK Pro版、ACK Serverless集群基礎(chǔ)版和ACK Serverless集群Pro版)中拉取ACR企業(yè)版實(shí)例(基礎(chǔ)版,標(biāo)準(zhǔn)版,高級(jí)版)的鏡像。
開啟RRSA功能需要將組件升級(jí)到v23.02.06.1-74e2172-aliyun或以上版本。
啟用免密插件的RRSA功能首先需要在集群基本信息中啟用RRSA,再進(jìn)行免密插件RRSA的相關(guān)配置。若操作順序顛倒,在配置完成后,則需要?jiǎng)h除免密插件的Pod,RRSA功能才會(huì)生效。
啟用集群的RRSA功能。具體操作,請(qǐng)參見啟用RRSA功能。
集群中RRSA功能開啟后,在基本信息頁(yè)簽的安全與審計(jì)區(qū)域,將鼠標(biāo)懸浮至RRSA OIDC右側(cè)已開啟上面,即可查看提供商的URL鏈接和ARN信息。
配置跨賬號(hào)RAM用戶的容器鏡像服務(wù)資源訪問權(quán)限。
集群開啟RRSA功能后,需要按照以下步驟進(jìn)行配置。假設(shè)A用戶為集群所有者,B用戶為容器鏡像服務(wù)實(shí)例所有者,現(xiàn)在需要授權(quán)A用戶的集群具備訪問B用戶容器鏡像服務(wù)資源的權(quán)限。
配置A用戶的RAM角色
在A用戶中創(chuàng)建一個(gè)角色,添加AliyunSTSAssumeRoleAccess權(quán)限策略,授予這個(gè)角色具有角色扮演的權(quán)限。按照如下修改其信任策略。
將示例中的
<oidc_issuer_url>
替換為上一步獲取的當(dāng)前集群中OIDC提供商的URL。將示例中的
<oidc_provider_arn>
替換為上一步獲取的當(dāng)前集群OIDC提供商的ARN。
{ "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>" ] } } ], "Version": "1" }
配置B用戶的RAM角色
在B用戶中創(chuàng)建一個(gè)擁有ACR相關(guān)權(quán)限的角色,選擇信任策略管理,添加A用戶角色ARN。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ <A用戶創(chuàng)建角色的ARN> ] } } ], "Version": "1" }
然后對(duì)B用戶的角色添加如下權(quán)限策略,授予這個(gè)角色獲取實(shí)例信息及拉取鏡像權(quán)限。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
該RAM角色可以設(shè)置角色最大會(huì)話時(shí)間,可設(shè)置時(shí)間范圍為3600秒到43200秒,而角色會(huì)話時(shí)間在下文的配置項(xiàng)中的expireDuration也需要設(shè)置。推薦此處取值的設(shè)置和配置項(xiàng)的expireDuration的值一致。允許expireDuration小于等于角色最大會(huì)話時(shí)間。
設(shè)置acr-configuration配置項(xiàng)
按照如下配置內(nèi)容,修改acr-configuration配置項(xiàng)中ConfigMap的配置。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email: "c*@aliyuncs.com" acr-registry-info: - instanceId: "cri-xxx" regionId: "cn-hangzhou" domains: "instance.default.domain.com,instance.custom.domain.com" rrsaRoleARN: aUserRoleARN rrsaOIDCProviderRoleARN: aUserClusterOIDCProviderRoleARN assumeRoleARN: bUserRoleARN expireDuration: 3600 rrsa: enable: true
配置項(xiàng)鍵
配置項(xiàng)說明
配置項(xiàng)值
rrsaRoleARN
上文中A用戶創(chuàng)建的角色的ARN。
acs:ram::aaa
rrsaOIDCProviderRoleARN
上文中A用戶ACK控制臺(tái)集群基本信息中的提供商ARN。
acs:ram::bbb
assumeRoleARN
上文中B用戶創(chuàng)建的角色的ARN。
acs:ram::ccc
expireDuration
上文中B用戶創(chuàng)建的角色的會(huì)話時(shí)間,等同于免密組件生成的臨時(shí)憑證的有效期。
重要expireDuration的值不應(yīng)大于B用戶創(chuàng)建角色的最大會(huì)話時(shí)間。
默認(rèn)為3600。取值范圍為[3600, 43200],單位為秒。
同時(shí)需要將B用戶創(chuàng)建角色的最大會(huì)話時(shí)間調(diào)整為43200。
使用角色扮演進(jìn)行跨賬號(hào)拉取
配置原則如下:
B用戶(RAM角色)可以拉取指定私有倉(cāng)庫(kù)下的私有鏡像(B用戶RAM角色有cr.*相關(guān)的權(quán)限)。
B用戶(RAM角色)允許讓A用戶下的ACK Worker RAM角色扮演(信任策略)。
A用戶下的ACK集群的Worker RAM角色扮演B用戶(RAM角色)的權(quán)限(AliyunAssumeRoleAccess)。
設(shè)置A用戶下的Worker RAM角色扮演B用戶(ConfigMap中的assumeRoleARN)。
創(chuàng)建B用戶的受信實(shí)體為阿里云賬號(hào)類型的RAM角色,并確保該RAM角色擁有拉取B用戶私有鏡像的權(quán)限。
創(chuàng)建RAM角色。具體操作請(qǐng)參見創(chuàng)建可信實(shí)體為阿里云賬號(hào)的RAM角色。
通過腳本編輯模式創(chuàng)建如下自定義RAM角色權(quán)限策略。具體操作,請(qǐng)參見創(chuàng)建自定義權(quán)限策略。
重要請(qǐng)確保該RAM角色有cr.*的相關(guān)權(quán)限。
``` { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": [ "*" ], "Effect": "Allow" } ```
為新創(chuàng)建的RAM角色授予新創(chuàng)建的自定義RAM角色權(quán)限策略。具體操作,請(qǐng)參見為RAM角色授權(quán)。
在創(chuàng)建的B用戶的RAM角色上配置信任策略,允許A用戶(需要拉取B用戶下的私有鏡像)的ACK集群的Worker RAM角色來扮演B用戶。
查看A用戶的ACK集群的Worker RAM角色的ARN信息。
查看ARN信息具體步驟,請(qǐng)參見如何查看RAM角色的ARN?。
配置信任策略。
在RAM控制臺(tái)左側(cè)導(dǎo)航欄,單擊角色,找到目標(biāo)RAM角色并單擊RAM角色名稱。
在RAM角色基本信息頁(yè),單擊信任策略管理頁(yè)簽,然后使用A用戶的Worker RAM角色的ARN修改信任策略。
確認(rèn)A用戶的Worker RAM角色擁有AssumeRole權(quán)限。具體操作,請(qǐng)參見查看權(quán)限策略基本信息。
調(diào)整組件配置,新增assumeRoleARN配置。
配置內(nèi)容為您在B用戶下新建RAM角色的ARN。關(guān)于查看ARN信息的具體步驟,請(qǐng)參見如何查看RAM角色的ARN?。acr-configuration配置示例如下。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email:"c*@aliyuncs.com" acr-registry-info: | - instanceId: "" regionId: "cn-beijing" domains: "registry.cn-beijing.aliyuncs.com" assumeRoleARN: "acs:ram::.*:role/kubernetesworkerrole-test" expireDuration: 3600
使用RAM用戶(子賬號(hào))的AK及SK進(jìn)行跨賬號(hào)拉取
創(chuàng)建一個(gè)RAM用戶并為該用戶添加cr鏡像拉取權(quán)限。關(guān)于配置cr鏡像拉取權(quán)限的具體操作,請(qǐng)參見場(chǎng)景三:配置跨賬號(hào)拉取鏡像。
配置kube-system命名空間中的配置項(xiàng)acr-configuration,并填入創(chuàng)建的RAM用戶的訪問密鑰AccessKey ID和AccessKey Secret。
此方式可以使免密組件直接使用創(chuàng)建的RAM用戶拉取私有鏡像。查看訪問密鑰的具體步驟,請(qǐng)參見查看RAM用戶的AccessKey信息。
acr-configuration配置示例如下。
data: service-account: "default" watch-namespace: "all" expiring-threshold: "15m" notify-email:"c*@aliyuncs.com" acr-registry-info: | - instanceId: "" customAccessKey: "xxxxx" // 此處填寫已創(chuàng)建的RAM用戶的AccessKey ID。 customAccessKeySecret: "xxxxxx" // 此處填寫已創(chuàng)建的RAM用戶的AccessKey Secret。
常見問題
如何拉取個(gè)人版實(shí)例中的私有鏡像
針對(duì)個(gè)人版遷移到企業(yè)版過程中需要在過渡階段同時(shí)拉取企業(yè)版實(shí)例及個(gè)人版實(shí)例私有鏡像的場(chǎng)景,您需要按照如下配置示例修改acr-configuration
配置項(xiàng)。若您想使用個(gè)人版實(shí)例推送拉取鏡像,請(qǐng)參見使用個(gè)人版實(shí)例推送拉取鏡像。
修改acr-configuration配置項(xiàng)前,請(qǐng)刪除#-instanceId
值中的#
。
data:
service-account: "default"
watch-namespace: "all"
expiring-threshold: "15m"
notify-email:"cs@aliyuncs.com"
acr-registry-info: |
- instanceId: ""
regionId: cn-xxxx
如何開啟ServiceAccount創(chuàng)建即時(shí)使用功能
啟用Webhook功能后,ServiceAccount在創(chuàng)建時(shí)會(huì)即時(shí)注入Secret,滿足特定場(chǎng)景下ServiceAccount無延遲注入Secret的需求。例如,通過Helm Chart同時(shí)創(chuàng)建ServiceAccount和Deployment的場(chǎng)景,其他場(chǎng)景不推薦開啟該功能。
開啟ServiceAccount創(chuàng)建即時(shí)使用功能需要將免密組件升級(jí)到v23.02.06.1-74e2172-aliyun或以上版本。
免密組件升級(jí)為最新版本后,您需要按照如下配置示例修改acr-configuration配置項(xiàng)。
data:
webhook-configuration: |
enable: true
failure-policy: Ignore
timeout-seconds: 10
表 1. 配置項(xiàng)說明
配置項(xiàng)鍵 | 配置項(xiàng)鍵說明 | 配置項(xiàng)值 |
enable | 是否開啟本功能。 | 可選true或false。默認(rèn)為false,即不開啟。 |
failure-policy | 當(dāng)本功能出現(xiàn)異常時(shí)的失敗處理策略。 | 可選Ignore或Fail。
受集群APIServer的限制,當(dāng)timeout-seconds設(shè)置為15,failure-policy設(shè)置為Fail,持續(xù)每秒創(chuàng)建10個(gè)ServiceAccount時(shí),會(huì)出現(xiàn)超時(shí)創(chuàng)建ServiceAccount失敗的情況。 |
timeout-seconds | 本功能的單個(gè)ServiceAccount創(chuàng)建請(qǐng)求處理超時(shí)時(shí)長(zhǎng),超出該時(shí)長(zhǎng)則按照failure-policy配置進(jìn)行反饋。 | 默認(rèn)為 10,單位為秒(配置項(xiàng)值無需填寫單位)。 |