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 注册表数据库中,而不是像 Linux 那样存储在 /etc 内的文件中。容器的 Windows 注册表与主机的注册表是分开的,因此像将 /etc/resolv.conf 从主机映射到容器这样的概念不会像在 Linux 上那样有效。必须使用在该容器的上下文中运行的 Windows API 来配置这些配置。因此,CNI 实现需要调用 HNS,而不是依赖文件映射将网络详细信息传递到 Pod 或容器中。

网络模式

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

网络驱动程序描述容器数据包修改网络插件网络插件特性
L2bridge容器连接到外部 vSwitch。容器连接到底层网络,但物理网络不需要学习容器 MAC,因为它们在入口/出口处被重写。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。如果您的数据中心中的 IP 受限,则允许对不同的覆盖网络(具有不同的 VNID 标记)重复使用 IP。此选项需要在 Windows Server 2019 上安装 KB4489899
Transparent(ovn-kubernetes 的特殊用例)需要外部 vSwitch。容器连接到外部 vSwitch,该 vSwitch 通过逻辑网络(逻辑交换机和路由器)实现 Pod 内通信。数据包通过 GENEVESTT 隧道封装,以到达不在同一主机上的 Pod。
数据包通过 ovn 网络控制器提供的隧道元数据信息转发或丢弃。
NAT 用于南北向通信。
ovn-kubernetes通过 ansible 部署。可以通过 Kubernetes 策略应用分布式 ACL。支持 IPAM。无需 kube-proxy 即可实现负载均衡。无需使用 iptables/netsh 即可完成 NAT。
NAT(*不在 Kubernetes 中使用*)为容器提供连接到内部 vSwitch 的 vNIC。使用名为 WinNAT 的内部组件提供 DNS/DHCPMAC 和 IP 被重写为主机 MAC/IP。nat此处包含是为了完整性

如上所述,Flannel CNI 插件 也通过 支持 在 Windows 上使用 VXLAN 网络后端(**测试版支持**;委托给 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)

Windows 上支持以下 IPAM 选项

负载均衡和服务

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

  • NodePort
  • ClusterIP
  • LoadBalancer
  • ExternalName

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

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

Windows 服务设置
功能描述最低支持的 Windows 操作系统版本如何启用
会话粘性确保来自特定客户端的连接每次都传递到同一个 Pod。Windows Server 2022service.spec.sessionAffinity 设置为“ClientIP”
直接服务器返回 (DSR)负载均衡模式,其中 IP 地址修复和 LBNAT 直接在容器 vSwitch 端口上进行;服务流量到达时,源 IP 设置为 originating 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 双栈网络原生 IPv4 到 IPv4 与 IPv6 到 IPv6 通信并行进行,进出集群以及在集群内部进行通信Windows Server 2019请参阅 IPv4/IPv6 双栈
客户端 IP 保留确保保留传入流量的源 IP。同时禁用节点到节点转发。Windows Server 2019service.spec.externalTrafficPolicy 设置为“Local”,并在 kube-proxy 中启用 DSR

限制

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

  • 主机网络模式
  • 从节点本身访问本地 NodePort(适用于其他节点或外部客户端)
  • 单个服务的后台 Pod(或唯一目标地址)超过 64 个
  • 连接到叠加网络的 Windows Pod 之间的 IPv6 通信
  • 非 DSR 模式下的本地流量策略
  • 使用 win-overlaywin-bridge 或 Azure-CNI 插件通过 ICMP 协议进行出站通信。
    具体来说,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 上有以下限制
    • 只有使用 Flannel v0.12.0(或更高版本)的本地 Pod 才有可能实现节点到 Pod 的连接。
    • Flannel 只能使用 VNI 4096 和 UDP 端口 4789。有关这些参数的更多详细信息,请参阅官方 Flannel VXLAN 后端文档。
上次修改时间:2024 年 5 月 29 日下午 4:41 PST:更新了“Windows 上的网络”文档并添加了链接 (d501dbe174)