本页面介绍 Google Kubernetes Engine (GKE) 如何使用 kube-dns(GKE 集群的默认 DNS 提供商)实现服务发现。
架构
创建集群时,GKE 会自动在 kube-system
命名空间中部署 kube-dns pod。Pod 通过相应的 Service 访问 kube-dns 部署,该 Service 会对 Kube-dns Pod 进行分组并为其提供单一 IP 地址 (ClusterIP)。默认情况下,集群中的所有 Pod 均使用此服务来解析 DNS 查询。下图显示了 pod 与 kube-dns 服务之间的关系。
Kube-dns 会从容扩缩以满足集群的 DNS 需求。此扩缩过程由 kube-dns-autoscaler
控制,该 Pod 默认部署在所有 GKE 集群中。kube-dns-autoscaler
会根据集群中的节点数和核心数调整 kube-dns 部署中的副本数。
Pod DNS 的配置方式
每个节点上运行的 kubelet 代理会将 Pod 的 etc/resolv.conf
配置为使用 kube-dns 服务的 ClusterIP。以下示例配置显示 kube-dns 服务的 IP 地址为 10.0.0.10
。此 IP 地址在其他集群中是不同的。
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
)会首先填充本地搜索路径,
为存根网域添加自定义解析器
您可以修改 kube-dns 的 ConfigMap,以将存根网域作为集群中的 DNS 基础架构的一部分。
存根网域允许您配置每个网域的自定义解析器,以便 kube-dns 在解析这些网域时将 DNS 请求转发到特定的上游 DNS 服务器。
以下示例 kube-dns 的 ConfigMap 清单包括为网域 example.com 设置自定义解析器的 stubDomains
配置。
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{
"example.com": [
"8.8.8.8",
"8.8.4.4",
"1.1.1.1",
"1.0.0.1"
]
}
运行以下命令以打开文本编辑器:
kubectl edit configmap kube-dns -n kube-system
将文件内容替换为清单,然后退出文本编辑器以将清单应用到集群。
上游域名服务器
如果您修改 kube-dns 的 ConfigMap 以包含 upstreamNameservers
,则 kube-dns 会将除 *.cluster.local
之外的所有 DNS 请求转发到这些服务器。这包括上游服务器无法解析的 metadata.internal
和 *.google.internal
。
如果您启用了 Workload Identity 或任何依赖于 metadata.internal
解析的工作负载,请勿使用 upstreamNameservers
。请改用 stubDomains
。
已知问题
搜索网域限制
/etc/resolv.conf
最多只能有 6 个 DNS 搜索网域。如果您定义超过 6 个搜索网域,则在运行 kubectl describe pod
命令时会显示以下警告:
Search Line limits were exceeded, some search paths have been omitted, the applied search line is: default.svc.cluster.local svc.cluster.local cluster.local c.<project ID>.internal google.internal
此警告记录在 Cloud Logging 的“容器日志”部分中。
要解决此问题,请从配置中移除多余的搜索路径。
后续步骤
- 阅读 GKE 中的集群 DNS 概览。
- 阅读服务和 Pod 的 DNS,大致了解如何在 Kubernetes 集群中使用 DNS。