在 Kubernetes 集群内部,CoreDNS 是默认且推荐的服务发现方案,而 Bind9 更适合传统内网域名管理或作为外部流量转发层。
先说结论:CoreDNS 原生适配 K8s API 动态更新,Bind9 更适合静态区域文件或复杂转发场景。
- 适用场景:K8s 内部服务发现首选 CoreDNS,传统 IDC 内网解析或外部权威 DNS 可用 Bind9
- 配置方式:CoreDNS 通过 ConfigMap 热更新,Bind9 修改区域文件后需手动重载
- 注意事项:Bind9 更新记录必须增加 SOA 序列号,否则从服务器不同步;CoreDNS 无需单独搭建 etcd,直接对接 API Server
核心区别对比
| 特性 | CoreDNS | Bind9 |
|---|---|---|
| 架构语言 | Go 语言,单二进制 | C 语言,进程复杂 |
| K8s 集成 | 原生插件支持,动态感知 Pod/Service | 无原生支持,需配合外部脚本或控制器 |
| 配置更新 | 修改 ConfigMap 自动重载 | 修改 zone 文件需 rndc reload 且更新 SOA |
| 数据存储 | 内存缓存,后端对接 K8s API | 本地文件或数据库 |
CoreDNS 在 K8s 中的实操配置
1. 确认 CoreDNS 部署状态
检查 kube-system 命名空间下的 CoreDNS Pod 状态:
kubectl get pods -n kube-system -l k8s-app=kube-dns默认部署 2 个副本,通过 Pod 反亲和性确保分布在不同节点。查看资源限制:
kubectl get deployment coredns -n kube-system -o yaml | grep -A 5 resources2. 配置 CoreDNS 后端
编辑 ConfigMap 配置 Corefile,启用 kubernetes 插件。CoreDNS 在 K8s 中直接对接 API Server,无需用户单独搭建 etcd 后端。
kubectl edit configmap coredns -n kube-system典型 Corefile 配置片段:
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}3. 验证解析是否生效
在集群内运行 busybox 测试 Service 域名解析:
kubectl run -it `--rm` `--restart`=Never busybox `--image`=busybox:1.28 -- nslookup kubernetes.default预期返回 ClusterIP 地址。检查 CoreDNS 日志是否有 errors:
kubectl logs -n kube-system -l k8s-app=kube-dnsBind9 在 K8s 边缘场景的使用
如果需要用 Bind9 做 CoreDNS 的转发或管理外部域名,需注意配置规范。
1. 修改区域文件
编辑区域文件(如 db.example.com),务必增加 SOA 序列号:
@ IN SOA ns1.example.com. admin.example.com. (
2023102701 ; Serial (必须递增)
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL2. 检查与重载
执行检查命令确保语法正确:
named-checkzone example.com /var/named/db.example.com重载配置:
rndc reload
# 或
systemctl reload named常见故障排查与坑
- Bind9 从服务器不更新:最常见原因是主服务器更新记录后忘记增加 SOA 序列号,导致从服务器认为区域文件未变更。
- CoreDNS 镜像兼容性:Kubernetes 1.24+ 集群默认使用特定版本 CoreDNS 镜像,低版本集群可能使用 1.8.4 镜像,升级集群时注意 CoreDNS 版本兼容性。
- CoreDNS 缓存问题:修改 Service 后解析未更新,可能是 CoreDNS cache 插件生效中,默认缓存 30 秒,可通过
kubectl rollout restart deployment coredns -n kube-system强制刷新。 - 安全性说明:Bind9 历史较长,过去存在由内存访问错误引起的漏洞(多为 C 语言特性),CoreDNS 基于 Go 语言内存管理相对安全,但两者均需及时更新版本修复已知 CVE。
参考来源
- CoreDNS Official Documentation
- Kubernetes DNS for Services and Pods
- BIND 9 Administrator Reference Manual
- CoreDNS 配置 kubernetes 作为后端 - 技术社区
- K8s 服务发现组件-CoreDNS 简介