本页面介绍 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 查询。
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.local
、myservice.svc.cluster.local
、myservice.cluster.local
、myservice.c.my-project-id.internal
和 myservice.google.internal
。
后续步骤
- 了解如何使用 NodeLocal DNSCache 为需要大量 DNS 查询的集群提供可扩缩的 DNS 解析。