天天看點

自建Kubernetes叢集如何使用免密元件拉取容器鏡像

aliyun-acr-credential-helper是一個可以在ACK叢集中免密拉取ACR個人版或企業版私有鏡像的元件。該元件會預設安裝在所有ACK叢集中。本文列舉四個場景介紹如何使用免密元件拉取私有鏡像。

前提條件

注意
  • 在Kubernetes資源(例如無狀态應用Deployment)模闆中配置拉取憑證(imagePullSecret)會導緻免密元件失效,如果需使用免密元件,請避免手工配置拉取憑證(imagePullSecret)。
  • 如果部署的Kubernetes資源(例如無狀态應用Deployment)使用了自定義的ServiceAccount,需先調整免密元件配置檔案中Service-Account字段,使其作用于自定義的ServiceAccount,再進行部署資源操作。
  • 在叢集中建立新的Service Account一段時間後,免密插件根據ACK叢集預設權限生成的ACR私有鏡像拉取Token才會更新到應用使用到的Service Account中, 使用Service Account的應用才會使用Token去拉取鏡像。如果建立完Service Account之後立即建立應用則會出現因鑒權失敗無法拉取的情況。
  • 免密插件預設覆寫ACK中所有命名空間中預設的ServiceAccount中的imagePullSecret字段。被覆寫的 ServiceAccount會随着對應kube-system命名空間中acr-configuration配置項中的service-account字段變動而變動。
  • 在修改kube-system命名空間中的acr-configuration配置項時,請确認縮進是否與給出的場景的例子相同。建議直接複制對應場景的YAML内容到編輯器中,修改對應的值然後直接應用到叢集,以保證YAML格式的正确性。

背景資訊

使用免密元件涉及的鏡像及叢集限制如下:

  • 鏡像
    • 支援拉取容器鏡像服務企業版執行個體和個人版執行個體中的私有鏡像。
    • 支援拉取叢集目前使用者容器鏡像服務中的私有鏡像,通過跨賬号授權或AccessKey ID和AccessKey Secret配置可以拉取其他使用者的私有鏡像。
    • 支援跨地域拉取容器鏡像服務中的私有鏡像。
  • 叢集
    • 支援叢集多命名空間免密拉取。
    • 支援的叢集類型:
      • 專有版Kubernetes叢集。
      • 托管版Kubernetes叢集。
      • 注冊叢集
    • 支援的叢集版本:
      • 自建Kubernetes叢集:高于或等于1.11.2的版本預設支援免密拉取鏡像。

步驟一:在自建叢集中配置免密元件RAM權限

在注冊叢集中安裝元件前,您需要在接入叢集中設定AK用來通路雲服務的權限。設定AK前,您需要建立RAM使用者并為其添加通路相關雲資源的權限。

  1. 建立RAM使用者。有關如何建立RAM使用者的具體步驟,請參見 建立RAM使用者
  2. 建立權限政策。有關建立權限政策的具體操作步驟,請參見 建立自定義政策 。請授權RAM權限如下所示:
{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "cr:GetAuthorizationToken",
                "cr:ListInstanceEndpoint",
                "cr:PullRepository"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}      
  1. 為RAM使用者添權重限。有關如何為RAM使用者授權的具體步驟,請參見 為RAM使用者授權
  2. 為RAM使用者建立AK。有關如何為子賬戶建立AK,請參見 擷取AccessKey
  3. 使用AK在自建Kubernetes叢集中建立名為alibaba-addon-secret的Secret資源,步驟二中安裝事件中心相關元件時将自動引用此AK通路對應的雲服務資源。
kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'      

您需要将上述代碼中和替換為您擷取的AK資訊。

步驟二:更新元件并對元件進行配置

在使用免密元件拉取鏡像前,您可能需要更新元件并對元件進行配置,操作步驟如下。

  1. 更新aliyun-acr-credential-helper元件。
    1. 登入 容器服務管理控制台
    2. 在控制台左側導航欄中,單擊叢集。
    3. 在叢集清單頁面,單擊目标叢集操作列下的更多 > 系統元件管理。
    4. 在安全區域,找到aliyun-acr-credential-helper,單擊更新。
  1. 設定acr-configuration配置項。通過控制台方式設定acr-configuration配置項。
    1. 在叢集清單頁面,單擊目标叢集下的詳情。
    2. 在叢集資訊頁面左側導航欄,選擇配置管理 > 配置項。
    3. 在配置項頁面的上方命名空間下拉框中,選擇kube-system,然後找到配置項acr-configuration,然後通過以下兩種方式配置acr-configuration。
      • 方式一:單擊其右側的編輯,設定配置項鍵和值。如果您沒有acr-configuration配置項,請參見 建立配置項 。關于如何更新配置項,請參見 修改配置項
      • 方式二:單擊其右側的YAML編輯,設定配置項鍵和值。
    1. acr-configuration配置項的鍵和值說明如下。
