服务发现和 DNS


本页面介绍 Google Kubernetes Engine (GKE) 如何实现服务发现和集群 DNS。

服务发现

在 Kubernetes 中,服务发现是使用系统自动生成的服务名称实现的,这些名称会映射到相应 Service 的 IP 地址。服务名称遵循标准规范:如下所示:my-svc.my-namespace.svc.cluster-domain.example。Pod 还可以通过其名称(例如 example.com)访问外部服务。如需详细了解 DNS 在 Kubernetes 中的工作原理,请参阅 Service 和 Pod 的 DNS

GKE 中的集群 DNS

新的 Autopilot 集群使用 Cloud DNS,并且您无法修改 DNS 提供商。

对于 Standard,GKE 提供以下集群 DNS 选项来解析服务名称和外部名称:

  • kube-dns:默认情况下,所有 GKE 集群中部署的集群插件。
  • Cloud DNS:利用 Cloud DNS 且无需管理集群内 DNS 服务器(例如 kube-dns)的云代管式集群 DNS 基础架构。

您还可以向 Service Directory for GKE 注册服务。

GKE 还提供了 NodeLocal DNSCache,作为可与 kube-dns 或 Cloud DNS 结合使用的可选插件。

kube-dns

kube-dns 是 Standard 集群的默认 DNS 提供商,也是运行低于 1.25.9-gke.400 和 1.26.4-gke.500 版本的 Autopilot 集群的唯一 DNS 提供商。

kube-dns 作为 Deployment 运行,用于将 kube-dns Pod 安排到集群中的节点。

如需详细了解 kube-dns,请参阅使用 kube-dns

Cloud DNS

Cloud DNS 是运行 1.25.9-gke.400 版及更高版本和 1.26.4-gke.500 版及更高版本的 Autopilot 集群的唯一 DNS 提供商。

Cloud DNS 可在没有集群托管的 DNS 提供商(例如 kube-dns)的情况下提供 Pod 和 Service DNS 解析。Cloud DNS 控制器会自动在 Cloud DNS 中为 ClusterIP、无头和外部名称服务预配 Pod 和 Service 的 DNS 记录。

如需了解如何配置 Cloud DNS,请参阅使用 Cloud DNS for GKE

NodeLocal DNSCache

NodeLocal DNSCache 作为 DaemonSet 运行,可将 DNS 缓存 Pod 调度到每个集群节点上。此 DNS 缓存可以缩短 DNS 查找的延迟时间、使 DNS 查找时间更加一致,并可减少对 kube-dns 或 Cloud DNS 的 DNS 查询次数。

如需了解如何配置 NodeLocal DNSCache,请参阅设置 NodeLocal DNSCache

单个集群之外的服务发现

您可以使用以下方法之一,在单个集群范围之外配置服务发现。

Cloud DNS VPC 范围

使用 Cloud DNS 实现集群 DNS 的集群必须在以下两种可用模式之一下运行:GKE 集群范围或 Virtual Private Cloud (VPC) 范围。

在集群范围内配置集群时,DNS 记录只能使用架构 <svc>.<ns>.svc.cluster.local 在集群内进行解析。这与 kube-dns 的行为相同。

在 VPC 范围内配置集群时,集群服务的 DNS 记录可在整个 VPC 内进行解析。这意味着同一 VPC 中或是通过 Cloud VPN 或 Cloud Interconnect 连接到 VPC 的客户端可以直接解析 GKE 集群中 Service 的 DNS 记录。您还可以配置唯一的集群 DNS 名称,以便非 GKE 客户端可以解析 DNS 记录。例如,非 GKE 客户端可以通过 gke-svc.ns.svc.cluster2 解析 gke-svc.ns.svc.cluster1

如需详细了解 VPC 范围 DNS,请参阅使用 Cloud DNS for GKE

多集群 Service

多集群 Service 为利用现有 Service 对象的 GKE 提供多集群服务发现和负载均衡。可以在具有单个虚拟 IP 地址的任何 GKE 集群中发现和访问多集群 Service。这与可在单个集群中访问的 ClusterIP Service 的行为相同。

多集群 Service 跨集群聚合服务,并可使用架构 <svc>.<ns>.svc.clusterset.local 将它们作为单个多集群 DNS 记录进行寻址。这会为具有一致性且可使用多集群 Service 从任何 GKE 集群寻址的给定服务提供唯一名称。

如需详细了解多集群 Service,请参阅多集群 Service

Service Directory for GKE

Service Directory for GKE 提供您所有 Kubernetes 部署中的服务的单一视图。Service Directory 可以在单个注册表中同时注册 GKE 和非 GKE 服务。在以下情况下,Service Directory 特别有用:

  • 您需要 Kubernetes 和非 Kubernetes 应用的单个注册表,用于相互发现。
  • 您需要代管式服务发现工具。
  • 您希望存储可供其他客户端访问的服务的相关元数据。
  • 您希望按服务级别设置访问权限。

Service Directory 服务可以通过 DNS、HTTP 和 gRPC 进行解析。Service Directory 与 Cloud DNS 集成,可以填充与 Service Directory 中的服务匹配的 Cloud DNS 记录。

如需了解详情,请参阅配置 Service Directory for GKE

/etc/resolv.conf

对于使用 ClusterFirst DNS 政策的 Pod,/etc/resolv.conf 的值取决于为集群启用的功能:

Cloud DNS for GKE NodeLocal DNSCache /etc/resolv.conf
已启用 已启用 169.254.20.10
已启用 已停用 169.254.169.254
已停用 已启用 kube-dns 服务 IP 地址
已停用 已停用 kube-dns 服务 IP 地址

后续步骤