全部產品
Search
文件中心

Container Service for Kubernetes:ack-pod-identity-webhook

更新時間:Jun 19, 2024

ack-pod-identity-webhook組件可以幫您更便捷的使用Container Service提供的RRSA(RAM Roles for Service Accounts)特性,它可以為您的應用Pod自動注入應用依賴的掛載OIDC Token和環境變數配置,免去繁瑣的手動設定工作。本文介紹ack-pod-identity-webhook組件資訊、使用說明及變更記錄。

索引

組件介紹

ack-pod-identity-webhook組件的架構圖如下所示。

架構圖

使用樣本

本樣本部署的應用中,將使用RRSA特性扮演指定角色擷取當前帳號下叢集列表資訊。相關資訊如下。

  • 命名空間:rrsa-demo

  • 服務賬戶:demo-sa

  • RAM角色:ack-pod-identity-webhook-demo

當您為Pod所在命名空間增加pod-identity.alibabacloud.com/injection: 'on'標籤後,ack-pod-identity-webhook組件將根據Pod使用的服務帳號的註解配置,自動為該Pod注入相關配置項。使用樣本的操作步驟如下。

  1. 為叢集開啟RRSA功能。

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

    2. 叢集列表頁面,單擊目的地組群名稱進入叢集詳情頁面。

    3. 在叢集詳情頁面,單擊基本資料頁簽,在叢集資訊地區單擊RRSA OIDC右側的啟用RRSA

    4. 在彈出的對話方塊中,單擊確定。

      當叢集狀態由更新中變為運行中時,表示該叢集的RRSA特性已變更完成,RRSA OIDC右側會顯示供應商的URL連結以及ARN資訊。

  2. 安裝ack-pod-identity-webhook組件。

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

    2. 組件管理頁面,單擊安全頁簽,找到ack-pod-identity-webhook組件,單擊組件右下方的安裝

    3. 在提示對話方塊確認組件資訊後,單擊確定

  3. 建立一個名為ack-pod-identity-webhook-demo的RAM角色。

    1. 使用阿里雲帳號登入RAM控制台

    2. 在左側導覽列,選擇身份管理 > 角色

    3. 角色頁面,單擊建立角色

    4. 建立角色面板,選擇可信實體類型為身份供應商,然後單擊下一步

    5. 在配置角色配置項,配置如下角色資訊後,單擊完成

      配置項

      描述

      角色名稱

      ack-pod-identity-webhook-demo

      身份供應商類型

      OIDC

      選擇身份供應商

      ack-rrsa-<cluster_id>。其中,<cluster_id>為您的叢集ID。

      限制條件

      • oidc:iss:預設即可。

      • oidc:aud:選擇sts.aliyuncs.com

      • oidc:sub:條件判定方式選擇StringEquals,值的格式為system:serviceaccount:<namespace>:<serviceAccountName>

        • <namespace>:應用所在的命名空間。

        • <serviceAccountName>:服務賬戶名稱。

        根據測試應用的資訊,此處需要填入system:serviceaccount:rrsa-demo:demo-sa

  4. 為上一步建立的角色授予測試應用所需的AliyunCSReadOnlyAccess系統策略許可權。具體操作,請參見為RAM角色授權

  5. 部署測試應用。

    1. 使用以下內容,建立demo.yaml檔案。

      如下YAML樣本中,為命名空間增加標籤pod-identity.alibabacloud.com/injection: 'on',並為服務帳號增加註解pod-identity.alibabacloud.com/role-name: ack-pod-identity-webhook-demo,啟用ack-pod-identity-webhook組件的自動設定注入功能。關於RRSA Demo調用實現,請參見代碼

      ---
      apiVersion: v1
      kind: Namespace
      metadata:
        name: rrsa-demo
        labels:
          pod-identity.alibabacloud.com/injection: 'on'
      
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: demo-sa
        namespace: rrsa-demo
        annotations:
          pod-identity.alibabacloud.com/role-name: ack-pod-identity-webhook-demo
      
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: demo
        namespace: rrsa-demo
      spec:
        serviceAccountName: demo-sa
        containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0
            imagePullPolicy: "Always"
            args:
              - rrsa
              - demo
            name: demo
        restartPolicy: OnFailure
    2. 執行以下命令,部署測試應用。

      kubectl apply -f demo.yaml
  6. 執行以下命令,查看測試應用Pod,確認ack-pod-identity-webhook組件已為Pod自動注入所需的配置。

    kubectl -n rrsa-demo get pod demo -o yaml

    展開查看預期輸出

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: rrsa-demo
    spec:
      containers:
      - args:
        - rrsa
        - demo
        env:
        - name: ALIBABA_CLOUD_ROLE_ARN
          value: acs:ram::1***:role/ack-pod-identity-webhook-demo
        - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
          value: acs:ram::1***:oidc-provider/ack-rrsa-c***
        - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
          value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
        image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0
        imagePullPolicy: Always
        name: demo
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-4bwdg
          readOnly: true
        - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
          name: rrsa-oidc-token
          readOnly: true
      restartPolicy: OnFailure
      serviceAccount: demo-sa
      serviceAccountName: demo-sa
      volumes:
      - name: kube-api-access-4bwdg
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              expirationSeconds: 3607
              path: token
          - configMap:
              items:
              - key: ca.crt
                path: ca.crt
              name: kube-root-ca.crt
          - downwardAPI:
              items:
              - fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
                path: namespace
      - name: rrsa-oidc-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: sts.aliyuncs.com
              expirationSeconds: 3600
              path: token

    預期輸出表明,ack-pod-identity-webhook組件已為Pod自動注入了如下配置。

    類別

    配置項名稱

    配置項說明

    環境變數

    ALIBABA_CLOUD_ROLE_ARN

    需要扮演的RAM角色ARN。

    ALIBABA_CLOUD_OIDC_PROVIDER_ARN

    OIDC身份供應商的ARN。

    ALIBABA_CLOUD_OIDC_TOKEN_FILE

    包含OIDC Token的檔案路徑。

    VolumeMount

    rrsa-oidc-token

    掛載OIDC Token的配置。

    Volume

    rrsa-oidc-token

    掛載OIDC Token的配置。

  7. 執行以下命令,查看測試應用日誌。

    kubectl -n rrsa-demo logs demo

    預期輸出:

    cluster id: cf***, cluster name: foo*
    cluster id: c8***, cluster name: bar*
    cluster id: c4***, cluster name: foob*

