k8s中内部提供的DNS组件解析
Kubernetes 服务发现演进:从 kube-dns 到 CoreDNS 的全面解析
摘要:
Kubernetes 集群内部的服务发现是微服务架构的核心基础,而 DNS 服务则是实现这一机制的关键组件。本文将深入探讨 Kubernetes DNS 服务的演进历程,对比 kube-dns 与 CoreDNS 的架构差异,解析 CoreDNS 的核心优势,并提供迁移实践、应用场景及常见问题解决方案。
一、演进背景:为什么需要 CoreDNS?
在 Kubernetes 集群中,服务发现允许 Pod 通过服务名(而非硬编码 IP)定位其他服务。早期的默认 DNS 组件 kube-dns 因架构复杂、性能瓶颈和维护成本高等问题逐渐被弃用。自 Kubernetes 1.11 起,CoreDNS 成为官方推荐的 DNS 解决方案,其核心优势在于:
- 架构简化:单进程模型取代多组件协作。
- 性能提升:低延迟、高并发处理能力。
- 灵活扩展:插件化设计支持自定义功能。
- 简化运维:无外部依赖(如 etcd),配置更直观。
二、架构对比:kube-dns vs CoreDNS
1. kube-dns 的架构与痛点

kube-dns 由多个组件构成,导致复杂性和性能问题:
- etcd:存储 DNS 记录,引入额外依赖。
- kube2sky:监听 Kubernetes API,生成 DNS 记录(后期被弃用)。
- skydns:提供 DNS 解析服务,性能较差。
- dnsmasq:作为缓存层,但增加了组件间通信开销。
痛点总结:
- 组件间通信频繁,延迟高。
- 维护复杂,故障排查困难。
- 扩展性差,难以满足大规模集群需求。
2. CoreDNS 的架构革新

CoreDNS 采用单进程模型,直接与 Kubernetes API 交互:
- Kubernetes 插件:实时监听 Service/Endpoint/Pod 变更,生成 DNS 记录。
- 插件链机制:通过组合插件实现 DNS 解析、缓存、转发等功能。
- 无状态设计:无需依赖外部存储(如 etcd),降低运维复杂度。
三、CoreDNS 核心机制详解
1. 核心插件与配置
CoreDNS 通过 Corefile 配置文件定义行为,以下是一个典型配置示例:
.:53 {
errors # 输出错误日志
health # 健康检查端点(默认端口 8080)
ready # 就绪检查端点
# Kubernetes 服务发现插件
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure # 允许通过 Pod IP 解析 Pod 名称
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153 # 暴露 Prometheus 指标
forward . /etc/resolv.conf # 非集群域名转发至上游 DNS
cache 30 # 本地缓存有效期 30 秒
reload # 自动重载配置变更
loop # 检测 DNS 环路
}
2. 关键插件解析
| 插件 | 功能描述 |
|---|---|
kubernetes |
集成 K8s API,解析 Service/Pod 的 DNS 请求。 |
forward |
将外部域名查询转发到上游 DNS(如 8.8.8.8)。 |
cache |
缓存 DNS 结果,减少 API Server 负载。 |
rewrite |
重写 DNS 请求或响应(如将 old-name 映射到 new-name)。 |
prometheus |
提供监控指标,便于分析 DNS 查询延迟和错误率。 |
四、迁移到 CoreDNS 的实践指南
1. 迁移步骤
- 确认集群版本:确保 Kubernetes ≥1.11。
- 部署 CoreDNS:
kubectl apply -f https://raw.githubusercontent.com/coredns/deployment/master/kubernetes/coredns.yaml - 修改 kubelet 配置:更新
--cluster-dns参数指向 CoreDNS Service IP。 - 删除 kube-dns:
kubectl delete deployment/kube-dns service/kube-dns -n kube-system
2. 功能验证
进入临时 Pod 测试 DNS 解析:
kubectl run -it --rm dns-test --image=busybox:1.28 --restart=Never -- sh
# 解析普通 Service
nslookup kubernetes.default
# 解析 Headless Service(返回多个 Pod IP)
nslookup my-headless-svc.my-namespace.svc.cluster.local
五、典型应用场景
1. 服务名解析
- 普通 Service:
my-svc.my-namespace.svc.cluster.local→ Cluster IP。 - Headless Service:
my-stateful-svc.my-namespace.svc.cluster.local→ 直接返回所有 Pod IP。
2. StatefulSet 的稳定网络标识
StatefulSet Pod 拥有固定 DNS 名称:
<pod-name>.<svc-name>.<namespace>.svc.cluster.local
例如:web-0.nginx.default.svc.cluster.local。
3. 自定义域名重写
通过 rewrite 插件实现内部域名映射:
example.com {
rewrite name myapp.example.com my-svc.default.svc.cluster.local
}
六、常见问题与解决方案
1. DNS 解析超时
- 检查项:
- CoreDNS Pod 是否正常运行(
kubectl get pods -n kube-system)。 - 网络策略是否放行 UDP 53 端口。
- CoreDNS 日志是否有错误(
kubectl logs -n kube-system <coredns-pod>)。
- CoreDNS Pod 是否正常运行(
2. 外部域名解析失败
- 配置示例:通过
forward插件指定上游 DNS:forward . 8.8.8.8 8.8.4.4 { policy sequential # 按顺序尝试上游服务器 }
3. 性能调优
- 启用缓存:
cache 30缓存 30 秒内的查询结果。 - 调整资源限制:为 CoreDNS 分配更多 CPU/内存(适用于大规模集群):
resources: limits: memory: 512Mi cpu: 500m
七、总结:为什么选择 CoreDNS?
- 性能卓越:单进程模型减少上下文切换,延迟降低 30% 以上(实测数据)。
- 高度灵活:插件机制支持监控、缓存、安全策略等扩展。
- 未来就绪:CNCF 毕业项目,持续支持 IPv6、Service Mesh 等新特性。
通过迁移到 CoreDNS,Kubernetes 集群的服务发现能力将更加高效可靠,为微服务架构提供坚实底座。
延伸阅读:
附录:
希望这篇整理后的文章能帮助您清晰呈现 Kubernetes DNS 服务的演进与最佳实践!
浙公网安备 33010602011771号