如何从GKE集群中的Pod连接到AWS S3私有存储桶
在GKE工作负载中连接AWS S3私有存储桶的实现方案
方案一:使用AWS IAM角色进行跨云身份验证(推荐)
这种方式无需硬编码AWS密钥,通过OIDC联合身份自动获取临时凭证,安全性更高,是生产环境的首选方案。
步骤1:创建AWS IAM角色并配置信任关系
- 登录AWS IAM控制台,创建新角色,选择**Web身份或OpenID Connect(OIDC)**作为信任实体类型。
- 输入GKE集群的OIDC提供商URL,格式为:
https://container.googleapis.com/v1/projects/[GCP_PROJECT_ID]/locations/[CLUSTER_LOCATION]/clusters/[CLUSTER_NAME] - 设置信任政策,允许指定的GKE服务账号扮演该AWS角色。替换占位符后的示例政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::[AWS_ACCOUNT_ID]:oidc-provider/container.googleapis.com/v1/projects/[GCP_PROJECT_ID]/locations/[CLUSTER_LOCATION]/clusters/[CLUSTER_NAME]" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "container.googleapis.com/v1/projects/[GCP_PROJECT_ID]/locations/[CLUSTER_LOCATION]/clusters/[CLUSTER_NAME]:sub": "system:serviceaccount:[GCP_NAMESPACE]:[GKE_SERVICE_ACCOUNT_NAME]" } } } ] } - 给该IAM角色附加S3权限政策,仅授予访问目标私有桶的必要权限。示例政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::[YOUR_S3_BUCKET_NAME]", "arn:aws:s3:::[YOUR_S3_BUCKET_NAME]/*" ] } ] }
步骤2:配置GKE工作负载使用指定服务账号
在GKE的Deployment或Pod配置中,指定对应上述信任政策的服务账号:
apiVersion: apps/v1 kind: Deployment metadata: name: your-workload spec: template: spec: serviceAccountName: [GKE_SERVICE_ACCOUNT_NAME] containers: - name: your-app image: your-app-image:tag
步骤3:在工作负载中访问S3
使用AWS SDK时,会自动通过GKE服务账号的OIDC令牌获取临时AWS凭证,无需手动配置密钥。以Python的boto3为例:
import boto3 # SDK自动处理凭证获取流程 s3_client = boto3.client('s3') response = s3_client.list_objects_v2(Bucket='[YOUR_S3_BUCKET_NAME]') print(response['Contents'])
方案二:使用AWS IAM用户密钥(仅临时测试或特殊场景)
这种方式需要存储AWS密钥,存在泄露风险,不推荐长期在生产环境使用。
步骤1:创建AWS IAM用户并生成密钥
- 在AWS IAM控制台创建新用户,附加能访问目标S3私有桶的权限政策。
- 生成该用户的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,妥善保存这两个值。
步骤2:在GKE中存储密钥为Secret
通过kubectl创建Kubernetes Secret存储AWS密钥:
kubectl create secret generic aws-s3-credentials \ --from-literal=AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY] \ --from-literal=AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY]
步骤3:在工作负载中挂载Secret
将Secret作为环境变量注入容器,让AWS SDK自动读取:
apiVersion: apps/v1 kind: Deployment metadata: name: your-workload spec: template: spec: containers: - name: your-app image: your-app-image:tag env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-s3-credentials key: AWS_ACCESS_KEY_ID - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-s3-credentials key: AWS_SECRET_ACCESS_KEY
关键注意事项
- 最小权限原则:无论是IAM角色还是用户,仅授予访问目标S3桶所需的最小操作权限(如仅
GetObject而非所有S3权限),降低泄露风险。 - 网络连通性:确保GKE集群节点能访问AWS S3和STS服务(若GKE集群在私有VPC,需配置Cloud NAT实现互联网访问)。
- 权限验证:可在工作负载容器内安装AWS CLI,执行
aws s3 ls s3://[YOUR_BUCKET_NAME]快速验证访问权限。
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

