ack-pod-identity-webhook

ack-pod-identity-webhook可以帮您更便捷地使用容器计算服务提供的RRSA(RAM Roles for Service Accounts)特性,它可以为您的应用Pod自动注入应用依赖的挂载OIDC Token和环境变量配置,免去繁琐的手动配置工作。本文介绍ack-pod-identity-webhook的功能、使用说明和变更记录。

组件介绍

ack-pod-identity-webhook组件的架构图如下所示。

image

使用示例

本示例部署的应用中,将使用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. 登录容器计算服务控制台,在左侧导航栏选择集群

    2. 集群页面,单击目标集群ID,然后在左侧导航栏,选择集群信息

    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. 为上一步创建的RAM角色授予测试应用所需的AliyunCSReadOnlyAccess系统策略权限。具体操作,请参见为RAM角色授权

  5. 部署测试应用。

    1. 连接集群。具体操作,请参见连接集群

    2. 使用以下内容,创建demo.yaml文件。

      如下YAML示例中,为命名空间rrsa-demo增加标签pod-identity.alibabacloud.com/injection: 'on',并为服务账号demo-sa增加注解pod-identity.alibabacloud.com/role-name: ack-pod-identity-webhook-demo,启用ack-pod-identity-webhook组件的自动配置注入功能。关于RRSA Demo调用的具体实现,请参见代码

      说明

      以下示例使用的registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0需通过公网拉取,请确保集群已开通公网访问。具体操作,请参见为集群开启公网访问能力

      ---
      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
    3. 执行以下命令,部署测试应用。

      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:
      annotations:
        ProviderCreate: done
        alibabacloud.com/client-token: 5e68e5bf-1726-4f5e-****-abe61d2c1cff
        alibabacloud.com/instance-id: acs-uf6008givz63ta2v****
        alibabacloud.com/pod-ephemeral-storage: 30Gi
        alibabacloud.com/pod-use-spec: 0.25-0.5Gi
        alibabacloud.com/request-id: 5914A73F-8B24-5B9B-****-400F6B632D44
        alibabacloud.com/schedule-result: finished
        alibabacloud.com/user-id: "1488999589******"
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"demo","namespace":"rrsa-demo"},"spec":{"containers":[{"args":["rrsa","demo"],"image":"registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0","imagePullPolicy":"Always","name":"demo"}],"restartPolicy":"OnFailure","serviceAccountName":"demo-sa"}}
        kubernetes.io/pod-stream-port: "10250"
        kubernetes.io/preferred-scheduling-node: virtual-kubelet-cn-shanghai-g/1
        network.alibabacloud.com/allocated-eni-id: eni-uf6fhxwakz5b0d******
        network.alibabacloud.com/enable-dns-cache: "false"
        network.alibabacloud.com/security-group-id: sg-uf60h6mbwry22r******
        network.alibabacloud.com/security-group-ids: sg-uf60h6mbwry22r******
        network.alibabacloud.com/vpc-id: vpc-uf6ncu6tpunqchrrr****
        network.alibabacloud.com/vswitch-id: vsw-uf6g4yjk3kemgei******
        network.alibabacloud.com/vswitch-ids: vsw-uf6g4yjk3kemgei******
        topology.kubernetes.io/region: cn-shanghai
        topology.kubernetes.io/zone: cn-shanghai-g
      creationTimestamp: "2024-08-19T09:29:57Z"
      labels:
        alibabacloud.com/cluster-id: cbec9a1f7b433470ebe4c900552******
        alibabacloud.com/compute-class: general-purpose
        alibabacloud.com/compute-qos: default
        topology.kubernetes.io/region: cn-shanghai
      name: demo
      namespace: rrsa-demo
      resourceVersion: "6795900"
      uid: 57ab5f1d-32b7-4d9d-****-16a4f2c1a1fa
    spec:
      containers:
      - args:
        - rrsa
        - demo
        env:
        - name: ALIBABA_CLOUD_ROLE_ARN
          value: acs:ram::1488999589******:role/ack-pod-identity-webhook-demo
        - name: ALIBABA_CLOUD_OIDC_PROVIDER_ARN
          value: acs:ram::1488999589******:oidc-provider/ack-rrsa-cbec9a1f7b433470ebe4c900552******
        - name: ALIBABA_CLOUD_OIDC_TOKEN_FILE
          value: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
        - name: KUBERNETES_SERVICE_HOST
          value: 192.168.1.215
        - name: KUBERNETES_SERVICE_PORT
          value: "6443"
        image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0
        imagePullPolicy: Always
        name: demo
        resources:
          limits:
            cpu: 250m
            ephemeral-storage: 30Gi
            memory: 512Mi
          requests:
            cpu: 250m
            ephemeral-storage: 30Gi
            memory: 512Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-lrcfl
          readOnly: true
        - mountPath: /var/run/secrets/ack.alibabacloud.com/rrsa-tokens
          name: rrsa-oidc-token
          readOnly: true
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
      nodeName: virtual-kubelet-cn-shanghai-g
      preemptionPolicy: PreemptLowerPriority
      priority: 0
      restartPolicy: OnFailure
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: demo-sa
      serviceAccountName: demo-sa
      terminationGracePeriodSeconds: 30
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
      volumes:
      - name: kube-api-access-lrcfl
        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
    status:
      conditions:
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:29:57Z"
        message: The container instance is creating.
        reason: Creating
        status: "False"
        type: ContainerInstanceScheduled
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:10Z"
        status: "True"
        type: Initialized
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:13Z"
        status: "True"
        type: Ready
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:13Z"
        status: "True"
        type: ContainersReady
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:10Z"
        status: "True"
        type: ContainerHasSufficientDisk
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:12Z"
        status: "True"
        type: ContainerInstanceCreated
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:13Z"
        status: "True"
        type: PodReadyToStartContainers
      - lastProbeTime: null
        lastTransitionTime: "2024-08-19T09:30:12Z"
        status: "True"
        type: PodScheduled
      containerStatuses:
      - containerID: containerd://5d4f205e068372f30a90715016465562b9988a981cb285e81c76b5b0dc******
        image: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool:1.0.0
        imageID: registry.cn-hangzhou.aliyuncs.com/acs/ack-ram-tool@sha256:ad4172d3ed3d6dab23f09218f9d478295e93c163915aac9e4e38a90c4d******
        lastState: {}
        name: demo
        ready: true
        restartCount: 0
        started: true
        state:
          running:
            startedAt: "2024-08-19T09:30:13Z"
      hostIP: 192.168.1.5
      phase: Running
      podIP: 192.168.1.5
      podIPs:
      - ip: 192.168.1.5
      qosClass: Guaranteed

    预期输出表明,ack-pod-identity-webhook组件已为Pod自动注入了如下配置。

    字段

    配置项名称

    配置项说明

    env

    ALIBABA_CLOUD_ROLE_ARN

    需要扮演的RAM角色ARN。

    ALIBABA_CLOUD_OIDC_PROVIDER_ARN

    OIDC身份提供商的ARN。

    ALIBABA_CLOUD_OIDC_TOKEN_FILE

    包含OIDC Token的文件路径。

    VolumeMounts

    rrsa-oidc-token

    挂载OIDC Token的配置。

    Volumes

    rrsa-oidc-token

    挂载OIDC Token的配置。

  7. 执行以下命令,查看测试应用日志。

    kubectl -n rrsa-demo logs demo

    预期输出:

    cluster id: c66e40b731ab24f96b36bec5b1a******, cluster name: test-****
    cluster id: cbec9a1f7b433470ebe4c900552******, cluster name: test-****

自定义配置

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作为此配置项的值。

说明

当服务账户和Pod上都存在该配置项时,优先使用Pod配置,服务账户上的配置将会被忽略。

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上都存在该配置项时,优先使用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-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/only-containers: 'controller,test'

pod-identity.alibabacloud.com/skip-containers

注解

除特定名称的容器外,为Pod内其他容器自动注入配置。使用英文半角逗号(,)分隔多个容器名称。

说明

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使用示例

变更记录

2024年06月

版本号

镜像地址

变更内容

变更时间

变更影响

0.1.1

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

  • 增强组件对ACK Serverless集群的兼容性。

  • 实现为应用Pod自动挂载OIDC Token以及自动配置环境变量的功能。

  • 支持ACS集群。

2024年06月30日

组件升级异常可能会导致Pod创建失败,建议在业务低谷期进行升级操作。