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

使用Terraform创建AWS EKS集群时CoreDNS部署超时20分钟报错

CoreDNS部署超时根因

Fargate模式下EKS集群CoreDNS addon创建失败,本质是配置错误与时序问题导致Fargate调度器无法正常拉起CoreDNS Pod:

  • 单独定义aws_eks_addon.coredns资源绕过了Terraform EKS模块内置的Fargate适配逻辑,addon部署时机早于Fargate Profile规则生效时间,Pod持续处于Pending状态直到触发20分钟超时。
  • Fargate Profile的选择器仅配置了命名空间匹配,未绑定CoreDNS自带的k8s-app: kube-dns标签,调度规则无法精准命中CoreDNS Pod。
  • 自定义配置了Fargate Profile绑定的ServiceAccount,覆盖了CoreDNS默认使用的kube-system/coredns SA,导致IAM权限不匹配,Fargate无法完成Pod拉起流程。
  • 硬编码的v1.8.7-eksbuild.1版本与EKS 1.22版本的Fargate调度逻辑存在兼容性问题。
修复方案

1. 调整Terraform配置

首先删除独立声明的aws_eks_addon.coredns资源块,修改EKS模块配置如下:

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 18.0"

  cluster_name    = var.CLUSTER_NAME
  cluster_version = "1.22"

  cluster_endpoint_private_access = true
  cluster_endpoint_public_access  = true

  cluster_enabled_log_types = ["api", "audit", "authenticator", "controllerManager", "scheduler"]

  cluster_addons = {
    kube-proxy = {}
    vpc-cni = {
      resolve_conflicts = "OVERWRITE"
    }
    // 将coredns addon移入模块内置配置,使用版本适配的默认发行版,无需硬编码版本号
    coredns = {
      resolve_conflicts = "OVERWRITE"
    }
  }

  cluster_encryption_config = [{
    provider_key_arn = aws_kms_key.eks.arn
    resources        = ["secrets"]
  }]

  vpc_id     = module.vpc.vpc_id
  subnet_ids = module.vpc.private_subnets

  # Fargate Profile(s)
  fargate_profiles = {
    coredns-fargate-profile = {
      name = "coredns"
      selectors = [
        {
          namespace = "kube-system"
          // 补充CoreDNS标签匹配,确保调度规则精准命中Pod
          labels = {
            "k8s-app" = "kube-dns"
          }
        },
        {
          namespace = "default"
        },
        {
          namespace = var.ARGOCD_NAME_SPACE
        },
      ]
      pod_execution_role_arn = aws_iam_role.pod-execution-role.arn
      // 删除自定义service_account_name配置,使用CoreDNS默认SA避免权限异常
      subnets                = module.vpc.private_subnets
    }
  }

  // 增加显式依赖,确保Pod执行角色策略、Fargate Profile就绪后再部署集群组件
  depends_on = [
    aws_iam_role_policy_attachment.fargate_pod_execution_policy // 替换为你自身定义的Pod执行角色策略绑定资源名
  ]
}

2. 清理残留资源后重新部署

先清理之前部署失败产生的残留资源,再重新执行Terraform部署:

# 删除残留的失败coredns addon
aws eks delete-addon --cluster-name $CLUSTER_NAME --addon-name coredns

# 先单独部署Fargate Profile确保调度规则生效
terraform apply -target=module.eks.fargate_profile.this["coredns-fargate-profile"]

# 完整部署剩余集群资源
terraform apply

3. 部署验证

部署完成后执行如下命令校验CoreDNS运行状态,返回两个Running状态的Pod即为部署正常:

kubectl get pods -n kube-system -l k8s-app=kube-dns

如果仍有Pod处于Pending状态,执行kubectl describe pod -n kube-system <coredns-pod名称>查看事件,多数残留问题是首次部署失败的旧CoreDNS副本携带了EC2节点调度规则,删除旧副本等待Fargate自动重建即可。

内容的提问来源于stack exchange,提问作者Bob786

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:42:18