Kubernetes中的服务和Pod DNS解析机制详解
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在Kubernetes集群中,DNS服务是服务发现的核心组件之一。Kubernetes会自动为集群中的Service和Pod创建DNS记录,使得工作负载可以通过稳定的DNS名称而非易变的IP地址来访问服务。本文将深入解析Kubernetes中的DNS工作机制,帮助您理解如何利用DNS来发现和访问集群中的服务。
核心机制
Kubernetes通过kubelet为每个Pod配置DNS解析,使得运行在容器中的应用程序可以通过服务名称而非IP地址来访问其他服务。这一机制主要包含以下几个关键点:
- DNS记录自动创建:Kubernetes会为Service和Pod自动创建DNS记录
- 搜索域配置:每个Pod的DNS搜索列表默认包含Pod所在命名空间和集群的默认域
- 命名空间感知:DNS查询结果会根据发起查询的Pod所在命名空间而变化
命名空间与DNS解析
Kubernetes的DNS解析具有命名空间感知能力,这意味着:
- 不指定命名空间的DNS查询会被限制在Pod所在命名空间内
- 要访问其他命名空间的服务,需要在DNS查询中明确指定命名空间
示例场景: 假设有一个位于test
命名空间的Pod,要访问位于prod
命名空间的data
服务:
- 查询
data
:无结果(使用Pod的test
命名空间) - 查询
data.prod
:成功解析(明确指定了命名空间)
DNS记录类型详解
Service的DNS记录
A/AAAA记录
-
常规Service:
- 格式:
<service-name>.<namespace>.svc.<cluster-domain>
- 解析到Service的Cluster IP
- 格式:
-
Headless Service:
- 格式相同
- 解析到该Service选择的所有Pod的IP集合
SRV记录
为Service中的命名端口创建SRV记录:
- 格式:
_<port-name>._<port-protocol>.<service-name>.<namespace>.svc.<cluster-domain>
- 常规Service:解析到端口号和域名
- Headless Service:为每个后端Pod生成记录,包含端口号和Pod域名
Pod的DNS记录
A/AAAA记录
Pod的DNS名称格式通常为: <pod-ip>.<namespace>.pod.<cluster-domain>
例如IP为172.17.0.3的Pod在default命名空间中的DNS名称为: 172-17-0-3.default.pod.cluster.local
主机名和子域
Pod可以通过以下字段自定义DNS名称:
-
hostname字段:
- 覆盖默认的Pod名称作为主机名
- 例如设置为
my-host
,则Pod主机名为my-host
-
subdomain字段:
- 表示Pod属于命名空间的子组
- 与同名Headless Service配合使用时,会生成完整FQDN
示例配置:
apiVersion: v1
kind: Pod
metadata:
name: busybox1
spec:
hostname: busybox-1
subdomain: busybox-subdomain
...
当存在同名Headless Service时,Pod的FQDN为: busybox-1.busybox-subdomain.my-namespace.svc.cluster-domain.example
setHostnameAsFQDN字段
从Kubernetes 1.22开始稳定支持:
- 默认情况下,Pod的
hostname
命令返回短主机名 - 设置
setHostnameAsFQDN: true
后,hostname
和hostname --fqdn
都返回完整FQDN
注意:Linux内核限制主机名不超过64字符,过长的FQDN会导致Pod启动失败。
DNS策略配置
Kubernetes支持以下Pod级别的DNS策略(通过dnsPolicy
字段配置):
- Default:继承节点DNS配置
- ClusterFirst(默认):
- 不匹配集群域的查询转发到上游DNS
- 支持自定义存根域和上游DNS服务器
- ClusterFirstWithHostNet:
- 用于
hostNetwork: true
的Pod - Windows不支持此策略
- 用于
- None:
- 忽略Kubernetes DNS设置
- 必须通过
dnsConfig
字段提供自定义配置
自定义DNS配置
通过dnsConfig
字段可以精细控制Pod的DNS设置:
- nameservers:自定义DNS服务器列表(最多3个)
- searches:DNS搜索域列表(最多32个,总长度不超过2048)
- options:DNS解析选项
示例配置:
dnsConfig:
nameservers:
- 192.0.2.1
searches:
- ns1.svc.cluster-domain.example
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
Windows节点的特殊考虑
在Windows节点上:
- 不支持
ClusterFirstWithHostNet
策略 - 推荐使用
Resolve-DNSName
PowerShell命令进行名称解析 - 每个Pod只能有一个DNS后缀(对应其命名空间)
- 不支持部分限定名称解析
最佳实践
- 为跨命名空间访问的服务使用完整限定名称
- 对于
hostNetwork: true
的Pod,明确设置ClusterFirstWithHostNet
策略 - 避免使用过长的FQDN(不超过64字符)
- 在Windows环境中使用完整限定名称进行服务访问
通过深入理解Kubernetes的DNS机制,您可以更有效地设计和调试集群中的服务发现方案,确保应用程序间的可靠通信。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考