K8s Service DNS 实现原理
K8s 并没有自己造 DNS,而是用 CoreDNS 实现 Service 域名解析。Service 只是一个虚拟 IP(ClusterIP),CoreDNS 负责把 Service 名字翻译成 ClusterIP。
📖 Service DNS 格式
每个 Service 会自动获得一个 DNS 域名:
<service-name>.<namespace>.svc.cluster.local
例如:my-svc.default.svc.cluster.local
Pod 里直接用 my-svc 就能访问,不用写 IP。
⚡ DNS 解析流程(面试必考)
Pod 发起 DNS 查询
→ Pod 的 /etc/resolv.conf 指向 kube-dns Service IP(CoreDNS)
→ 请求到达 CoreDNS(运行在 kube-system 的 Pod,监听 53 端口)
→ CoreDNS 查 K8s API,内存中维护服务名 → ClusterIP 映射
→ 返回 ClusterIP 给 Pod
→ Pod 拿到 IP,走 Service 负载均衡访问后端 Pod
🔧 CoreDNS 如何知道所有 Service?
它直接 watch Kubernetes API!
- 实时监听 Service 创建/删除/更新
- 把 Service 信息存在内存
- 不查 ETCD,不查数据库,极快
这就是为什么 Service 一创建,DNS 立刻生效。
⚙️ 为什么 Pod 里能直接写服务名?
Pod 里的 /etc/resolv.conf 自带:
nameserver 10.96.0.10 # kube-dns 的固定 ClusterIP
search default.svc.cluster.local svc.cluster.local
所以:
- 直接写
my-svc→ 自动补全为my-svc.default.svc - 跨命名空间:
my-svc.ns1
🚀 Service 与 DNS 的关系(最关键)
- Service 不提供 DNS
- Service 只提供 ClusterIP
- CoreDNS 提供域名到 ClusterIP 的映射
Service = 虚拟 IP + 负载均衡 CoreDNS = 服务名 → 虚拟 IP
🌐 面试标准答案
- K8s 使用 CoreDNS 作为集群默认 DNS 服务器
- 每个 Service 创建时,自动注册域名到 CoreDNS
- CoreDNS watch API Server 实时维护服务名与 ClusterIP 的映射
- Pod 通过
/etc/resolv.conf指向 CoreDNS,实现服务名解析 - 解析得到 ClusterIP 后,流量走 iptables/IPVS 负载均衡到后端 Pod
💾 常见面试题
Q:Service 域名格式是什么?
A:<svc>.<ns>.svc.cluster.local
Q:Pod 为什么能直接访问服务名?
A:因为 resolv.conf 配置了 search 域,自动补全命名空间。
Q:CoreDNS 挂了会怎样?
A:Pod 无法解析服务名,但可以直接用 IP 访问 Service。
关联文档
- K8s 核心概念#🌐 网络与通信 — Service 概念
- ../../network/网络 — 网络基础与排错
- K8s 组件详解#kube-proxy — kube-proxy 流量转发
关联文档