免密組件可自動化完成拉取鏡像時的認證流程,跳過配置imagePullSecrets的重複操作。本文介紹免密組件安裝、配置、使用的流程及注意事項。
工作原理
使用ACR作為鏡像來源時,若未配置公開匿名拉取功能,ACK叢集在每次拉取鏡像時需提供使用者名稱和密碼以完成認證。常用的解決方案是將使用者名稱和密碼儲存在 Secret 中,但這會帶來以下問題:
Secret是經過Base64編碼的明文,存在泄露風險。
需要為每個工作負載手動填入
imagePullSecrets。Secret不支援跨命名空間(Namespace)使用。
免密組件的工作流程如下:
免密組件從ACR執行個體擷取臨時帳號和臨時密碼。
組件將臨時帳號和密碼儲存到Secret中。
組件將Secret關聯到組件配置中指定的ServiceAccount。
使用這些ServiceAccount的工作負載,預設會使用Secret中儲存的臨時帳號和密碼拉取鏡像。
免密組件支援同時管理多個命名空間的ServiceAccount,並根據配置定時更新臨時帳號和密碼,以降低泄露風險,且無需手動在工作負載中填入imagePullSecrets,免密組件不收取費用。
免密組件對比
目前ACK提供了 aliyun-acr-credential-helper 組件,該組件有託管與自行營運兩種形態,同時只能安裝其中一種。兩種版本的詳細對比,請參見下表。
差異項 | aliyun-acr-credential-helper(託管) | aliyun-acr-credential-helper(自行營運) |
支援叢集版本 | 1.22及以上版本的ACK託管叢集、ACK Serverless叢集、ACK Edge叢集 | 1.20及以上版本的ACK託管叢集、ACK專有叢集 |
功能特性 |
|
|
如需升級叢集,請參見手動升級叢集。
前提條件
叢集版本受到免密組件的支援,請參見上方的表格。
Container RegistryACR執行個體為企業版。
重要免密組件目前僅支援與ACR企業版及2024年09月08日及更早建立的ACR個人版配合使用。如無法使用免密組件,請參見如何使用imagePullSecrets。
已為免密組件使用的RAM角色授權。
打通ACR企業版執行個體與ACK叢集的網路連接。
使用託管免密組件
步驟一:安裝組件
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面,選擇安全頁簽,找到aliyun-acr-credential-helper託管卡片,單擊安裝。
在安裝組件 aliyun-acr-credential-helper頁面,可以看到AcrInstanceInfo配置以及一些其他選項。AcrInstanceInfo對應的是組件關聯的每個ACR執行個體相關的配置。其他選項為組件配置,如無需修改組件監聽命名空間或ServiceAccount,保持預設即可。
組件安裝完成後,在組件管理頁面,單擊aliyun-acr-credential-helper託管卡片上的配置,可變更組件配置。

