Windows 上的网络

Kubernetes 支持在 Linux 或 Windows 上运行节点。您可以在单个集群中混合使用两种类型的节点。本页概述了特定于 Windows 操作系统的网络。

Windows 上的容器网络

Windows 容器上的容器网络通过 CNI 插件 公开。在网络方面,Windows 容器的功能类似于虚拟机。每个容器都有一个虚拟网络适配器 (vNIC),它连接到 Hyper-V 虚拟交换机 (vSwitch)。主机网络服务 (HNS) 和主机计算服务 (HCS) 协同工作以创建容器并将容器 vNIC 附加到网络。HCS 负责容器管理,而 HNS 负责网络资源的管理,例如

  • 虚拟网络(包括 vSwitch 的创建)
  • 端点/vNIC
  • 命名空间
  • 策略,包括数据包封装、负载均衡规则、ACL 和 NAT 规则。

Windows HNS 和 vSwitch 实现命名空间,并且可以根据需要为 Pod 或容器创建虚拟 NIC。但是,许多配置(如 DNS、路由和指标)存储在 Windows 注册表数据库中,而不是作为 /etc 中的文件,而 Linux 使用这种方式存储这些配置。容器的 Windows 注册表与主机的注册表是分开的,因此像将主机上的 /etc/resolv.conf 映射到容器中的概念在 Linux 上不会产生相同的效果。这些必须使用在该容器上下文中运行的 Windows API 来配置。因此,CNI 实现需要调用 HNS,而不是依赖文件映射将网络详细信息传递到 Pod 或容器中。

网络模式

Windows 支持五种不同的网络驱动程序/模式:L2bridge、L2tunnel、Overlay(Beta)、Transparent 和 NAT。在包含 Windows 和 Linux 工作节点的异构集群中,您需要选择在 Windows 和 Linux 上都兼容的网络解决方案。下表列出了 Windows 上支持的树外插件,以及有关何时使用每个 CNI 的建议

网络驱动程序描述容器数据包修改网络插件网络插件特征
L2bridge容器附加到外部 vSwitch。容器附加到底层网络,尽管物理网络不需要了解容器 MAC,因为它们在 ingress/egress 上会被重写。MAC 重写为主机 MAC,IP 可能使用 HNS OutboundNAT 策略重写为主机 IP。win-bridgeAzure-CNIFlannel host-gateway 使用 win-bridgewin-bridge 使用 L2bridge 网络模式,将容器连接到主机的底层,提供最佳性能。需要用户定义的路由 (UDR) 用于节点间连接。
L2Tunnel这是 l2bridge 的特例,但仅在 Azure 上使用。所有数据包都发送到虚拟化主机,在那里应用 SDN 策略。MAC 重写,IP 在底层网络上可见Azure-CNIAzure-CNI 允许容器与 Azure vNET 集成,并允许它们利用 Azure 虚拟网络提供的功能集。例如,安全地连接到 Azure 服务或使用 Azure NSG。请参阅 azure-cni 以了解一些示例
Overlay容器被赋予一个连接到外部 vSwitch 的 vNIC。每个覆盖网络都有自己的 IP 子网,由自定义 IP 前缀定义。覆盖网络驱动程序使用 VXLAN 封装。使用外部报头进行封装。win-overlayFlannel VXLAN(使用 win-overlay)当希望虚拟容器网络与主机的底层隔离时(例如出于安全原因),应使用 win-overlay。允许在不同的覆盖网络(具有不同的 VNID 标记)中重复使用 IP(如果您在数据中心中对 IP 受到限制)。此选项需要 Windows Server 2019 上的 KB4489899
Transparent(ovn-kubernetes 的特殊用例)需要外部 vSwitch。容器附加到外部 vSwitch,该 vSwitch 使得通过逻辑网络(逻辑交换机和路由器)进行 Pod 内通信成为可能。数据包通过 GENEVESTT 隧道封装以到达不在同一主机的 Pod。
数据包通过 ovn 网络控制器提供的隧道元数据信息进行转发或丢弃。
NAT 用于南北通信。
ovn-kubernetes通过 ansible 部署。分布式 ACL 可以通过 Kubernetes 策略应用。IPAM 支持。负载均衡可以在没有 kube-proxy 的情况下实现。NATing 是通过不使用 iptables/netsh 来完成的。
NAT(*Kubernetes 中未使用*)容器被赋予一个连接到内部 vSwitch 的 vNIC。DNS/DHCP 是使用称为 WinNAT 的内部组件提供的MAC 和 IP 重写为主机 MAC/IP。nat出于完整性考虑,在此包含

如上所述,Flannel CNI 插件 也通过 支持 Windows,方法是使用 VXLAN 网络后端(**Beta 支持**;委托给 win-overlay)和 host-gateway 网络后端(稳定支持;委托给 win-bridge)。

