本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.23:双栈 IPv4/IPv6 网络达到 GA
"Kubernetes 何时支持 IPv6?" 自 Kubernetes v1.9 首次添加 IPv6 的 alpha 支持以来,这个问题被问到的频率越来越高。虽然 Kubernetes 自 v1.18 以来就支持纯 IPv6 集群,但那时还无法从 IPv4 迁移到 IPv6。最终,IPv4/IPv6 双栈网络在 Kubernetes v1.23 中达到了通用可用性 (GA)。
双栈网络对您意味着什么?让我们来看一下……
服务 API 更新
服务在 1.20 之前是单栈的,因此要使用两种 IP 家族,需要为每种 IP 家族创建一个服务。在 1.20 中,服务经过重新实现,允许同时使用两种 IP 家族,从而简化了用户体验,这意味着单个服务可以处理 IPv4 和 IPv6 工作负载。双栈负载均衡可以在运行任意 IPv4 和 IPv6 组合的服务之间进行。
服务 API 现在包含支持双栈的新字段,取代了原来的单个 ipFamily 字段。
- 您可以通过将
ipFamilyPolicy
设置为以下三个选项之一来选择 IP 家族:SingleStack、PreferDualStack 或 RequireDualStack。服务可以在单栈和双栈之间切换(在一定限制内)。 - 将
ipFamilies
设置为已分配的家族列表,可以设置所用家族的顺序。 clusterIPs
包含之前的clusterIP
但允许多个条目,因此不再需要为两种 IP 家族中的每一种运行重复的服务。相反,您可以在两种 IP 家族中分配集群 IP 地址。
请注意,Pod 也是双栈的。对于给定的 Pod,无法在同一家族中设置多个 IP 地址。
默认行为仍为单栈
从 1.20 版本开始,随着双栈服务作为 alpha 功能的重新实现,Kubernetes 的底层网络已经包含了双栈功能,无论集群是否配置了启用双栈功能的特性标志。
Kubernetes 1.23 移除了该特性标志,作为该功能升级到稳定版的一部分。如果您想配置双栈网络,它始终可用。您可以将集群网络配置为单栈 IPv4、单栈 IPv6 或 IPv4/IPv6 双栈。
虽然服务是根据您的配置设置的,但 Pod 默认使用 CNI 插件设置的任何内容。如果您的 CNI 插件分配了单栈 IP,除非 `ipFamilyPolicy` 指定 PreferDualStack 或 RequireDualStack,否则您将是单栈的。如果您的 CNI 插件分配了双栈 IP,`pod.status.PodIPs` 默认为双栈。
尽管双栈是可行的,但并非强制使用。文档中的示例展示了双栈服务配置中可能存在的各种情况。
立即尝试双栈
虽然上游 Kubernetes 现在支持 双栈网络 作为 GA 或稳定功能,但每个供应商对双栈 Kubernetes 的支持可能有所不同。节点需要配置可路由的 IPv4/IPv6 网络接口。Pod 需要是双栈的。网络插件负责为 Pod 分配 IP 地址,因此集群使用的网络插件需要支持双栈。一些容器网络接口 (CNI) 插件支持双栈,kubenet 也是如此。
双栈的生态系统支持正在增加;您可以使用 kubeadm 创建双栈集群,使用 KIND 在本地尝试双栈集群,并在云提供商中部署双栈集群(检查 CNI 或 kubenet 可用性的文档后)。
参与 SIG Network
SIG-Network 希望从社区的双栈网络经验中学习,以了解不断变化的需求和您的用例。来自 KubeCon NA 2021 的 SIG-Network 更新视频 总结了 SIG 的最新更新,包括双栈在 1.23 版本中稳定发布。
当前的 SIG-Network KEPs 和 GitHub 上的 问题 说明了 SIG 的重点领域。 双栈 API 服务器 是一个可以考虑贡献的领域。
SIG-Network 会议 是一个友好、温馨的场所,供您与社区建立联系并分享您的想法。期待您的加入!
致谢
双栈网络功能代表了众多 Kubernetes 贡献者的工作。感谢所有贡献代码、经验报告、文档、代码审查以及介于两者之间的所有内容的人。Bridget Kromhout 在Kubernetes 中的双栈网络中详细介绍了这项社区工作。Tim Hockin 和 Khaled (Kal) Henidak 在 2019 年 (IPv4/IPv6 双栈 Kubernetes 的漫漫长路) 以及 Lachlan Evenson 在 2021 年 (我们来了:Kubernetes 中的双栈网络) 的 KubeCon 主题演讲中讲述了双栈之旅,历时五年,代码量巨大。