Kubernetes 中的 Service 与 Pod DNS 解析机制详解

Kubernetes 中的 Service 与 Pod DNS 解析机制详解

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

在 Kubernetes 集群中,DNS 服务发现是核心功能之一。本文将深入解析 Kubernetes 如何为 Service 和 Pod 提供 DNS 解析能力,帮助开发者更好地理解和使用这一功能。

核心概念

Kubernetes 为集群内的 Service 和 Pod 自动创建 DNS 记录,使得应用可以通过稳定的域名而非易变的 IP 地址进行服务间通信。这一机制由 kubelet 负责实现,它会为每个 Pod 配置 DNS 解析规则。

命名空间对 DNS 查询的影响

DNS 查询结果会因发起查询的 Pod 所在命名空间不同而有所差异:

  1. 同命名空间查询:当 Pod 查询 servicename 时,默认只会在当前命名空间中查找
  2. 跨命名空间查询:需要显式指定命名空间,格式为 servicename.namespace

例如:

  • data 查询(无命名空间)→ 仅在当前命名空间查找
  • data.prod 查询 → 明确查找 prod 命名空间中的 data 服务

DNS 记录类型解析

Service DNS 记录
  1. 普通 Service

    • A/AAAA 记录格式:my-svc.my-namespace.svc.cluster-domain.example
    • 解析结果为 Service 的 Cluster IP
  2. Headless Service

    • 相同格式的 A/AAAA 记录
    • 解析结果为该 Service 选择的所有 Pod IP 集合
    • 客户端需自行处理负载均衡
  3. SRV 记录

    • 格式:_port-name._port-protocol.my-svc.my-namespace.svc.cluster-domain.example
    • 普通 Service:解析为端口号和域名
    • Headless Service:为每个后端 Pod 生成独立记录
Pod DNS 记录
  1. 默认记录

    • 格式:pod-ip-address.namespace.pod.cluster-domain.example
    • 例如:172-17-0-3.default.pod.cluster.local
  2. 自定义主机名

    • 通过 spec.hostname 字段设置
    • 优先级高于 Pod 名称
  3. 子域配置

    • 通过 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 启动失败

最佳实践建议

  1. 服务发现优先使用 Service 名称而非 Pod IP
  2. 跨命名空间访问使用完整域名格式
  3. hostNetwork Pod 务必设置 ClusterFirstWithHostNet 策略
  4. 需要自定义 DNS 时采用 dnsPolicy: None 配合 dnsConfig
  5. 注意 FQDN 长度限制,必要时通过准入控制进行校验

通过深入理解这些 DNS 机制,开发者可以构建更可靠、更易维护的 Kubernetes 应用架构。

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纪嫣梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值