You need to enable JavaScript to run this app.
导航
集群中使用 IRSA 能力
最近更新时间:2024.08.14 17:32:25首次发布时间:2024.08.14 17:32:25

容器服务集群支持启用 IRSA (IAM Role for Service Account) 能力。基于 IRSA 功能,您可以在集群内实现 Pod 维度的 OpenAPI 权限隔离,从而实现云资源访问权限的细粒度隔离,降低安全风险。本文介绍如何在集群中使用 IRSA。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

使用限制

  • 目前仅托管版且已创建好的集群支持开启 IRSA 能力,创建集群时不支持开启。
  • 集群中开启 IRSA 能力后不支持关闭。建议您先在测试集群中进行充分测试验证,再使用到生产集群中。
  • 启用 IRSA 会导致 kube-apiserver 的短暂重启,请在业务低峰期操作。
  • 仅支持在 Kubernetes v1.24 及以上版本集群中使用 IRSA 能力。

前提条件

已创建集群,并确保集群处于 运行中 状态。详细操作,请参见 创建集群

操作步骤

步骤一:集群开启 IRSA 能力

  1. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群,单击目标集群名称,进入集群管理页面。
  3. 在集群的 总览 页面 概览 页签,开启 IRSA OIDC。
    alt
  4. 在系统弹出的提示框中确认信息,然后单击 确定
    集群开启 IRSA 能力后,控制台上显示 提供商 URL提供商 TRN。请确认 提供商 TRN 信息中的身份提供商名称。
    alt

步骤二:新建 OIDC 身份提供商类型的 IAM 角色

集群开启 IRSA 能力后,您需要自行在 IAM 控制台配置信任身份为 OIDC 类型的身份提供商的 IAM 角色。详细操作和参数说明,请参见 角色管理

  1. 登录 IAM 控制台
  2. 在左侧导航栏选择 身份管理 > 角色,然后单击 新建角色
  3. 新建角色 页面按如下图和参数说明,配置参数。
    alt
    • 选择信任身份
      参数说明
      选择信任身份类型选择 身份提供商
      身份提供商类型选择 OIDC
      身份提供商选择 步骤一 中获取的 提供商 TRN 信息中身份提供商名称。
    • 配置角色信息
      参考 IAM 文档:角色管理 中的说明,结合您的实际情况自主配置。
    • 添加权限
      参考 IAM 文档:角色管理 中的说明,结合您的实际情况自主配置。

步骤三:编辑角色信任关系

授权 VKE 集群(已开启 IRSA 的集群)内指定命名空间(NameSpace)下的服务账号(Service Account),允许扮演上述创建的 IAM 角色。

  1. IAM 控制台身份管理 > 角色 页面,搜索 步骤二 中创建的角色名称。

  2. 单击角色名称,进入角色详情页面。

  3. 信任关系 页签,单击 编辑信任策略
    alt

    Statement字段下添加如下代码块:

    "Condition": {
                    "StringLike": {
                        "oidc:aud": "sts.volcengine.com", // 固定值,OIDC 中的 Audience 值。
                        "oidc:iss": "https://oidc-vke-cn-beijing.tos-cn-beijing.volces.com/ccog93v********", // 配置为您的集群开启 IRSA 能力后控制台中显示的“供应商 URL”信息。
                        "oidc:sub": "system:serviceaccount:oidc-ns-1:oidc-sa-1" // 需要满足格式:system:serviceaccount:{namespace}:{serviceaccount} ,其中{namespace}和{serviceaccount}是 Kubernetes 集群内目标 NameSpace 和 Service Account。
                    }
                },
    

    完整代码块示例如下:

    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "sts:AssumeRoleWithOIDC"
                ],
                "Condition": {
                    "StringLike": {
                        "oidc:aud": "sts.volcengine.com", // 固定值,OIDC 中的 Audience 值。
                        "oidc:iss": "https://oidc-vke-cn-beijing.tos-cn-beijing.volces.com/ccog93vv********", // 配置为您的集群开启 IRSA 能力后控制台中显示的“供应商 URL”信息。
                        "oidc:sub": "system:serviceaccount:oidc-ns-1:oidc-sa-1" // 需要满足格式:system:serviceaccount:{namespace}:{serviceaccount} ,其中{namespace}和{serviceaccount}是 Kubernetes 集群内目标 NameSpace 和 Service Account。
                    }
                },
                "Principal": {
                    "Federated": [
                        "trn:iam::2100042022:oidc-provider/vke-irsa-********"
                    ]
                }
            }
        ]
    }
    

    说明

    IAM 信任策略支持添加多个Statement

4.编辑完成后,保存策略。

步骤四:创建工作负载

在集群中创建工作负载,并在工作负载 Pod 中实现 OIDC Token 文件访问 STS 服务的 AssumeRoleWithOIDC 接口所需的环境变量。

本文以创建 Pod 的同时创建 步骤三 中配置的 NameSpace、Service Account 为例。

  1. 通过 kubectl 连接已开启了 IRSA 的集群。详细操作,请参见 连接集群
  2. 创建对应的 NameSpace、Service Account、工作负载(以 Pod 为例)的 YAML 文件,示例deploy.yaml文件如下:
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: oidc-ns-1  # NameSpace 名称。与“步骤三”中配置的 NameSpace 名称保持一致。
    
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: oidc-sa-1
      namespace: oidc-ns-1  # Service Account 名称。与“步骤三”中配置的 Service Account 名称保持一致。
    
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1  # Pod 名称。
      namespace: oidc-ns-1  # 与上方设置的 NameSpace 名称保持一致。
    spec:
      serviceAccountName: oidc-sa-1 # 与上方设置的 Service Account 名称保持一致。
      volumes:  # 为 Pod 设置服务账号令牌卷投影。更多信息,请见 Kubernetes 文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-service-account/#serviceaccount-token-volume-projection 。
      - name: irsa-oidc-token  # 卷名称,与下方 volumeMounts 下的挂载卷名称保持一致。
        projected:
          defaultMode: 420
          sources:
            - serviceAccountToken:
                audience: sts.volcengine.com  # 固定值,表示指定的 Audience 值。
                expirationSeconds: 3600  # OIDC Token 有效期,单位为:秒。
                path: token 
      containers:
        env:  # Pod 中实现请求 AssumeRoleWithOIDC 所需的环境变量。可能会用到的 env 参数值如下,您也可以自行使用其他环境变量。
          - name: VOLCENGINE_ROLE_TRN
            value: <role_trn>
          - name: VOLCENGINE_OIDC_PROVIDER_TRN
            value: <oicd_provider_trn>
          - name: VOLCENGINE_OIDC_TOKEN_FILE
            value: /var/run/secrets/vke.volcengine.com/irsa-tokens/token  # OIDC Token 挂载地址,与下方 volumeMounts 下的挂载地址保持一致。
        image: cr-cn-beijing.volces.com/******:latest  # 容器镜像地址和 Tag,请配置为您自己的镜像地址。
        imagePullPolicy: IfNotPresent
        name: c-test  # 容器名称。
        volumeMounts:
          - name: irsa-oidc-token  # 挂载卷名称,与上方 volumes 下的卷名称保持一致
            readOnly: true
            mountPath: /var/run/secrets/vke.volcengine.com/irsa-tokens/token  # OIDC Token 挂载地址。
    
  3. 执行如下命令,创建 YAML。
    kubectl apply -f deploy.yaml