在CCE集群中使用容器组身份(Pod Identity)获取IAM凭证
容器组身份(Pod Identity)是云容器引擎(CCE)提供的一项强大功能,它允许Kubernetes中的Pod以安全、可控的方式访问华为云服务资源。与基于OIDC的工作负载身份认证相比,Pod Identity的配置方式更加简单,具备更强的隔离性。本文档介绍如何CCE集群中使用Pod Identity。
Pod Identity简介
Pod Identity为集群中的Pod提供了一种标准化的方式来获取华为云IAM临时凭证:通过将华为云IAM委托直接与Kubernetes的服务账户(Service Account)相关联,使得Pod可以使用服务账户Token(Service Account Token)直接获取IAM临时凭证。
核心优势
- 配置简单:仅需要为Service Account绑定委托,无需配置OIDC身份提供商。
- 权限最小化:为特定的Service Account绑定委托,委托仅授权使用该Kubernetes服务账户的Pod依赖的权限,从而精确控制Pod所拥有的权限。
- 权限隔离:Pod仅能获取其使用的Service Account所绑定的委托的凭据,无法获取其他Service Account绑定的委托的凭据,确保使用不同Service Account的Pod之间的权限完全隔离。
适用场景
需要在Pod中访问华为云服务(如ELB、EVS、VPC等)
Pod Identity原理

Pod Identity的凭据获取流程如下:
- 准备工作:创建Service Account与IAM委托的关联,配置Pod使用该Service Account。
- Pod启动阶段:当Pod配置了开启Pod Identity之后,CCE在创建Pod时,会通过admission自动为Pod注入Pod Identity依赖的相关环境变量以及卷挂载。
- 环境变量:
- HC_CONTAINER_AUTHORIZATION_TOKEN_FILE:指向授权令牌文件的路径。
- HC_CONTAINER_CREDENTIALS_FULL_URI:指向凭证提供端点的完整URI。
- 卷挂载:
- 挂载一个projected类型的卷,名称为cce-pod-identity-token,包含服务账户令牌,用于身份验证。
- 环境变量:
- 当Pod需要获取凭据时,使用Service Account Token向节点上的系统组件求凭证。
- 节点系统组件读取HC_CONTAINER_AUTHORIZATION_TOKEN_FILE所指定的文件中挂载的Service Account Token,并使用它请求HC_CONTAINER_CREDENTIALS_FULL_URI指定的凭证提供端点获取凭证。
- 返回IAM临时凭证供工作负载使用。
约束与限制
- 仅支持v1.28.15-r80、v1.29.15-r40、v1.30.14-r40、v1.31.14-r0、v1.32.9-r0、v1.33.7-r0、v1.34.2-r0及以上版本集群。
- 通过Pod Identity获取IAM凭据存在流控限制,建议您根据获取到的凭据有效期对其进行缓存(华为云SDK已实现),并避免在Daemonset中使用Pod Identity。
在Pod中配置使用Pod Identity
- 创建IAM委托
您需要先在统一身份认证服务控制台的委托界面创建好“云服务”类型的自定义委托,并将其授权给“云容器引擎服务 CCE”。详情请参见创建委托并授权。
请勿删除正在使用中的委托,否则会导致功能异常。
- 创建Kubernetes服务账户
您需要在CCE集群中为Pod创建Service Account。以1.29版本集群为例,使用如下命令在default命名空间内创建ServiceAccount。
kubectl create serviceaccount my-service-account
使用以下命令可以检查my-service-account是否创建成功,若NAME列出现my-service-account则说明创建成功。
kubectl get sa
更多关于Service Account的信息请参见Kubernetes服务账户。
- 创建Pod Identity关联,将创建好的委托与Kubernetes服务账户进行关联。
- 登录CCE控制台,在左侧导航栏中选择“权限管理”,切换至“容器组身份关联”页签。
- 在左边下拉列表中选择需要创建容器组身份关联的集群。
- 单击“创建”,选择创建好的委托与服务账户,单击“确定”完成创建。
- 同一服务账户只允许创建一条Pod Identity关联记录。
- 请勿删除正在使用中的Pod Identity关联,否则会导致功能异常。
- 新建或更新Pod Identity关联后需要等待15秒生效。
- 为Pod配置创建好的服务账户
示例如下:
apiVersion: v1 kind: Pod metadata: name: my-app spec: serviceAccountName: my-service-account # 指定服务账户 containers: - name: my-app image: my-app:latest - 启用Pod Identity注入
启用后,会自动为Pod注入如下环境变量:
- HC_CONTAINER_AUTHORIZATION_TOKEN_FILE:指向授权令牌文件的路径。
- HC_CONTAINER_CREDENTIALS_FULL_URI:指向凭证提供端点的完整URI。
并且在Pod中挂载如下卷:
volumes: - name: cce-pod-identity-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: service.cce.pods expirationSeconds: 86400 # 超时时间,单位为秒 path: cce-pod-identity-token - 通过Pod Identity获取IAM临时凭证
方式一:使用华为云SDK
华为云SDK当前已经实现通过Pod Identity获取IAM凭证,示例如下:

方式二:自主编码实现
可在Pod中访问环境变量HC_CONTAINER_CREDENTIALS_FULL_URI指定的地址获取IAM临时凭证,命令示例如下:
curl -XPOST http://169.254.170.23:3230/v1/credentials -H "Authorization: service-account-token"
其中http://169.254.170.23:3230/v1/credentials为环境变量HC_CONTAINER_CREDENTIALS_FULL_URI指定的地址,service-account-token为从环境变量HC_CONTAINER_AUTHORIZATION_TOKEN_FILE指定的文件中读取的服务账户Token。
配置特定Pod不使用Pod Identity
如果您不希望为Pod中某些特定的容器注入使用Pod Identity的环境变量配置,可以通过为Pod配置注解pod-identity.cce.io/skip-containers来指定哪些容器不注入,参数值为容器名称,如有多个容器则以英文逗号分隔,例如:
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
pod-identity.cce.io/injection: "on"
annotations:
pod-identity.cce.io/skip-containers: "sidecar,init-container" # 指定容器不注入使用Pod Identity的环境变量
spec:
serviceAccountName: my-service-account
containers:
- name: my-app
image: my-app:latest
- name: sidecar
image: sidecar:latest
