CoreDNS 在 K8s 中起什么作用?
CoreDNS 在 Kubernetes (K8s) 中扮演着 集群内部 DNS 服务器 的角色。简单来说,它是 K8s 集群的 “电话簿”。
它的核心作用是实现 服务发现 (Service Discovery),即让集群内的 Pod 可以通过“名字”而不是“IP 地址”来找到其他的服务。
以下是 CoreDNS 在 K8s 中的具体作用和详细解析:
1. 内部服务解析 (Service Discovery)
这是 CoreDNS 最主要的功能。
- 问题: 在 K8s 中,Pod 的 IP 地址是动态变化的(重启后会变),Service 的 ClusterIP 虽然相对稳定,但很难记忆。
- CoreDNS 的作用: 它为 K8s 中的 Service 生成标准的域名。
- 工作方式: 当你在 Pod A 中想要访问 Pod B 对应的 Service(名为
my-db,位于default命名空间)时,你只需要访问域名my-db.default.svc.cluster.local。CoreDNS 会将这个域名解析为该 Service 的 ClusterIP。
2. 外部域名解析 (Upstream Resolution)
- 问题: Pod 不仅需要访问集群内部的服务,有时还需要访问外部互联网(例如
google.com或阿里云的 API)。 - CoreDNS 的作用: 当 Pod 请求解析一个非集群内部的域名时,CoreDNS 会识别出这不是内部域名,并将请求 转发 给上游 DNS 服务器(通常是宿主机 Node 配置的 DNS,如 8.8.8.8 或云厂商的 DNS)。
- 结果: Pod 既能解析内部服务,也能解析外部网络地址。
3. 支持 Headless Services (无头服务)
- 场景: 对于 StatefulSet(有状态应用,如 Redis 集群、Kafka、Elasticsearch),客户端往往需要直接连接到具体的 Pod,而不是通过 Service 的负载均衡 IP。
- CoreDNS 的作用: 当 Service 被配置为 Headless (即
ClusterIP: None) 时,CoreDNS 不会返回一个 VIP (虚拟 IP),而是直接返回该 Service 下 所有后端 Pod 的 IP 地址列表。这使得应用可以自己控制连接到哪个具体的节点。
4. 自定义 DNS 记录 (Stub Domains & Rewrites)
- 场景: 你可能有一些运行在 K8s 集群之外的传统服务(如旧的数据库),但你希望 K8s 内部的 Pod 能通过特定的内部域名访问它们。
- CoreDNS 的作用: 通过修改 CoreDNS 的配置文件(
Corefile),你可以配置:- Rewrite: 重写域名规则。
- Hosts: 手动添加静态的
域名 -> IP映射。 - Stub Domains: 将特定后缀的域名(如
*.corp.local)转发给指定的企业内部 DNS 服务器。
5. 它是如何工作的?(简要流程)
- 部署: CoreDNS 通常以 Deployment 的形式运行在
kube-system命名空间中(通常有两个副本以保证高可用)。 - 服务入口: 它通过一个 Service(通常名为
kube-dns)暴露固定的 ClusterIP(默认为网段的第 10 个 IP,如10.96.0.10)。 - Pod 配置: Kubelet 在创建每个 Pod 时,会自动修改 Pod 内部的
/etc/resolv.conf文件,将nameserver指向 CoreDNS 的 Service IP。 - 解析流程:
- Pod 发起 DNS 请求。
- 请求到达 CoreDNS。
- CoreDNS 检查是否是
cluster.local后缀:- 是: 查询 K8s API Server 或本地缓存,返回 Service IP 或 Pod IP。
- 否: 转发给上游 DNS 解析外部网络。
总结
如果没有 CoreDNS:
- Pod 之间无法通过名字通信,只能硬编码 IP(这在动态的 K8s 环境中是不可行的)。
- Pod 无法解析外部互联网地址。
因此,CoreDNS 是 K8s 集群网络通信的基石,实现了应用之间的解耦。