一、CoreDNS 与 Kubernetes 服务发现
Kubernetes 提供两种服务发现方式:
- 环境变量方式:通过注入环境变量暴露服务信息,仅适用于简单场景
- 内部域名方式:通过 DNS 解析服务名称,是主流且推荐的方式
自 Kubernetes 1.11 版本起,CoreDNS 已取代 kube-dns 成为默认 DNS 组件,负责处理集群内部所有 Service 和 Pod 的域名解析请求。
二、域名解析的底层依赖:resolv.conf
容器内的 /etc/resolv.conf 文件是 DNS 解析的核心配置,典型内容如下:
cat /etc/resolv.conf
nameserver 169.254.25.10 # 通常是 CoreDNS 或 NodeLocalDNS 的地址
search default.svc.test.com svc.test.com test.com
options ndots:5
配置解析:
nameserver:指定 DNS 服务器地址,集群内通常指向 CoreDNS 的 ClusterIPsearch:域名搜索域列表,用于自动补全域名后缀options ndots:5:控制域名搜索行为的阈值参数
三、Pod 的 DNS 策略
Kubernetes 为 Pod 提供四种 DNS 策略,通过 dnsPolicy 字段配置:
- Default:继承所在节点的 DNS 配置
- ClusterFirst(默认):优先使用集群 CoreDNS 解析,未命中则转发到上游 DNS
- ClusterFirstWithHostNet:适用于 hostNetwork 模式的 Pod,规则同 ClusterFirst
- None :忽略集群默认配置,仅使用
dnsConfig自定义配置
示例:使用自定义 DNS 配置
spec:
dnsPolicy: "None"
dnsConfig:
nameservers:
- 114.114.114.114 # 自定义 DNS 服务器
searches:
- default.svc.test.com
options:
- name: ndots
value: "5"
四、CoreDNS 解析规则详解
CoreDNS 的解析行为由 resolv.conf 配置决定,核心规则如下:
1. 域名搜索机制
访问短域名时,会自动结合 search 字段补全后缀。例如访问 nginx 时,解析顺序为:
nginx.default.svc.test.com. → nginx.svc.test.com. → nginx.test.com.
2. ndots 参数的影响
- 当域名包含的点(.)小于 5:先使用 search 域补全,再尝试绝对域名
- 当域名包含的点(.)大于等于 5:先尝试绝对域名,再使用 search 域补全
示例(ndots=5):
- 访问
a.b.c.e.(4 个点):先补全搜索域,再查绝对域名 - 访问
a.b.c.e.f.g(5 个点):先查绝对域名,再补全搜索域
五、Pod 间通信的域名解析实践
1. 通过 Service 名称通信
Kubernetes 中 Service 的完整域名格式为:
<service-name>.<namespace>.svc.<cluster-domain>
通信示例:
-
同命名空间:直接使用 Service 名称(如
nginx-svc) -
跨命名空间:需指定命名空间(如
harbor-core.harbor)跨命名空间访问示例
[root@mypod /]# ping harbor-core.harbor
PING harbor-core.harbor.svc.test.com (10.10.30.184) 56(84) bytes of data.
64 bytes from harbor-core.harbor.svc.test.com (10.10.30.184): icmp_seq=1 ttl=64 time=0.095 ms
2. 通过 hostname 和 subdomain 通信
可通过自定义主机名和子域名直接解析到 Pod IP:
spec:
hostname: nginx # 自定义主机名
subdomain: subdomain-test # 自定义子域名
containers:
- name: nginx
image: nginx:latest
配合同名 Service 可形成 nginx.subdomain-test.default.svc.test.com 域名,直接解析到该 Pod 的 IP 地址。
六、CoreDNS 核心配置(Corefile)解析
CoreDNS 的配置通过 ConfigMap 管理,典型配置如下:
apiVersion: v1
data:
Corefile: |
.:53 {
errors # 启用错误日志
health { # 健康检查配置
lameduck 5s
}
ready # 就绪探针支持
# Kubernetes 域名解析配置
kubernetes test.com in-addr.arpa ip6.arpa {
pods insecure # 允许 Pod 域名解析
fallthrough in-addr.arpa ip6.arpa
ttl 30 # DNS 记录缓存时间
}
prometheus :9153 # 监控指标暴露
# 转发非集群域名到上游 DNS
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30 # 缓存时间
loop # 循环检测
reload # 配置自动重载
loadbalance # 负载均衡
}
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
七、添加外部域名解析
如需在集群内解析外部域名,可通过 hosts 插件配置:
-
导出当前配置:
kubectl get cm coredns -n kube-system -o yaml > coredns-configmap.yaml
-
添加 hosts 配置:
hosts {
10.151.30.11 git.k8s.local # 自定义域名映射
fallthrough # 未匹配时继续处理
} -
应用配置并重启:
kubectl apply -f coredns-configmap.yaml
kubectl delete pod -n kube-system -l k8s-app=kube-dns # 重启 CoreDNS -
验证配置:
dig @10.96.0.10 git.k8s.local # 应返回 10.151.30.11
总结
CoreDNS 作为 Kubernetes 服务发现的核心组件,通过灵活的插件机制和配置方式,实现了集群内部高效的域名解析。理解其解析规则、DNS 策略和配置方法,对于排查服务通信问题、优化集群网络至关重要。合理配置 CoreDNS 不仅能保障集群内部服务的稳定通信,还能灵活对接外部域名,满足复杂业务场景需求。