使用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/corednsSA,导致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
相关产品推荐
相关产品推荐

