Kubernetes集群中External-DNS无法列出Route53托管区权限排查求助
排查External-DNS使用节点角色而非指定服务账户角色的问题
以下是针对性的排查步骤,按优先级排序:
1. 确认Helm Chart的服务账户配置是否正确
Bitnami的External-DNS Chart默认会创建服务账户,但如果安装时参数配置错误,会导致Pod使用错误的账户:
- 执行命令检查服务账户的基本信息:
重点看:kubectl get sa external-dns -n add-ons -o yamlautomountServiceAccountToken是否为true(默认应为true,若设为false则Pod无法获取服务账户token)metadata.annotations中是否包含eks.amazonaws.com/role-arn,且值为你关联的IAM角色ARN
- 检查Helm安装时的参数,确认没有覆盖服务账户配置:
比如是否用了--set serviceAccount.name=xxx指定了错误的账户名,或者--set serviceAccount.create=false导致使用默认账户。
2. 验证IAM角色的信任策略配置
IAM角色必须允许目标服务账户通过OIDC身份AssumeRole,否则Pod无法获取角色凭证,会 fallback 到节点角色:
- 查看IAM角色的信任策略,确保内容类似:
注意替换其中的账号ID、OIDC提供商地址,确保{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::你的AWS账号ID:oidc-provider/集群OIDC提供商地址" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "集群OIDC提供商地址:sub": "system:serviceaccount:add-ons:external-dns" } } } ] }sub字段严格匹配服务账户的完整标识。
3. 检查Pod的服务账户挂载及环境变量
Pod必须正确关联目标服务账户,并且获取到Web Identity相关的环境变量:
- 查看Pod的配置:
确认kubectl get pod <external-dns-pod-name> -n add-ons -o yamlspec.serviceAccountName为external-dns,且spec.automountServiceAccountToken不为false(若未显式设置则默认是true)。 - 进入Pod检查环境变量:
正常情况下应该输出kubectl exec <external-dns-pod-name> -n add-ons -- env | grep AWSAWS_WEB_IDENTITY_TOKEN_FILE和AWS_ROLE_ARN两个变量,若缺失则说明Pod未正确获取Web Identity凭证,会使用节点角色。
4. 确认集群OIDC提供商配置正确
- 获取集群的OIDC issuer地址:
确保这个地址和IAM角色信任策略中的OIDC提供商ARN完全一致(ARN格式为aws eks describe-cluster --name 你的集群名称 --query "cluster.identity.oidc.issuer" --output textarn:aws:iam::账号ID:oidc-provider/issuer地址)。
5. 排查Bitnami Chart的特殊配置
Bitnami 6.10.2版本的External-DNS Chart可能存在的特殊配置问题:
- 检查是否设置了
securityContext相关参数导致服务账户token挂载失败,比如fsGroup设置不当可能影响token文件的权限。 - 查看Chart的默认values.yaml,确认没有被自定义参数覆盖关键配置,比如
serviceAccount.annotations是否被正确传入。
内容的提问来源于stack exchange,提问作者Rad4
相关产品推荐
相关产品推荐

