Kubernetes DNS 完全指南服务发现核心机制与实践一、Kubernetes DNS 核心概述1. 基本定位内置特性Kubernetes 1.3 版本默认集成 DNS 服务通过集群插件自动部署包含 DNS Pod 和 Service。核心作用为集群内的 Service、Pod 提供域名解析能力替代手动配置 IP 地址实现灵活的服务发现。工作原理kubelet 通过--cluster-dns标志告知容器 DNS 服务 IP容器通过该 IP 解析集群内域名同时通过--cluster-domain配置集群默认域默认cluster.local。2. 核心优势无需修改应用代码兼容传统 DNS 解析逻辑。自动同步 Service/Pod 变更IP 动态变化时无需手动更新配置。支持跨命名空间解析简化多团队协作部署。二、DNS 命名规则与解析模式1. 域名生成规则集群内所有资源的 DNS 域名遵循统一格式核心结构为[资源名称].[命名空间].[资源类型].cluster.local默认搜索列表Pod 的 DNS 配置会自动包含「自身命名空间 集群默认域」简化短域名解析。示例说明命名空间bar中的 Servicefoo在同命名空间可通过foo解析跨命名空间如quux需通过foo.bar解析。2. 支持的 DNS 记录类型1Service 相关记录记录类型适用场景域名格式解析结果A 记录普通 Service带 ClusterIPmy-svc.my-namespace.svc.cluster.localService 的 ClusterIPA 记录无头服务Headless Service无 ClusterIPmy-svc.my-namespace.svc.cluster.local关联的所有 Pod IP 列表轮询负载均衡SRV 记录命名端口的 Service_port-name._port-protocol.my-svc.my-namespace.svc.cluster.local端口号 对应域名普通 Service或多个 Pod 端口 域名无头服务2Pod 相关记录默认 A 记录启用后pod-ip-address.my-namespace.pod.cluster.local如1-2-3-4.default.pod.cluster.local。自定义主机名 / 子域名通过 PodSpec 的hostname和subdomain字段配置生成格式为[hostname].[subdomain].[namespace].svc.cluster.local的域名需配合无头服务使用# 示例Pod 自定义域名配置 apiVersion: v1 kind: Service metadata: name: default-subdomain # 无头服务clusterIP: None spec: selector: name: busybox clusterIP: None ports: - name: foo port: 1234*** apiVersion: v1 kind: Pod metadata: name: busybox1 labels: name: busybox spec: hostname: busybox-1 # 自定义主机名 subdomain: default-subdomain # 关联无头服务 containers: * image: busybox command: [sleep, 3600] name: busybox最终 Pod 域名busybox-1.default-subdomain.default.svc.cluster.local。三、DNS 服务使用与验证1. 快速验证 DNS 可用性步骤 1创建测试 Pod# busybox.yamlapiVersion:v1kind:Podmetadata:name:busyboxnamespace:defaultspec:containers:-image:busyboxcommand:[sleep,3600]name:busyboxrestartPolicy:Always$ kubectl create -f busybox.yaml $ kubectl get pods busybox # 等待 STATUS 为 Running步骤 2执行 DNS 解析测试# 解析集群默认 Servicekubernetes.default $ kubectl exec -ti busybox -- nslookup kubernetes.default # 成功输出示例 Server: 10.0.0.10 # DNS Service IP Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes.default Address 1: 10.0.0.1 # kubernetes Service 的 ClusterIP2. 查看 Pod DNS 配置Pod 的 DNS 配置存储在/etc/resolv.conf中可通过以下命令查看$ kubectl exec busybox -- cat /etc/resolv.conf # 典型输出包含搜索路径和 DNS 服务器 search default.svc.cluster.local svc.cluster.local cluster.local nameserver 10.0.0.10 # 集群 DNS Service IP options ndots:5search解析短域名时的搜索路径按顺序匹配命名空间和集群域。ndots:5当域名中.数量少于 5 时优先使用搜索路径拼接解析。四、DNS 常见问题排查当 DNS 解析失败时按以下步骤逐步排查1. 基础配置检查验证 Pod 的/etc/resolv.conf是否包含正确的nameserver集群 DNS IP和search路径。确认目标 Service/Pod 已创建且命名空间、名称无拼写错误。2. DNS 组件状态检查# 1. 检查 DNS Pod 是否运行kube-system 命名空间 $ kubectl get pods --namespacekube-system -l k8s-appkube-dns # 预期输出3/3 Ready包含 kubedns、dnsmasq、healthz 三个容器 # 2. 检查 DNS Service 是否存在 $ kubectl get svc --namespacekube-system kube-dns # 预期输出CLUSTER-IP 为 10.0.0.10默认PORT(S) 为 53/UDP,53/TCP # 3. 检查 DNS Endpoints 是否正常关联 DNS Pod IP $ kubectl get ep kube-dns --namespacekube-system # 预期输出ENDPOINTS 包含 DNS Pod 的 IP:533. 日志排查查看 DNS Pod 日志定位错误原因如连接 apiserver 失败、配置错误等# 查看 kubedns 容器日志 $ kubectl logs --namespacekube-system $(kubectl get pods --namespacekube-system -l k8s-appkube-dns -o name) -c kubedns # 查看 dnsmasq 容器日志 $ kubectl logs --namespacekube-system $(kubectl get pods --namespacekube-system -l k8s-appkube-dns -o name) -c dnsmasq日志级别说明W警告、E错误、F失败需重点关注。4. 已知问题与规避方案Linux libc 限制最多支持 3 个nameserver和 3 个search记录超出部分会被截断。可通过 Node 部署 dnsmasq 扩展nameserver或使用 kubelet 的--resolv-conf自定义配置文件。Alpine 镜像兼容问题Alpine 3.3 及更早版本 DNS 解析异常需升级镜像或手动安装bind-tools。Pod 继承 Node DNS默认情况下Pod 会继承 Node 的 DNS 配置若需自定义可通过 kubelet 的--resolv-conf标志指定配置文件设为表示不继承。五、高级配置与扩展1. 自定义集群域名通过 kubelet 的--cluster-domain标志修改集群默认域默认cluster.local例如# kubelet 启动参数 --cluster-domainmy-cluster.local修改后Service 域名格式变为my-svc.my-namespace.svc.my-cluster.local。2. 无头服务Headless ServiceDNS 配置无头服务无 ClusterIPDNS 解析直接返回关联 Pod IP适用于客户端需自主实现负载均衡。需通过域名直接访问单个 Pod如状态 ful 应用。3. 跨集群 DNS 解析FederationKubernetes 支持集群联邦Federation通过 DNS 服务实现跨集群 Service 发现需部署联邦插件并配置跨集群 DNS 转发规则具体参考 集群联邦官方文档。六、总结与最佳实践优先使用短域名同命名空间直接使用 Service 名称解析如my-nginx跨命名空间使用服务名.命名空间如my-nginx.prod。避免硬编码 IP所有集群内服务访问均通过 DNS 域名适配 Pod 动态扩缩容和 IP 变更。启用 Pod 域名解析如需通过域名访问特定 Pod配置hostname、subdomain并关联无头服务。定期检查 DNS 状态将 DNS Pod 运行状态、Endpoints 关联情况纳入集群监控避免服务发现中断。