Pod Identity

EKS Pod Identity 是 AWS 推出的一种机制,它解决了 Kubernetes 集群中的 Pod 访问 AWS 服务时的复杂身份认证问题。在 EKS Pod Identity 出现之前,Pod 访问 AWS 服务通常需要使用 IAM 角色与服务账号(IRSA),这增加了配置复杂性。

另外它消除了使用 OIDC provider的复杂性,相比 IRSA,不再需要为每个集群设置和管理 OIDC provider。

示例

安装pod identity agent

先在eks集群上安装pod identity agent:

aws eks create-addon --cluster-name my-cluster --addon-name eks-pod-identity-agent --addon-version v1.0.0-eksbuild.1

安装完成后的效果:

image-20250416213902198

在kubectl命令里也能看到pod:

kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'

image-20250416213925084

配置Pod Identity

假设我们有一个需要访问 S3 存储桶的应用程序,下面是使用 EKS Pod Identity 的示例:

首先,在 AWS 中创建一个具有 S3 访问权限的 IAM 角色:

aws iam create-role --role-name my-s3-access-role --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ]
        }
    ]
}'

AmazonS3ReadOnlyAccess加到这个role上面:

aws iam attach-role-policy --role-name my-s3-access-role --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

创建一个service account:

cat >my-service-account.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
  namespace: default
EOF
kubectl apply -f my-service-account.yaml

在 EKS 集群中创建一个 EKS Pod Identity Association:

aws eks create-pod-identity-association \
  --cluster-name my-cluster \  # 集群名进行替换
  --namespace default \
  --service-account pod-identity-sa-test \
  --role-arn arn:aws:iam::123456789012:role/my-s3-access-role  # 将这个帐号id替换成自己的

返回结果示例:

image-20250416214335948

此时在eks 页面也能看到新创建出来的这个pod identity association:

image-20250416214642891

测试

创建一个测试pod,它使用了上面的my-service-account

cat >my-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-service-account
      containers:
      - name: my-app
        image: amazon/aws-cli:latest

        command: ["sleep", "100000000"]
EOF

kubectl apply -f my-deployment.yaml

创建完成后,登录到这个pod的shell, 能够执行s3 ls命令并访问到结果:

image-20250416214959321

这个应用程序的 Pod 将自动获取访问 S3 的临时凭证,AWS SDK 会自动使用这些凭证进行 S3 操作,从而简化了凭证管理且提高了安全性。

与 IRSA 相比,EKS Pod Identity 不需要设置 OIDC 提供者,降低了操作复杂性,并提供了更简单的使用体验。


参考文档:

https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html