基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

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. 它是如何工作的?(简要流程)

  1. 部署: CoreDNS 通常以 Deployment 的形式运行在 kube-system 命名空间中(通常有两个副本以保证高可用)。
  2. 服务入口: 它通过一个 Service(通常名为 kube-dns)暴露固定的 ClusterIP(默认为网段的第 10 个 IP,如 10.96.0.10)。
  3. Pod 配置: Kubelet 在创建每个 Pod 时,会自动修改 Pod 内部的 /etc/resolv.conf 文件,将 nameserver 指向 CoreDNS 的 Service IP。
  4. 解析流程:
    • Pod 发起 DNS 请求。
    • 请求到达 CoreDNS。
    • CoreDNS 检查是否是 cluster.local 后缀:
      • 是: 查询 K8s API Server 或本地缓存,返回 Service IP 或 Pod IP。
      • 否: 转发给上游 DNS 解析外部网络。

总结

如果没有 CoreDNS:

  • Pod 之间无法通过名字通信,只能硬编码 IP(这在动态的 K8s 环境中是不可行的)。
  • Pod 无法解析外部互联网地址。

因此,CoreDNS 是 K8s 集群网络通信的基石,实现了应用之间的解耦。

00:00
00:00