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组件的架构图如下所示。

架构图

使用示例

本示例部署的应用中,将使用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. 集群列表页面,单击目标集群名称进入集群详情页面。

    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权限隔离