如何通过Kubernetes配置AWS服务及实现IAM连接的最佳实践
这是个很棒的需求——用Kubernetes Chart统一管理AWS资源和应用,同时用IAM实现安全的无密钥访问,我来给你梳理下业界公认的最佳实践方案:
这两个工具是AWS官方推出的黄金组合,完美匹配你想要的「用K8s Chart配置AWS服务+IAM认证访问」的场景。
1. 先部署ACK的DynamoDB控制器
ACK是专门用来在Kubernetes中管理AWS服务的Operator,它通过自定义资源定义(CRD)让你像操作Deployment、Service一样操作DynamoDB、S3等AWS资源。
首先安装DynamoDB对应的ACK控制器(用Helm最方便):
helm install dynamodb-ack oci://public.ecr.aws/aws-controllers-k8s/dynamodb-chart --namespace ack-system --create-namespace
安装完成后,你的K8s集群就会新增DynamoDB Table的CRD,接下来就能用Chart定义DynamoDB表了。
2. 把你的自定义Chart转换成ACK兼容的格式
你提供的示例Chart需要调整成ACK的DynamoDB Table CRD格式,这样ACK控制器才能识别并在AWS上创建表。调整后的模板文件(比如templates/dynamodb-table.yaml)大概是这样:
apiVersion: dynamodb.services.k8s.aws/v1alpha1 kind: Table metadata: name: a-test-table spec: attributeDefinitions: - attributeName: some_id attributeType: S # 字符串类型,对应你的hash_key - attributeName: some_order attributeType: N # 数字类型,对应你的range_key keySchema: - attributeName: some_id keyType: HASH - attributeName: some_order keyType: RANGE # 按需配置吞吐量,也可以用按需模式 provisionedThroughput: readCapacityUnits: 5 writeCapacityUnits: 5
把这段放到你的Chart里,部署时ACK就会自动在AWS上创建名为a-test-table的DynamoDB表。
3. 用IRSA实现无密钥IAM访问
IRSA是AWS推荐的K8s Pod访问AWS服务的安全方式,它让K8s的Service Account直接关联AWS IAM角色,Pod使用这个SA时会自动获取临时IAM凭证,完全不需要硬编码密钥对。
具体步骤:
- 创建IAM角色并配置权限:新建一个IAM角色,给它附加访问目标DynamoDB表的权限(建议用最小权限原则,比如只允许
dynamodb:GetItem、dynamodb:PutItem等必要操作,而不是全量权限)。 - 配置信任关系:在IAM角色的信任策略中,添加你的K8s集群的OIDC提供商作为信任实体,指定只有特定的K8s Service Account可以扮演这个角色。
- 在Pod中使用关联的Service Account:在你的应用Deployment的Pod模板里,指定
serviceAccountName为刚才关联了IAM角色的SA。这样Pod启动后,会自动获得对应的IAM权限,直接访问DynamoDB即可。
4. 整合到你的Chart中
你可以把DynamoDB Table CRD、应用Deployment、关联IRSA的Service Account都打包到同一个Chart里,或者拆分成子Chart来维护。比如:
- 在
templates目录下添加dynamodb-table.yaml(上面的CRD内容) - 添加
service-account.yaml定义关联IRSA的Service Account - 在Deployment的Pod模板里引用这个Service Account
5. 验证部署效果
部署完成后,你可以做这些验证:
- 用
kubectl get tables.dynamodb.services.k8s.aws查看K8s中DynamoDB资源的状态,确认STATUS为ACTIVE - 登录AWS控制台,检查DynamoDB控制台是否存在
a-test-table - 进入应用Pod,执行
aws dynamodb describe-table --table-name a-test-table(如果安装了AWS CLI),应该能正常返回表信息,且不需要配置任何密钥环境变量
内容的提问来源于stack exchange,提问作者Fuyang Liu