自訂配置

ack-pod-identity-webhook組件的自訂配置包括命名空間配置、服務賬戶配置以及Pod配置。

命名空間配置

參數

類型

說明

程式碼範例

pod-identity.alibabacloud.com/injection

標籤

是否為該命名空間下的Pod啟用配置自動注入功能。

  • 當值為on時:表示啟用配置自動注入功能。

  • 未配置或其他值時:表示禁用配置自動注入功能。

apiVersion: v1
kind: Namespace
metadata:
  name: test
  labels:
    pod-identity.alibabacloud.com/injection: 'on'

服務賬戶配置

參數

類型

說明

程式碼範例

pod-identity.alibabacloud.com/role-name

註解

該服務賬戶關聯的RAM角色名稱。如果未配置該配置項或配置的值不是一個合法的RAM角色名稱,使用該服務賬戶的Pod將不會被自動注入配置。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-sa
  namespace: test
  annotations:
    pod-identity.alibabacloud.com/role-name: test-role

pod-identity.alibabacloud.com/service-account-token-expiration

註解

指定使用該服務賬戶的Pod掛載的OIDC Token的有效期間。

取值範圍:[600, 43200]。單位:秒。

預設值為3600,當配置值無效時,將使用3600作為此配置項的值。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-sa
  namespace: test
  annotations:
    pod-identity.alibabacloud.com/service-account-token-expiration: '3600'

Pod配置

參數

類型

說明

程式碼範例

pod-identity.alibabacloud.com/service-account-token-expiration

註解

指定該Pod掛載的OIDC Token的有效期間。

取值範圍:[600, 43200]。單位:秒。

預設值為3600,當配置值無效時,將使用3600作為此配置項的值。

說明

當服務賬戶和Pod上都存在該配置項時,服務賬戶上的配置將會被忽略。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: test
  annotations:
    pod-identity.alibabacloud.com/service-account-token-expiration: '3600'

pod-identity.alibabacloud.com/only-containers

註解

限制只為Pod內特定名稱的容器自動注入配置,使用英文半形逗號(,)分隔多個容器名稱。

如果未配置該配置項,將為Pod內所有容器自動注入配置。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: test
  annotations:
    pod-identity.alibabacloud.com/only-containers: 'controller,test'

pod-identity.alibabacloud.com/skip-containers

註解

配置不為特定名稱的容器自動注入配置,使用英文半形逗號(,)分隔多個容器名稱。

說明

當某個容器名稱同時存在於pod-identity.alibabacloud.com/only-containerspod-identity.alibabacloud.com/skip-containers配置中時,pod-identity.alibabacloud.com/only-containers中的配置將會被自動忽略。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: test
  annotations:
    pod-identity.alibabacloud.com/skip-containers: 'controller,test'

RRSA SDK參考代碼

程式設計語言

支援認證的SDK版本

使用樣本

Go

Alibaba Cloud Credentials for Go 1.2.6及以上版本

GO SDK使用樣本

Java

Alibaba Cloud Credentials for Java 0.2.10及以上版本

Java SDK使用樣本

Python 3

Alibaba Cloud Credentials for Python 0.3.1及以上版本

Python 3 SDK使用樣本

Node.js和TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6及以上版本

Node.js和TypeScript使用樣本

變更記錄

2023年06月

版本號碼

鏡像地址

變更內容

變更時間

變更影響

0.1.1

registry.cn-hangzhou.aliyuncs.com/acs/ack-pod-identity-webhook:v0.1.1.0-gbddcb74-aliyun

增強組件對ACK Serverless叢集的相容性。

2023年06月07日

組件升級異常可能會導致Pod建立失敗,建議在業務低穀期進行升級操作。

2023年02月

版本號碼

鏡像地址

變更內容

變更時間

變更影響

0.1.0

registry.cn-hangzhou.aliyuncs.com/acs/ack-pod-identity-webhook:v0.1.0.9-g26b8fde-aliyun

實現為應用Pod自動掛載OIDC Token以及自動設定環境變數的功能。

2023年02月01日

首個版本。

相關文檔

通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離