使用aliyun-acr-credential-helper組件,您可以配置ACK叢集,以便在拉取企業版私人鏡像時自動擷取訪問憑據,無需手動提供使用者名稱和密碼,從而實現在阿里雲Container ServiceACK叢集中免密拉取Container RegistryACR私人鏡像。
前提條件
使用說明
免密組件通過讀取ACK叢集內kube-system命名空間中acr-configuration的配置,進行私人鏡像拉取。免密組件配置完成後將會在叢集中自動建立Secret,並關聯到配置中已指定的ServiceAccount。任何使用此ServiceAccount的Pod都會預設使用免密組件產生的Secret進行鏡像拉取,從而實現免密拉取鏡像的效果。
針對新建立ServiceAccount部署應用的情境(例如部署Helm Chart),免密組件ServiceAccount關聯Secret可能存在延遲,建議使用Webhook功能。更多資訊,請參見常見問題。
免密組件拉取私人鏡像的使用條件如下。
類別 | 說明 |
鏡像 |
|
叢集及版本 |
|
注意事項
類別 | 注意事項 |
拉取憑證imagePullSecrets |
|
ServiceAccount |
|
地區 | 確認Kubernetes叢集所屬地區與要拉取的鏡像所在地區是否一致。 預設配置僅可以拉取本地區的鏡像。如需跨地區拉取鏡像,請參見下文情境二:配置跨地區拉取鏡像。 |
YAML格式 | 修改kube-system命名空間中的acr-configuration配置項時,請確認縮排與給出的情境樣本是否相同。建議直接複製對應情境的YAML內容到編輯器,修改對應的值,然後直接應用到叢集,以保證YAML格式的正確性。 |
步驟一:安裝免密組件
如果您已安裝免密組件,請確保該組件為最新版本。否則,請升級該組件。此組件升級不會對業務造成影響。具體操作,請參見管理組件。關於aliyun-acr-credential-helper組件更多資訊,請參見aliyun-acr-credential-helper。
免密組件aliyun-acr-credential-helper升級至最新版本後,會切換該組件所依賴的RAM角色。為相容新老使用者的使用習慣,該組件提供了配置項,您可以自訂依賴於哪個RAM角色。關於切換RAM角色對使用方式的影響,請參見【產品變更】關於變更aliyun-acr-credential-helper組件依賴許可權的公告。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面,單擊安全頁簽,找到aliyun-acr-credential-helper,單擊安裝。
在參數配置頁面,組件使用的許可權模式保持預設值auto,然後單擊確定。
當ACK託管版叢集升級到最新版本,aliyun-acr-credential-helper組件提供了tokenMode配置項,組件安裝後也可以進行修改。組件修改後,Pod將會重建。2023年04月03日之前建立的叢集為老叢集,2023年04月03日及之後建立的叢集為新叢集。具體配置項內容如下。
tokenMode
說明
auto
預設值,表示自動確定是否使用managedRole。新叢集使用managedRole模式,老叢集使用workerRole模式。
managedRole
使用managedRole模式。
workerRole
使用workerRole模式。
步驟二:修改配置項
企業版的Container Registry參考如下配置,個人版請參見如何拉取個人版執行個體中的私人鏡像。
免密組件安裝完成後,在拉取鏡像時,需要對免密組件配置項acr-configuration進行配置。
通過控制台配置
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇組態管理 > 配置項。
在配置項頁面頂部的命名空間下拉式清單,選擇kube-system,然後找到配置項acr-configuration,設定配置項的值。
如果您沒有acr-configuration配置項,請參見建立配置項。關於如何更新配置項,請參見修改配置項。
單擊其右側的編輯,設定配置項鍵和值。
單擊其右側的YAML編輯,設定配置項鍵和值。
通過kubectl命令列配置
執行以下命令,開啟acr-configuration配置項的編輯頁。
kubectl edit cm acr-configuration -n kube-system
根據實際情況設定acr-configuration配置項的值。
acr-configuration配置項的鍵和值說明如下。
配置項鍵
配置項鍵說明
配置項值
service-account
使免密組件作用於指定的服務帳號。
預設為default。
說明如果要配置多個請以英文半形逗號(,)分隔, 如果設定為
“*”
, 表示支援指定命名空間下的所有ServiceAccount。acr-registry-info
容器鏡像的執行個體資訊數組,YAML多行字串格式,每個執行個體以三元組方式配置。
說明執行個體資訊三元組:
instanceId:執行個體ID,企業版執行個體必須配置此項。
regionId:可選,預設為本地地區。
domains:可選,預設為相應執行個體的所有網域名稱。若要指定個別網域名稱,多個以英文半形逗號(,)分隔。
企業版容器鏡像執行個體,配置樣本如下:
- instanceId: <cri-instanceId> regionId: "cn-hangzhou" domains: "xxx.com,yyy.com"
watch-namespace
期望能免密拉取鏡像的Namespace。
預設值為default。當取值為all時,表示期望所有Namespace均能免密拉取。如需配置多個Namespace時,以英文半形逗號(,)分隔。
說明推薦配置生效Namespace為您的業務Namespace,盡量避免配置all或者叢集系統組件相關Namespace,以免影響叢集系統組件鏡像的拉取。
expiring-threshold
本機快取憑證到期閾值。
預設值為15m。
說明建議使用15min。即在緩衝到期15分鐘前進行憑證更新。
步驟三:根據實際情境配置拉取鏡像
不同情境下,私人鏡像拉取許可權的配置方式不同。
配置策略 | 適用情境 | |
預設拉取策略,適用於同帳號情境。 | ||
跨地區情境。 | ||
使用RRSA進行跨帳號拉取鏡像 | 跨帳號情境。 | |
使用角色扮演化行跨帳號拉取鏡像 |
| |
使用RAM使用者(子帳號)的AccessKey ID和AccessKey Secret進行跨帳號拉取鏡像 | 跨帳號情境。 使用RAM使用者的AK(AccessKey ID)和SK(AccessKey Secret)進行鏡像拉取時,需要將存取金鑰寫入ConfigMap,此方式存在一定的密鑰泄露風險。請確保AccessKey ID和AccessKey Secret所屬的RAM角色僅擁有拉取容器鏡像的相關許可權。推薦使用其他兩種跨帳號拉取方式。 |
您可以根據實際情境需要,選擇以下三種情境中對應的情境進行配置。
情境一:配置同帳號拉取鏡像
建立自訂權限原則,策略內容如下。具體操作,請參見步驟一:建立自訂權限原則。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
為叢集的Worker RAM角色授權。具體操作,請參見步驟二:為叢集的Worker RAM角色授權。
設定acr-configuration配置項,即修改acr-configuration配置項中ConfigMap的配置,用於拉取企業版的私人鏡像。
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"
情境二:配置跨地區拉取鏡像
如需拉取的鏡像與當前ACK叢集不屬於同一地區時,您需要修改配置項acr-configuration中的ConfigMap。
開啟跨地區拉取鏡像後,免密組件將通過公網調用目標地區的OpenAPI,叢集必須具有出公網能力。
例如,預設倉庫同時拉取北京地區與杭州地區的鏡像時,需要按照以下內容,修改acr-configuration配置項中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"
情境三:配置跨帳號拉取鏡像
您可以通過以下三種方式進行跨帳號拉取鏡像。
使用RRSA進行跨帳號拉取:A使用者扮演B使用者的角色拉取B使用者的私人鏡像。
使用角色扮演化行跨帳號拉取:A使用者扮演B使用者的角色拉取B使用者的私人鏡像。
使用RAM使用者(子帳號)的AK及SK進行跨帳號拉取:A使用者使用B使用者的子帳號拉取B使用者的私人鏡像。
使用RRSA進行跨帳號拉取
基於適用於服務賬戶的RAM角色(RAM Roles for Service Accounts,簡稱RRSA)功能,可以在叢集內為組件實現Pod維度許可權隔離。
RRSA功能目前僅支援在1.22及以上版本的叢集(即ACK標準版、ACK Pro版、ACK Serverless叢集基礎版和ACK Serverless叢集Pro版)中拉取ACR企業版執行個體(基礎版,標準版,進階版)的鏡像。
開啟RRSA功能需要將組件升級到v23.02.06.1-74e2172-aliyun或以上版本。
啟用免密外掛程式的RRSA功能首先需要在叢集基本資料中啟用RRSA,再進行免密外掛程式RRSA的相關配置。若操作順序顛倒,在配置完成後,則需要刪除免密外掛程式的Pod,RRSA功能才會生效。
啟用叢集的RRSA功能。具體操作,請參見啟用RRSA功能。
配置跨帳號RAM使用者的Container Registry資源存取權限。
叢集開啟RRSA功能後,需要按照以下步驟進行配置。假設A使用者為叢集所有者,B使用者為Container Registry執行個體所有者,現在需要授權A使用者的叢集具備訪問B使用者Container Registry資源的許可權。
配置A使用者的RAM角色
在A使用者中建立一個角色,添加AliyunSTSAssumeRoleAccess權限原則,授予這個角色具有角色扮演的許可權。按照如下修改其信任策略。
將樣本中的<oidc_issuer_url>替換為當前叢集中OIDC供應商的URL。該URL可在Container Service管理主控台叢集資訊頁面的基本資料頁簽擷取。
將樣本中的<oidc_provider_arn>替換為當前叢集OIDC供應商的ARN。該ARN可在Container Service管理主控台叢集資訊頁面的基本資料頁簽擷取。
{ "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使用者中建立一個擁有ACR相關許可權的角色,選擇信任策略管理,添加A使用者角色ARN。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ <A使用者建立角色的ARN> ] } } ], "Version": "1" }
然後對B使用者的角色添加如下權限原則,授予這個角色擷取執行個體資訊及拉取鏡像許可權。
{ "Version": "1", "Statement": [ { "Action": [ "cr:GetAuthorizationToken", "cr:ListInstanceEndpoint", "cr:PullRepository" ], "Resource": "*", "Effect": "Allow" } ] }
該RAM角色可以設定角色最大會話時間,可設定時間範圍為3600秒到43200秒,而角色會話時間在下文的配置項中的expireDuration也需要設定。推薦此處取值的設定和配置項的expireDuration的值一致。允許expireDuration小於等於角色最大會話時間。
設定acr-configuration配置項
按照如下配置內容,修改acr-configuration配置項中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
配置項鍵
配置項說明
配置項值
rrsaRoleARN
上文中A使用者建立的角色的ARN。
acs:ram::aaa
rrsaOIDCProviderRoleARN
上文中A使用者ACK控制台叢集基本資料中的供應商ARN。
acs:ram::bbb
assumeRoleARN
上文中B使用者建立的角色的ARN。
acs:ram::ccc
expireDuration
上文中B使用者建立的角色的會話時間,等同於免密組件產生的臨時憑證的有效期間。
重要expireDuration的值不應大於B使用者建立角色的最大會話時間。
預設為3600。取值範圍為[3600, 43200],單位為秒。
同時需要將B使用者建立角色的最大會話時間調整為43200。
使用角色扮演化行跨帳號拉取
使用RAM使用者(子帳號)的AK及SK進行跨帳號拉取
常見問題
如何拉取個人版執行個體中的私人鏡像
針對個人版遷移到企業版過程中需要在過渡階段同時拉取企業版執行個體及個人版執行個體私人鏡像的情境,您需要按照如下配置樣本修改acr-configuration
配置項。若您想使用個人版執行個體推送拉取鏡像,請參見使用個人版執行個體推送拉取鏡像。
修改acr-configuration配置項前,請刪除#-instanceId
值中的#
。
data:
service-account: "default"
watch-namespace: "all"
expiring-threshold: "15m"
notify-email:"cs@aliyuncs.com"
acr-registry-info: |
- instanceId: ""
regionId: cn-xxxx
如何開啟ServiceAccount建立即時使用功能
啟用Webhook功能後,ServiceAccount在建立時會即時注入Secret,滿足特定情境下ServiceAccount無延遲注入Secret的需求。例如,通過Helm Chart同時建立ServiceAccount和Deployment的情境,其他情境不推薦開啟該功能。
開啟ServiceAccount建立即時使用功能需要將免密組件升級到v23.02.06.1-74e2172-aliyun或以上版本。
免密組件升級為最新版本後,您需要按照如下配置樣本修改acr-configuration配置項。
data:
webhook-configuration: |
enable: true
failure-policy: Ignore
timeout-seconds: 10
表 1. 配置項說明
配置項鍵 | 配置項鍵說明 | 配置項值 |
enable | 是否開啟本功能。 | 可選true或false。預設為false,即不開啟。 |
failure-policy | 當本功能出現異常時的失敗處理策略。 | 可選Ignore或Fail。
受叢集APIServer的限制,當timeout-seconds設定為15,failure-policy設定為Fail,持續每秒建立10個ServiceAccount時,會出現逾時建立ServiceAccount失敗的情況。 |
timeout-seconds | 本功能的單個ServiceAccount建立請求處理逾時時間長度,超出該時間長度則按照failure-policy配置進行反饋。 | 預設為 10,單位為秒(配置項值無需填寫單位)。 |