服务发现和 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

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 是 GKE 集群的默认集群 DNS 提供商。它作为 Deployment 运行,用于将 kube-dns pod 安排到集群中的节点。

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

Cloud DNS

Cloud DNS 提供 Pod 和 Service DNS 解析,而不使用集群托管的 DNS 提供商(如 kube-dns)。Cloud DNS 控制器会在 Cloud DNS for ClusterIP(无头和外部名称服务)中为 pod 和服务自动预配 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 为 GKE 提供多集群服务发现和负载均衡,以便利用现有 Service 对象。多集群 Service 可在具有单个虚拟 IP 地址的任何 GKE 集群中发现并访问。此行为与可在单个集群中访问的 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 地址

后续步骤