在 Kubespray 项目中,nodelocaldns_ip: 169.254.25.10 这个配置值的设定是经过特定设计的,虽然 169.254.0.0/16 是链路本地地址范围(即 IPv4 Link-Local 地址,通常用于 DHCP 失败时的自动分配),但这里的选择是有明确目的的。以下是详细解释:


1. 为什么选择 169.254.0.0/16 这个范围?

  • 链路本地地址的特性:

    • 该范围的地址(169.254.0.0/16)不会通过路由器转发,仅在本地链路有效,因此不会与集群内其他网络冲突。

    • 即使节点没有分配到正常 IP(如 DHCP 失败),该地址仍可在本地生效,确保 DNS 查询的可靠性。

  • 避免冲突:

    • Kubernetes 集群通常不会使用 169.254.0.0/16 作为 Pod 或 Service 的网段,因此选择该范围可以避免与业务流量冲突。


2. 为什么是 169.254.25.10 这个具体值?

  • 可预测性和唯一性:

    • 25.10 是一个人为选择的子段(非随机),目的是让该地址在集群内所有节点保持一致,便于统一配置。

    • 该地址需要避开 169.254.0.0/16 中其他可能被系统占用的地址(如某些操作系统会随机分配链路本地地址)。

  • NodeLocal DNSCache 的工作机制:

    • NodeLocal DNSCache 是一个 DaemonSet,在每个节点上以本地缓存的形式运行,监听一个特定 IP。

    • 当 Pod 的 DNS 配置指向 169.254.25.10 时,请求会被本地的 NodeLocal DNSCache 实例处理,减少跨节点 DNS 查询的延迟和负载。


3. 与 DHCP 自动分配地址的区别

  • DHCP 分配的 169.254.x.x 是临时性的(当设备无法获取 IP 时自动分配),而 Kubespray 中的 169.254.25.10 是静态配置的:

    • 它不会依赖 DHCP 分配,而是由 Kubespray 显式指定。

    • 所有节点的 NodeLocal DNSCache 均绑定到相同的 IP,确保集群内 DNS 配置的一致性。


4. 实际应用中的验证

  • 你可以通过以下命令检查 NodeLocal DNSCache 是否正常工作:

    kubectl get pods -n kube-system -l k8s-app=k8s-app=node-local-dns
  • 在集群中的任意 Pod 内执行 nslookup 测试:

    nslookup kubernetes 169.254.25.10

    如果返回结果,则说明 DNS 请求被本地缓存正确处理。


5. 潜在问题与注意事项

  • 冲突风险:

    • 如果节点上已有其他服务占用了 169.254.25.10,可能会导致端口冲突。但这种情况极少见,因为链路本地地址通常不会被主动使用。

  • 自定义修改:

    • 如果需要修改该 IP,可以在 Kubespray 的 group_vars 中覆盖 nodelocaldns_ip 变量,但必须确保集群内所有节点同步更新。


总结

Kubespray 选择 169.254.25.10 作为 NodeLocal DNSCache 的固定 IP,是利用了链路本地地址的隔离性和避免冲突的特性,同时通过静态配置确保集群范围内的一致性。这是一种经过验证的最佳实践,而非依赖 DHCP 的自动分配机制。

更多推荐