Kubernetes

K8s Service DNS 实现原理

·4 分钟阅读·1496 字

**K8s 并没有自己造 DNS,而是用 CoreDNS 实现 Service 域名解析。Service 只是一个虚拟 IP(ClusterIP),CoreDNS 负责把 Service 名字翻译成

📋 目录

K8s Service DNS 实现原理

K8s 并没有自己造 DNS,而是用 CoreDNS 实现 Service 域名解析。Service 只是一个虚拟 IP(ClusterIP),CoreDNS 负责把 Service 名字翻译成 ClusterIP。

1. 📖 Service DNS 格式

每个 Service 会自动获得一个 DNS 域名:


<service-name>.<namespace>.svc.cluster.local

例如:my-svc.default.svc.cluster.local

Pod 里直接用 my-svc 就能访问,不用写 IP。

2. ⚡ 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

3. 🔧 CoreDNS 如何知道所有 Service?

它直接 watch Kubernetes API!

  • 实时监听 Service 创建/删除/更新
  • 把 Service 信息存在内存
  • 不查 ETCD,不查数据库,极快 这就是为什么 Service 一创建,DNS 立刻生效。

4. ⚙️ 为什么 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

5. 🚀 Service 与 DNS 的关系(最关键)

  • Service 不提供 DNS
  • Service 只提供 ClusterIP
  • CoreDNS 提供域名到 ClusterIP 的映射

Service = 虚拟 IP + 负载均衡 CoreDNS = 服务名 → 虚拟 IP

6. 🌐 面试标准答案

  1. K8s 使用 CoreDNS 作为集群默认 DNS 服务器
  2. 每个 Service 创建时,自动注册域名到 CoreDNS
  3. CoreDNS watch API Server 实时维护服务名与 ClusterIP 的映射
  4. Pod 通过 /etc/resolv.conf 指向 CoreDNS,实现服务名解析
  5. 解析得到 ClusterIP 后,流量走 iptables/IPVS 负载均衡到后端 Pod

7. 💾 常见面试题

7.1. Q:Service 域名格式是什么?

A:<svc>.<ns>.svc.cluster.local

7.2. Q:Pod 为什么能直接访问服务名?

A:因为 resolv.conf 配置了 search 域,自动补全命名空间。

7.3. Q:CoreDNS 挂了会怎样?

A:Pod 无法解析服务名,但可以直接用 IP 访问 Service。

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro