CoreDNS在Kubernetes 1.11+中默认存在且由kubelet管理,验证需三步:检查Pod状态为Running,确认/etc/resolv.conf指向集群DNS IP,执行nslookup kubernetes.default.svc.cluster.local成功返回ClusterIP。

CoreDNS 不需要你“部署”——它在 1.11+ 的 Kubernetes 集群中默认已存在,且由 kubelet 自动管理。你真正要做的,是确认它在运行、理解它的配置逻辑、并按需调整 Corefile,而不是从零手写 yaml 或手动拉镜像。
怎么确认 CoreDNS 正在工作
别急着改配置,先验证基础状态:
- 运行
kubectl get pods -n kube-system -l k8s-app=kube-dns,看到两个Running状态的 Pod(名称通常含coredns-)才算正常 - 进任意业务 Pod:
kubectl exec -it <pod-name> -- cat /etc/resolv.conf,检查nameserver是否指向集群内 DNS Service IP(如169.169.0.100),不是宿主机的127.0.0.1或公网 DNS - 执行
nslookup kubernetes.default.svc.cluster.local,能返回 ClusterIP 且无NXDOMAIN或超时,说明解析链通了
如果卡在第二步——/etc/resolv.conf 指向错误,问题大概率出在 kubelet 启动参数没配对 --cluster-dns 和 --cluster-domain,和 CoreDNS 本身无关。
修改 Corefile 的安全方式
直接 kubectl edit configmap coredns -n kube-system 是高危操作:语法错一个字符(比如漏掉 { 或拼错 forward 为 forwad),整个 CoreDNS Pod 会 CrashLoopBackOff,所有服务发现立即中断。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 务必先备份:
kubectl get configmap coredns -n kube-system -o yaml > coredns-backup.yaml - 修改前用
coredns -f /dev/stdin -validate校验内容(需本地装 CoreDNS 二进制) - 关键改动只放
kubernetes插件块内或新增独立区块,避免动.:53 { ... }主入口结构 - 加自定义域名映射,用
hosts插件最稳妥,例如:hosts { 192.168.10.5 api.internal fallthrough },它不依赖上游、不引入转发延迟、也不影响原有解析逻辑
forward 插件常见误配点
想让非 .cluster.local 域名走外部 DNS?forward . /etc/resolv.conf 看似合理,但实际隐患很多:
-
/etc/resolv.conf在 CoreDNS Pod 内是空的或仅含127.0.0.11(kubelet 注入的 dummy resolver),根本不可用 - 应显式写死上游 DNS,如
forward . 8.8.8.8 114.114.114.114,并加max_concurrent 1000防雪崩 - 若需区分内外网域名,必须用存根域(stubDomain),例如把
.test.local转发到内部 DNS:test.local { forward . 10.10.20.10 },否则所有请求都走同一组 upstream,无法隔离 - 注意
fallthrough位置:它必须放在forward块末尾,否则匹配失败后不会继续交给下一个插件处理
为什么改完 ConfigMap 有时不生效
CoreDNS 默认支持热重载(reload 插件启用时),但以下情况会静默失败:
- ConfigMap 更新后,Pod 没触发滚动更新(旧 Pod 还在用老配置),需手动
kubectl rollout restart deployment/coredns -n kube-system - 你改的是
data.Corefile,但实际生效的是data["Corefile"](YAML key 带引号),k8s 对 key 名大小写和空格敏感 - 集群启用了托管版 CoreDNS(如阿里云 ACK 托管版),
corednsConfigMap 是只读的,任何修改都会被自动 revert -
cache插件 TTL 过长(如设成 300),导致旧解析结果缓存太久,误判为配置未生效
最易被忽略的一点:CoreDNS 解析行为严格绑定 --service-cluster-ip-range CIDR 和 --cluster-domain 参数,这两个值在集群初始化后就不能再改——哪怕你把 Corefile 里的 cluster.local 换成 mycorp.local,只要 kube-apiserver 没同步更新,kubernetes 插件就压根不认这个域。

















