容器服务集群支持启用 IRSA (IAM Role for Service Account) 能力。基于 IRSA 功能,您可以在集群内实现 Pod 维度的 OpenAPI 权限隔离,从而实现云资源访问权限的细粒度隔离,降低安全风险。本文介绍如何在集群中使用 IRSA。
说明
【邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。
已创建集群,并确保集群处于 运行中 状态。详细操作,请参见 创建集群。
集群开启 IRSA 能力后,您需要自行在 IAM 控制台配置信任身份为 OIDC 类型的身份提供商的 IAM 角色。详细操作和参数说明,请参见 角色管理。
授权 VKE 集群(已开启 IRSA 的集群)内指定命名空间(NameSpace)下的服务账号(Service Account),允许扮演上述创建的 IAM 角色。
在 IAM 控制台 的 身份管理 > 角色 页面,搜索 步骤二 中创建的角色名称。
单击角色名称,进入角色详情页面。
在 信任关系 页签,单击 编辑信任策略。
在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 为例。
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 挂载地址。
kubectl apply -f deploy.yaml