配置項鍵 配置項鍵說明 配置項值
service-account 使免密元件作用于指定的服務賬号。

預設為Default。

說明 如果要配置多個請以逗号分隔, 如果設定為“*”, 表示支援所有命名空間下的所有ServiceAccount。

acr-registry-info

容器鏡像的執行個體資訊數組,YAML多行字元串格式,每個執行個體以三元組方式配置。

說明 執行個體資訊三元組:

  • instanceId:執行個體ID,企業版執行個體必須配置此項。
  • regionId:可選,預設為本地地域。
  • domains:可選,預設為相應執行個體的所有域名。若要指定個别域名,多個以逗号分隔。

預設值為空,表示免密拉取本地地域的預設容器鏡像執行個體倉庫。

針對企業版容器鏡像執行個體,配置示例如下:

- instanceId: cri-xxx
  regionId: cn-hangzhou
  domains: xxx.com,yyy.com      
針對預設版容器鏡像執行個體,配置示例如下:
- instanceId: ""
  regionId: cn-hangzhou
  domains: xxx.com,yyy.com      
watch-namespace 期望能免密拉取鏡像的Namespace。

預設值為Default。

說明 當取值為ALL時,表示期望所有Namespace都能免密拉取。如果需要配置多個Namespace時,以逗号分隔。

expiring-threshold 本地Cache Token過期門檻值。 預設值為15m(建議使用15 m)。
  1. 通過kubectl指令行的方式設定acr-configuration配置項。
    1. 執行以下指令打開acr-configuration配置項的編輯頁。
kubectl edit cm acr-configuration -n kube-system      
    1. 根據實際情況設定acr-configuration配置項的值。企業版和預設版容器鏡像執行個體下設定acr-configuration配置項的示例如下:
      • 企業版
apiVersion: v1
data:
  acr-api-version: "2018-12-01"
  acr-registry-info: |-
    - instanceId: "cri-xxx"
      regionId: "cn-hangzhou"
  expiring-threshold: 15m
  service-account: default
  watch-namespace: all
kind: ConfigMap
metadata:
 name: acr-configuration
  namespace: kube-system
 selfLink: /api/v1/namespaces/kube-system/configmaps/acr-configuration      
      • 預設版
apiVersion: v1
data:
  acr-api-version: "2018-12-01"
  acr-registry-info: |-
    - instanceId: ""
        regionId: "cn-hangzhou"
  expiring-threshold: 15m
  service-account: default
  watch-namespace: all
kind: ConfigMap
metadata:
 name: acr-configuration
 namespace: kube-system
 selfLink: /api/v1/namespaces/kube-system/configmaps/acr-configuration      

場景一:拉取個人版執行個體和企業執行個體的私有鏡像

ACK支援同時拉取企業版和個人版的私有鏡像,隻拉取企業版的私有鏡像,隻拉取個人版的私有鏡像。根據您的使用場景,按照以下方式修改配置項acr-configuration中的configMap。配置步驟請參見上述

配置元件

。以下為配置内容:

  • 配置拉取企業版的私有鏡像。
data:    
    service-account: "default"    
    watch-namespace: "all"    
    expiring-threshold: "15m"    
    notify-email: "[email protected]"    
    acr-registry-info: |      
      - instanceId: "cri-xxx"
        regionId: "cn-hangzhou"         
        domains: "xxx.com","yyy.com"      
  • 配置拉取個人版的私有鏡像。
data:     
    service-account: "default"
    watch-namespace: "all"
    expiring-threshold: "15m"
    notify-email: "[email protected]"
    acr-registry-info: |
      - instanceId: ""
        regionId: "cn-hangzhou"
        domains: "xxx.com","yyy.com"      
  • 配置同時拉取個人版和企業版的私有鏡像。
data:
    service-account: "default"
    watch-namespace: "all"
    expiring-threshold: "15m"
    notify-email: "[email protected]"
    acr-registry-info: |
      - instanceId: ""
      - instanceId: "cri-xxxx"      

場景二:配置跨地域拉取鏡像權限

如果需要拉取的鏡像與目前ACK叢集不屬于同一地域的時候,需要修改配置項acr-configuration中的configMap。

例如,預設倉庫同時拉取北京地域與杭州地域的鏡像,配置如下。配置步驟請參見上述

data:
    service-account: "default"
    watch-namespace: "all"
    expiring-threshold: "15m"
    notify-email: "[email protected]"
    acr-registry-info: |
      - instanceId: ""
        regionId: cn-beijing
      - instanceId: ""
        regionId: cn-hangzhou      

繼續閱讀