coredns是kubernetes集群内嵌的dns服务,非linux宿主机配置项;其高可用需通过多副本、pod反亲和性、rbac授权、corefile域匹配、kubelet正确指向clusterip、健康探针及loop插件防环等机制实现。

CoreDNS 本身不是在 Linux 宿主机上“配置”的 DNS 服务,而是 Kubernetes 集群内部的 DNS 组件。所谓“Linux 中配置 CoreDNS 高可用集群”,实质是在 Kubernetes 集群中正确部署并增强 CoreDNS 的高可用性——它运行在 Pod 中,依赖 K8s 原生机制协同工作,不能脱离集群单独在 Linux 主机上启用。
下面分三部分说明关键操作点:
一、确保 CoreDNS 部署本身具备高可用基础
-
默认 CoreDNS Deployment 启动 2 个副本,但需确认是否真正跨节点分布
检查 Pod 分布:kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
若都在同一节点,需补全 Pod 反亲和性(anti-affinity)策略,例如:
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: k8s-app operator: In values: ["kube-dns"] topologyKey: "kubernetes.io/hostname" 使用
ClusterRoleBinding和ServiceAccount确保权限完整
缺少 RBAC 会导致日志刷Unauthorized,无法 watch Service/Pod 资源,直接导致解析失败。-
ConfigMap 中的 Corefile 必须包含
kubernetes cluster.local.域声明,且与--cluster-domain参数一致
错误示例(域不匹配):kubernetes example.local. { ... } # 但 kubelet 启动参数是 --cluster-domain=cluster.local此时所有
*.svc.cluster.local解析都会失败。
二、让每个节点上的 kubelet 正确指向 CoreDNS
- 修改每台 Node 的 kubelet 配置(如
/var/lib/kubelet/config.yaml),确保含:clusterDNS: - 169.254.25.10 # 必须与 CoreDNS Service 的 clusterIP 完全一致 clusterDomain: cluster.local
- 或通过启动参数注入(如
KUBELET_EXTRA_ARGS="--cluster-dns=169.254.25.10 --cluster-domain=cluster.local")
修改后重启 kubelet:systemctl restart kubelet
⚠️ 注意:若 Service 的 ClusterIP 是
169.254.25.10,但 kubelet 写成10.96.0.10,Pod 的/etc/resolv.conf就会写错 nameserver,整个 DNS 链路中断。
三、提升实际可用性与容灾能力
-
增加副本数(尤其在多节点集群中):
将 Deployment 的replicas改为 3 或更多,并配合topologySpreadConstraints实现跨可用区(AZ)部署:topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: k8s-app: kube-dns -
启用健康检查与就绪探针:
CoreDNS 自带/health(8080)和/readyz(8181)端点,Deployment 中应配置:livenessProbe: httpGet: path: /health port: 8080 readinessProbe: httpGet: path: /readyz port: 8181 避免上游转发死循环(loop 插件):
在 Corefile 中显式启用loop插件(默认已开启),防止 CoreDNS 把请求转给自身或内网 DNS 形成环路,触发进程退出。监控与指标采集:
Prometheus 插件暴露在:9153/metrics,可接入 Grafana 查看coredns_dns_request_count_total、coredns_dns_response_rcode_count_total{rcode="NXDOMAIN"}等关键指标,及时发现解析异常。
不复杂但容易忽略











