Kubernetes

K8s Service DNS 实现原理

·4 分钟阅读·1496 字
📋 目录

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

🌐 面试标准答案

  1. K8s 使用 CoreDNS 作为集群默认 DNS 服务器
  2. 每个 Service 创建时,自动注册域名到 CoreDNS
  3. CoreDNS watch API Server 实时维护服务名与 ClusterIP 的映射
  4. Pod 通过 /etc/resolv.conf 指向 CoreDNS,实现服务名解析
  5. 解析得到 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 流量转发

关联文档