EKS上External-DNS同步Route53失败:超时及权限问题排查求助
解决AWS EKS中External-DNS同步Route53记录的权限与角色问题
问题根源
日志中出现的scm-main-demo-eks-nodes是EKS节点的默认IAM角色,说明你的External-DNS没有使用预期的IAM角色(应为绑定ServiceAccount的IRSA角色),而是 fallback 到了节点角色。节点角色仅具备集群基础运维权限,没有Route53操作权限,直接引发了AccessDenied错误,进而导致Service同步超时(权限不足导致请求卡住超时)。
分步解决
1. 确认External-DNS的ServiceAccount配置
先检查External-DNS使用的ServiceAccount是否关联了正确的IAM角色:
kubectl describe serviceaccount external-dns -n <你的命名空间>
查看输出中的Annotations字段,是否存在eks.amazonaws.com/role-arn,且值为你预期的IAM角色ARN。
2. 配置/修复IRSA(IAM Roles for Service Accounts)
如果上述Annotation不存在或错误,需要重新配置IRSA:
- 创建Route53权限策略:
新建IAM策略(名称如ExternalDNSRoute53Policy),包含以下权限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["route53:ListHostedZones", "route53:ListResourceRecordSets"], "Resource": "*" }, { "Effect": "Allow", "Action": ["route53:ChangeResourceRecordSets"], "Resource": "arn:aws:route53:::hostedzone/*" } ] } - 创建关联ServiceAccount的IAM角色:
新建IAM角色(名称如eks-external-dns-role),信任关系配置为允许EKS OIDC提供商的ServiceAccount扮演该角色:
将之前创建的{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<你的AWS账号ID>:oidc-provider/oidc.eks.<区域>.amazonaws.com/id/<你的OIDC ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<区域>.amazonaws.com/id/<你的OIDC ID>:sub": "system:serviceaccount:<你的命名空间>:external-dns" } } } ] }ExternalDNSRoute53Policy附加到该角色。 - 给ServiceAccount添加角色ARN注解:
kubectl annotate serviceaccount external-dns -n <你的命名空间> eks.amazonaws.com/role-arn=arn:aws:iam::<你的AWS账号ID>:role/eks-external-dns-role
3. 检查External-DNS Deployment配置
确保Deployment指定了正确的ServiceAccount,且没有挂载节点的IAM凭证:
- 查看Deployment的
spec.serviceAccountName字段,确认值为external-dns(或你配置的ServiceAccount名称)。 - 检查Deployment的Volumes/VolumeMounts,避免挂载
/root/.aws/等节点级别的凭证目录,确保Pod使用IRSA提供的凭证。
4. 验证修复效果
重启External-DNS Pod:
kubectl rollout restart deployment external-dns -n <你的命名空间>
查看Pod日志,确认不再出现AccessDenied和同步超时错误,同时检查Route53是否生成了预期的记录。
关于节点角色的说明
scm-main-demo-eks-nodes是创建EKS节点组时AWS自动生成的IAM角色,用于节点与AWS服务的基础交互(如拉取ECR镜像、管理EBS卷等)。当Pod未配置IRSA时,会默认继承节点的IAM角色,这就是日志中出现该角色的原因。
内容的提问来源于stack exchange,提问作者AniketGole
相关产品推荐
相关产品推荐

