CoreDNS 与 Bind9 在 Kubernetes 环境中有什么区别?

文章导读
在 Kubernetes 集群内部,CoreDNS 是默认且推荐的服务发现方案,而 Bind9 更适合传统内网域名管理或作为外部流量转发层。
📋 目录
  1. 核心区别对比
  2. CoreDNS 在 K8s 中的实操配置
  3. Bind9 在 K8s 边缘场景的使用
  4. 常见故障排查与坑
  5. 参考来源
A A

在 Kubernetes 集群内部,CoreDNS 是默认且推荐的服务发现方案,而 Bind9 更适合传统内网域名管理或作为外部流量转发层。

先说结论:CoreDNS 原生适配 K8s API 动态更新,Bind9 更适合静态区域文件或复杂转发场景。

  • 适用场景:K8s 内部服务发现首选 CoreDNS,传统 IDC 内网解析或外部权威 DNS 可用 Bind9
  • 配置方式:CoreDNS 通过 ConfigMap 热更新,Bind9 修改区域文件后需手动重载
  • 注意事项:Bind9 更新记录必须增加 SOA 序列号,否则从服务器不同步;CoreDNS 无需单独搭建 etcd,直接对接 API Server

核心区别对比

特性CoreDNSBind9
架构语言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 resources

2. 配置 CoreDNS 后端

CoreDNS 与 Bind9 在 Kubernetes 环境中有什么区别?

编辑 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-dns

Bind9 在 K8s 边缘场景的使用

如果需要用 Bind9 做 CoreDNS 的转发或管理外部域名,需注意配置规范。

CoreDNS 与 Bind9 在 Kubernetes 环境中有什么区别?

1. 修改区域文件

编辑区域文件(如 db.example.com),务必增加 SOA 序列号:

@   IN  SOA ns1.example.com. admin.example.com. (
            2023102701 ; Serial (必须递增)
            3600       ; Refresh
            1800       ; Retry
            604800     ; Expire
            86400 )    ; Minimum TTL

2. 检查与重载

执行检查命令确保语法正确:

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 简介