全部產品
Search
文件中心

Container Service for Kubernetes:使用免密組件同帳號拉取ACR企業版執行個體鏡像

更新時間:Aug 31, 2025

免密組件可自動化完成拉取鏡像時的認證流程,跳過配置imagePullSecrets的重複操作。本文介紹免密組件安裝、配置、使用的流程及注意事項。

工作原理

使用ACR作為鏡像來源時,若未配置公開匿名拉取功能,ACK叢集在每次拉取鏡像時需提供使用者名稱和密碼以完成認證。常用的解決方案是將使用者名稱和密碼儲存在 Secret 中,但這會帶來以下問題:

  • Secret是經過Base64編碼的明文,存在泄露風險。

  • 需要為每個工作負載手動填入imagePullSecrets

  • Secret不支援跨命名空間(Namespace)使用。

免密組件的工作流程如下:

  1. 免密組件從ACR執行個體擷取臨時帳號和臨時密碼。

  2. 組件將臨時帳號和密碼儲存到Secret中。

  3. 組件將Secret關聯到組件配置中指定的ServiceAccount。

  4. 使用這些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專有叢集

功能特性

  • 無需自行營運

  • 支援通過RRSA跨帳號拉取鏡像

如需升級叢集,請參見手動升級叢集

前提條件

  • 叢集版本受到免密組件的支援,請參見上方的表格。

  • Container RegistryACR執行個體為企業版。

    重要
    • 免密組件目前僅支援與ACR企業版及2024年09月08日及更早建立的ACR個人版配合使用。如無法使用免密組件,請參見如何使用imagePullSecrets

  • 已為免密組件使用的RAM角色授權

  • 打通ACR企業版執行個體與ACK叢集的網路連接。

    配置網路連接

    在拉取鏡像前,需要確保ACR企業版執行個體與ACK叢集雙方的網路連通和相關網域名稱可解析。在同帳號拉取鏡像時,有下列實現方式:

    • ACR VPC存取控制:當ACR企業版執行個體與ACK叢集處於同一地區時,ACK叢集可通過VPC訪問ACR執行個體。具體操作,請參見網路存取控制

    • VPC對等串連:如果ACR執行個體與ACK叢集不處於同一VPC,可使用VPC對等串連打通兩個VPC,使ACK叢集可以訪問ACR企業版執行個體。VPC處於同一地區時,對等串連功能不收取費用,處於不同地區時收費,請參見計費說明。但使用功能需要兩個VPC網段不能重疊,如果兩個VPC中已使用的網段大量重疊,需要對現存網路架構進行改造。

      VPC對等串連操作步驟

      1. 為ACR執行個體綁定VPC內網網域名稱解析

        打通ACR企業版執行個體與VPC後,才能在VPC內通過內網網域名稱訪問企業版執行個體。完成配置後需要擷取VPC ID和ACR企業版執行個體內網訪問IP地址。
      2. 擷取ACR執行個體相關網域名稱資訊和IP地址

        擷取訪問ACR企業版執行個體使用的認證服務網域名稱和IP地址、關聯OSS Bucket網域名稱和IP地址。
      3. 建立VPC對等串連並配置路由表

        需要在VPC對等串連的兩端添加指向對端的路由條目以實現ACK叢集綁定的VPC和ACR企業版執行個體綁定的VPC私網互連。ACK叢集綁定的VPC對等串連端還需要配置認證服務IP地址、關聯OSS BucketIP地址的路由條目。
      4. 為ACK叢集解析ACR執行個體網域名稱

        通過添加內網DNS解析節點池自訂資料指令碼批量修改/etc/hosts檔案等方式,為ACK叢集將ACR執行個體網域名稱解析為ACR執行個體內網訪問IP地址,從而通過VPC對等連線路由條目轉寄到ACR執行個體綁定的VPC。
    • 公網:ACR企業版執行個體與ACK叢集獲得公網訪問能力後,也可通過公網傳輸鏡像。具體操作,請參見配置ACR公網存取控制為叢集開啟訪問公網的能力

使用託管免密組件

步驟一:安裝組件

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 組件管理頁面,選擇安全頁簽,找到aliyun-acr-credential-helper託管卡片,單擊安裝

  4. 安裝組件 aliyun-acr-credential-helper頁面,可以看到AcrInstanceInfo配置以及一些其他選項。AcrInstanceInfo對應的是組件關聯的每個ACR執行個體相關的配置。其他選項為組件配置,如無需修改組件監聽命名空間或ServiceAccount,保持預設即可。

    組件安裝完成後,在組件管理頁面,單擊aliyun-acr-credential-helper託管卡片上的配置,可變更組件配置。

    image

    關聯ACR執行個體配置:

    AcrInstanceInfo

    說明

    InstanceId

    ACR執行個體ID,可通過Container Registry控制台擷取。

    重要

    使用個人版ACR執行個體時請留空,使用企業版ACR執行個體時必填。

    regionId

    ACR執行個體所在地區的RegionId,可通過Container Registry控制台擷取。

    重要

    跨地區拉取鏡像時必填。

    domains

    免密外掛程式訪問ACR執行個體所使用的網域名稱。預設為上方填入的ACR執行個體的所有網域名稱(公網、VPC)。若要指定個別網域名稱,多個以英文半形逗號(,)分隔。

    跨帳號拉取鏡像情境配置

    適用於跨帳號拉取鏡像的情境。如無需求,請留空。

    assumeRoleARN

    同帳號拉取時無需配置,如需跨帳號拉取請參見跨帳號拉取鏡像

    expireDuration

    rrsaRoleARN

    rrsaOIDCProviderRoleARN

    組件配置

    配置項

    說明

    是否開啟RRSA

    勾選後即可開啟RRSA,同帳號拉取時無需配置,如需跨帳號拉取請參見跨帳號拉取鏡像

    watchNamespace

    期望能免密拉取鏡像的命名空間,預設值default。當取值為all時,表示期望所有命名空間均能免密拉取。如需指定多個命名空間,請使用英文半形逗號(,)分隔。推薦配置業務命名空間,盡量避免配置all或者叢集系統組件相關的命名空間,以免影響叢集系統組件鏡像的拉取。

    serviceAccount

    使免密組件託管版作用於指定的Service Account。預設值Default。取值為Default時,會作用於所有指定命名空間的預設Service Account。如果設定為(*), 表示支援指定命名空間下的所有ServiceAccount。如果需要配置多個,請使用以英文半形逗號(,)分隔。

    expiringThreshold

    組件內憑證到期閾值。預設值為15m。建議使用15min。即在憑證到期前15m組件自動更新憑證。

    notifyEmail

    無需配置。

