服务发现和 DNS

本页面介绍 Google Kubernetes Engine (GKE) 如何实现服务发现和托管式 DNS。如需大致了解如何在 Kubernetes 集群中使用 DNS,请参阅服务和 Pod 的 DNS

服务发现和 Kube-dns 插件

在 Kubernetes 中,服务发现功能是使用系统自动生成的服务名称实现的,这些名称会映射到相应服务的 IP 地址。服务名称遵循标准规范my-svc.my-namespace.svc.my-zone。Pod 还可以通过外部服务的名称访问该服务,例如 example.com。如需详细了解 DNS 在 Kubernetes 中的行为,请参阅服务和 Pod 的 DNS

GKE 提供托管式 DNS,用于解析服务名称和外部名称。这是通过 kube-dns 集群插件实现的,该插件会默认部署到所有 GKE 集群中。Kube-dns 会作为 Deployment 运行并将冗余 kube-dns Pod 调度到集群中的各节点。kube-dns Pod 位于 kube-system 命名空间中。kube-dns 部署通过相应的 Service 访问,该 Service 会对 kube-dns Pod 进行分组并为其提供单一 IP 地址。默认情况下,集群中的所有 Pod 均使用此服务来解析 DNS 查询。

Pod 与 Kube-dns 服务之间的关系图(如前一段所述)

Kube-dns 会从容扩缩以满足集群的 DNS 需求。此扩缩过程由 kube-dns-autoscaler 控制;默认情况下,所有 GKE 集群都会部署该自动扩缩程序。kube-dns-autoscaler 会根据集群中的节点数和核心数调整 kube-dns 部署中副本的数量。

Pod DNS 的配置方式

在每个节点上运行的 kubelet 代理会将 Pod 的 etc/resolv.conf 配置为使用 kube-dns 服务的 ClusterIP。下面提供了此配置的一个示例;在本例中,kube-dns 服务的 IP 地址为 10.0.0.10(此 IP 地址在其他集群中会有所不同):

# cat /etc/resolv.conf
nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local c.my-project-id.internal google.internal
options ndots:5

kube-dns 是集群网域 (cluster.local) 的权威域名服务器,可以递归方式解析外部名称。非完全限定的简称(如 myservice)会首先填充本地搜索路径,例如 myservice.default.svc.cluster.localmyservice.svc.cluster.localmyservice.cluster.localmyservice.c.my-project-id.internalmyservice.google.internal

后续步骤

  • 了解如何使用 NodeLocal DNSCache 为需要大量 DNS 查询的集群提供可扩缩的 DNS 解析。