關聯ACR執行個體配置:
AcrInstanceInfo
說明
InstanceId
ACR執行個體ID,可通過Container Registry控制台擷取。
重要使用個人版ACR執行個體時請留空,使用企業版ACR執行個體時必填。
regionId
ACR執行個體所在地區的RegionId,可通過Container Registry控制台擷取。
重要跨地區拉取鏡像時必填。
domains
免密外掛程式訪問ACR執行個體所使用的網域名稱。預設為上方填入的ACR執行個體的所有網域名稱(公網、VPC)。若要指定個別網域名稱,多個以英文半形逗號(,)分隔。
跨帳號拉取鏡像情境配置
適用於跨帳號拉取鏡像的情境。如無需求,請留空。
assumeRoleARN
同帳號拉取時無需配置,如需跨帳號拉取請參見跨帳號拉取鏡像。
expireDuration
rrsaRoleARN
rrsaOIDCProviderRoleARN
步驟二:拉取鏡像
安裝並配置完成免密組件後,在建立工作負載時指定免密組件已關聯的ServiceAccount,即可實現免密拉取鏡像。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccountName: my-service-account # 指定免密組件已經關聯的ServiceAccount
containers:
- name: nginx
image: ******.cn-hangzhou.cr.aliyuncs.com/nginx/nginx:latest # 指定ACR鏡像地址
ports:
- containerPort: 80使用自行營運免密組件
步驟一:安裝組件
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
在組件管理頁面,單擊安全頁簽,找到aliyun-acr-credential-helper,單擊安裝。
在參數配置頁面,通過tokenMode選擇組件許可權模式,然後單擊確認。組件安裝完成後,在拉取鏡像前,請參見步驟二:變更組件配置(添加ACR執行個體)完成組件配置。
tokenMode
說明
auto
(推薦)組件會檢測叢集建立時間,並自動決定許可權模式。叢集在2023年04月03日之前建立將使用workerRole模式,叢集在2023年04月03日及之後建立將使用managedRole模式。
重要aliyun-acr-credential-helper在2023年04月03日後發布的版本中提供了配置項,支援自訂群組件依賴的RAM角色。詳細資料,請參見【產品變更】關於變更aliyun-acr-credential-helper組件依賴許可權的公告。
managedRole
組件將使用前提條件中授權的AliyunCSManagedAcrRole角色擷取許可權。
workerRole
組件將使用叢集Worker RAM角色擷取許可權。需為Worker RAM角色授予特定許可權。
重要如需通過角色扮演跨帳號拉取鏡像,請選擇此模式。
步驟二:變更組件配置(添加ACR執行個體)
免密組件安裝完成後,在拉取鏡像前,需要通過控制台或kubectl對免密組件配置項acr-configuration進行配置以添加ACR執行個體。
控制台
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在配置項頁面頂部的命名空間下拉式清單,選擇kube-system,然後單擊配置項acr-configuration,參考下列說明修改配置。
組件配置
說明
watch-namespace
期望能免密拉取鏡像的命名空間。預設值為default。當取值為all時,表示期望所有命名空間均能免密拉取。配置多個命名空間時以英文半形逗號(,)分隔。推薦配置生效命名空間為業務命名空間,盡量避免配置
all或者叢集系統組件相關的命名空間,以免影響叢集系統組件鏡像的拉取。acr-api-version
保持預設。
expiring-threshold
組件內憑證到期閾值。預設值為
15m。建議使用15min。即在憑證到期前15m組件自動更新憑證。acr-registry-info
容器鏡像的執行個體資訊數組,YAML多行字串格式,每個執行個體以三元組方式配置。
instanceId:ACR執行個體ID,可通過Container Registry控制台擷取。重要使用個人版ACR執行個體時請留空,使用企業版ACR執行個體時必填。
regionId:ACR執行個體所在地區的RegionId。可通過Container Registry控制台擷取。重要跨地區拉取鏡像時必填,請參見下方的配置樣本。
domains:免密外掛程式訪問ACR執行個體所使用的網域名稱。預設填入instanceId中ACR執行個體的所有網域名稱。若要指定個別網域名稱,多個以英文半形逗號(,)分隔。
service-account
免密組件關聯的ServiceAccount,多個ServiceAccount以英文半形逗號(,)分隔。取值為default時,組件會關聯每個watch-namespace中填入的指定命名空間的預設ServiceAccount。取值為
“*”時,組件會關聯指定命名空間的所有ServiceAccount。
kubectl
執行以下命令,參考下列配置說明,編輯
acr-configuration。kubectl edit cm acr-configuration -n kube-system配置項鍵
配置項鍵說明
配置項值
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分鐘前進行憑證更新。
步驟三:拉取鏡像
安裝並配置完成免密組件後,在建立工作負載時指定免密組件已關聯的ServiceAccount,即可實現免密拉取鏡像。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccountName: my-service-account # 指定免密組件已經關聯的ServiceAccount
containers:
- name: nginx
image: ******.cn-hangzhou.cr.aliyuncs.com/nginx/nginx:latest # 指定ACR鏡像地址
ports:
- containerPort: 80如何開啟ServiceAccount建立即時使用功能
開啟ServiceAccount建立即時使用功能需要將免密組件升級到v23.02.06.1-74e2172-aliyun或以上版本。
啟用Webhook功能後,免密組件會通過Webhook監測叢集內ServiceAccount變化。當新的ServiceAccount被建立後,組件會立即為其注入免密Secret。這個功能適用於ServiceAccount建立後需要立即使用的情境,例如,通過Helm Chart同時建立ServiceAccount和Deployment的情境。因對組件效能有一定影響,其他情境中不推薦開啟該功能。
需要開啟此功能,請在acr-configuration中添加下欄欄位:
data:
webhook-configuration: |
enable: true
failure-policy: Ignore
timeout-seconds: 10配置項 | 說明 |
| 是否開啟Webhook功能。
|
| 當本功能出現異常時,對ServiceAccount的處理策略。
重要 受叢集API Server的限制,當 |
| 本功能的單個ServiceAccount建立請求處理逾時時間長度,超出該時間長度則按照 |
常見問題
配置免密組件後仍然拉取失敗
一個可能的原因是免密組件配置錯誤,例如:
免密組件中的執行個體資訊與ACR執行個體不符。
拉取鏡像使用的鏡像地址與免密組件中執行個體資訊的網域名稱不符。
請按照本文中的操作進行排查。
如組件配置正確時,仍出現了拉取失敗情況,可能是因工作負載YAML中手動填入的imagePullSecrets與免密組件產生衝突。請手動刪除imagePullSecrets欄位,並刪除舊Pod重建以解決此問題。
如何使用imagePullSecrets
2024年09月09日及之後建立的ACR個人版不支援使用免密組件。使用建立的ACR個人版執行個體時,建議通過Secret儲存使用者名稱與登入密碼的方式,在imagePullSecrets欄位中使用。
免密組件不支援與手動填入
imagePullSecrets欄位同時使用。Secret需與工作負載處於同一命名空間。
相關文檔
使用免密組件跨帳號拉取鏡像的操作,請參見跨帳號拉取鏡像。
免密組件變更記錄,請參見aliyun-acr-credential-helper。