You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:52:43