Kubernetes 中的 Service 与 Pod DNS 解析机制详解
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
在 Kubernetes 集群中,DNS 服务发现是核心功能之一。本文将深入解析 Kubernetes 如何为 Service 和 Pod 提供 DNS 解析能力,帮助开发者更好地理解和使用这一功能。
核心概念
Kubernetes 为集群内的 Service 和 Pod 自动创建 DNS 记录,使得应用可以通过稳定的域名而非易变的 IP 地址进行服务间通信。这一机制由 kubelet 负责实现,它会为每个 Pod 配置 DNS 解析规则。
命名空间对 DNS 查询的影响
DNS 查询结果会因发起查询的 Pod 所在命名空间不同而有所差异:
- 同命名空间查询:当 Pod 查询
servicename
时,默认只会在当前命名空间中查找 - 跨命名空间查询:需要显式指定命名空间,格式为
servicename.namespace
例如:
data
查询(无命名空间)→ 仅在当前命名空间查找data.prod
查询 → 明确查找 prod 命名空间中的 data 服务
DNS 记录类型解析
Service DNS 记录
-
普通 Service:
- A/AAAA 记录格式:
my-svc.my-namespace.svc.cluster-domain.example
- 解析结果为 Service 的 Cluster IP
- A/AAAA 记录格式:
-
Headless Service:
- 相同格式的 A/AAAA 记录
- 解析结果为该 Service 选择的所有 Pod IP 集合
- 客户端需自行处理负载均衡
-
SRV 记录:
- 格式:
_port-name._port-protocol.my-svc.my-namespace.svc.cluster-domain.example
- 普通 Service:解析为端口号和域名
- Headless Service:为每个后端 Pod 生成独立记录
- 格式:
Pod DNS 记录
-
默认记录:
- 格式:
pod-ip-address.namespace.pod.cluster-domain.example
- 例如:
172-17-0-3.default.pod.cluster.local
- 格式:
-
自定义主机名:
- 通过
spec.hostname
字段设置 - 优先级高于 Pod 名称
- 通过
-
子域配置:
- 通过
spec.subdomain
字段设置 - 完整 FQDN:
hostname.subdomain.namespace.svc.cluster-domain.example
- 需要同名 Headless Service 支持
- 通过
DNS 策略详解
Kubernetes 提供多种 DNS 策略,通过 dnsPolicy
字段配置:
| 策略名称 | 描述 | |---------------------------|----------------------------------------------------------------------| | ClusterFirst | (默认) 集群域名后缀的查询发往集群 DNS,其他转发到上游 | | ClusterFirstWithHostNet | hostNetwork Pod 专用,确保使用集群 DNS | | Default | 从节点继承 DNS 配置 | | None | 完全自定义 DNS 配置,需配合 dnsConfig
使用 |
高级配置
dnsConfig 定制
当 dnsPolicy
设为 "None" 时,可通过 dnsConfig
精细控制:
dnsConfig:
nameservers:
- 1.2.3.4
searches:
- ns1.svc.cluster-domain.example
- my.dns.search.suffix
options:
- name: ndots
value: "2"
配置项说明:
nameservers
:DNS 服务器列表(最多 3 个)searches
:DNS 搜索域列表options
:解析器选项,如 ndots、timeout 等
FQDN 设置注意事项
从 Kubernetes 1.22 开始稳定的 setHostnameAsFQDN
特性:
- 启用后,Pod 的主机名将设为完整 FQDN
- Linux 内核限制:主机名不得超过 64 字符
- 超长 FQDN 会导致 Pod 启动失败
最佳实践建议
- 服务发现优先使用 Service 名称而非 Pod IP
- 跨命名空间访问使用完整域名格式
- hostNetwork Pod 务必设置
ClusterFirstWithHostNet
策略 - 需要自定义 DNS 时采用
dnsPolicy: None
配合dnsConfig
- 注意 FQDN 长度限制,必要时通过准入控制进行校验
通过深入理解这些 DNS 机制,开发者可以构建更可靠、更易维护的 Kubernetes 应用架构。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考