步驟二:拉取鏡像

安裝並配置完成免密組件後,在建立工作負載時指定免密組件已關聯的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

使用自行營運免密組件

步驟一:安裝組件

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 組件管理頁面,單擊安全頁簽,找到aliyun-acr-credential-helper,單擊安裝

  4. 參數配置頁面,通過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角色授予特定許可權。

    組件模式選擇workerRole

    組件許可權模式選擇workerRole時,叢集Worker RAM角色必須擁有以下許可權。授權具體操作,請參見為RAM角色授權

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "cr:GetAuthorizationToken",
                    "cr:ListInstanceEndpoint",
                    "cr:PullRepository"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
    重要

    如需通過角色扮演跨帳號拉取鏡像,請選擇此模式。

步驟二:變更組件配置(添加ACR執行個體)

免密組件安裝完成後,在拉取鏡像前,需要通過控制台或kubectl對免密組件配置項acr-configuration進行配置以添加ACR執行個體。

控制台

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇組態管理 > 配置項

  2. 配置項頁面頂部的命名空間下拉式清單,選擇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執行個體的所有網域名稱。若要指定個別網域名稱,多個以英文半形逗號(,)分隔。

    跨地區拉取配置樣本

    使用多個不同地區的ACR執行個體時,需為每個ACR執行個體指定ID與地區。

    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"      

    service-account

    免密組件關聯的ServiceAccount,多個ServiceAccount以英文半形逗號(,)分隔。取值為default時,組件會關聯每個watch-namespace中填入的指定命名空間的預設ServiceAccount。取值為“*”時,組件會關聯指定命名空間的所有ServiceAccount。

kubectl

  1. 執行以下命令,參考下列配置說明,編輯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

配置項

說明

enable

是否開啟Webhook功能。

  • true:開啟。

  • false:不開啟。

failure-policy

當本功能出現異常時,對ServiceAccount的處理策略。

  • Ignore:忽略異常,ServiceAccount正常建立完成(但可能不會附上可拉取鏡像的Secret)。

  • Fail:異常時中斷ServiceAccount的建立(不推薦,可能導致業務部署失敗)。

重要

受叢集API Server的限制,當timeout-seconds設定為15failure-policy設定為Fail,持續每秒建立10個ServiceAccount時,會出現建立ServiceAccount失敗的情況。

timeout-seconds

本功能的單個ServiceAccount建立請求處理逾時時間長度,超出該時間長度則按照failure-policy配置進行反饋。預設值為10,單位秒(s)。

常見問題

配置免密組件後仍然拉取失敗

一個可能的原因是免密組件配置錯誤,例如:

  • 免密組件中的執行個體資訊與ACR執行個體不符。

  • 拉取鏡像使用的鏡像地址與免密組件中執行個體資訊的網域名稱不符。

請按照本文中的操作進行排查。

如組件配置正確時,仍出現了拉取失敗情況,可能是因工作負載YAML中手動填入的imagePullSecrets與免密組件產生衝突。請手動刪除imagePullSecrets欄位,並刪除舊Pod重建以解決此問題。

如何使用imagePullSecrets

2024年09月09日及之後建立的ACR個人版不支援使用免密組件。使用建立的ACR個人版執行個體時,建議通過Secret儲存使用者名稱與登入密碼的方式,在imagePullSecrets欄位中使用。

重要
  • 免密組件不支援與手動填入imagePullSecrets欄位同時使用。

  • Secret需與工作負載處於同一命名空間。

使用imagePullSecrets樣本

執行以下命令並替換其中的參數,即可通過使用者名稱和密碼建立密鑰Secret。

kubectl create secret generic image-secret-1 \
  --docker-server=<registry-server> \
  --docker-username=<name> \
  --docker-password=<password> \
  --docker-email=<email>

在工作負載中使用密鑰

apiVersion: apps/v1
kind: Deployment 
metadata:
  name: nginx-test
  namespace: default 
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      imagePullSecrets:
      - name: image-secret-1  # 使用上一步建立的Secret
      containers:
      - name: nginx 
        image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest  # 替換為ACR連結

相關文檔