此插件支持委托给一个参考 CNI 插件(win-overlay、win-bridge),以与 Windows 上的 Flannel 守护程序 (Flanneld) 协同工作,以自动分配节点子网租用并创建 HNS 网络。此插件读取其自己的配置文件 (cni.conf),并将它与 FlannelD 生成的 subnet.env 文件中的环境变量聚合。然后,它委托给一个参考 CNI 插件以进行网络管道,并将包含分配给节点的子网的正确配置发送到 IPAM 插件(例如:host-local)。

对于节点、Pod 和服务对象,以下网络流支持 TCP/UDP 流量

  • Pod → Pod(IP)
  • Pod → Pod(名称)
  • Pod → 服务(集群 IP)
  • Pod → 服务(PQDN,但仅当没有“.”时)
  • Pod → 服务(FQDN)
  • Pod → 外部(IP)
  • Pod → 外部(DNS)
  • 节点 → Pod
  • Pod → 节点

IP 地址管理 (IPAM)

以下 IPAM 选项在 Windows 上受支持

负载均衡和服务

Kubernetes 服务 是一个抽象,它定义了一组逻辑 Pod 以及通过网络访问它们的方法。在包含 Windows 节点的集群中,您可以使用以下类型的服务

  • NodePort
  • ClusterIP
  • LoadBalancer
  • ExternalName

Windows 容器网络在某些重要方面与 Linux 网络有所不同。Microsoft 关于 Windows 容器网络的文档 提供了更多详细信息和背景信息。

在 Windows 上,您可以使用以下设置来配置服务和负载均衡行为

Windows 服务设置
功能描述最低支持的 Windows 操作系统版本如何启用
会话亲和性确保每次来自特定客户端的连接都传递到同一个 Pod。Windows Server 2022service.spec.sessionAffinity 设置为“ClientIP”
直接服务器返回 (DSR)负载均衡模式,其中 IP 地址修复和 LBNAT 直接在容器 vSwitch 端口处发生;服务流量到达时,源 IP 设置为源 Pod IP。Windows Server 2019在 kube-proxy 中设置以下标志:--feature-gates="WinDSR=true" --enable-dsr=true
保留目标跳过服务流量的 DNAT,从而保留到达后端 Pod 的数据包中的目标服务的虚拟 IP。此外,还禁用节点间转发。Windows Server,版本 1903在服务注释中设置 "preserve-destination": "true",并在 kube-proxy 中启用 DSR。
IPv4/IPv6 双栈网络与集群内、来自集群和到集群的 IPv6 到 IPv6 通信并行使用本机 IPv4 到 IPv4 通信Windows Server 2019请参阅 IPv4/IPv6 双栈
客户端 IP 保留确保传入的入站流量的源 IP 被保留。此外,还禁用节点间转发。Windows Server 2019service.spec.externalTrafficPolicy 设置为“Local”,并在 kube-proxy 中启用 DSR

限制

以下网络功能*不受*Windows 节点支持

  • 主机网络模式
  • 来自节点本身的本地 NodePort 访问(适用于其他节点或外部客户端)
  • 单个服务超过 64 个后端 Pod(或唯一目标地址)
  • 连接到覆盖网络的 Windows Pod 之间的 IPv6 通信
  • 非 DSR 模式下的本地流量策略
  • 使用 ICMP 协议通过 `win-overlay`、`win-bridge` 或 Azure-CNI 插件进行出站通信。
    具体来说,Windows 数据平面 (VFP) 不支持 ICMP 数据包置换,这意味着
    • 定向到同一网络内目标的 ICMP 数据包(例如通过 ping 进行的 Pod 到 Pod 通信)按预期工作;
    • TCP/UDP 数据包按预期工作;
    • 定向到通过远程网络的 ICMP 数据包(例如通过 ping 进行的 Pod 到外部互联网通信)无法置换,因此不会路由回其源;
    • 由于 TCP/UDP 数据包仍然可以置换,因此在调试与外部世界的连接时,可以使用 `curl <destination>` 代替 `ping <destination>`。

其他限制

  • Windows 参考网络插件 win-bridge 和 win-overlay 未实现 CNI 规范 v0.4.0,因为缺少 `CHECK` 实现。
  • Flannel VXLAN CNI 插件在 Windows 上存在以下限制
    • 节点-Pod 连接仅在 Flannel v0.12.0(或更高版本)中对本地 Pod 可用。
    • Flannel 仅限于使用 VNI 4096 和 UDP 端口 4789。有关这些参数的更多详细信息,请参见官方 Flannel VXLAN 后端文档。
上次修改时间:2024 年 5 月 29 日 下午 4:41 PST:更新了“Windows 上的网络”文档中的链接并添加了链接 (d501dbe174)