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-bridge、Azure-CNI、Flannel host-gateway 使用 win-bridge | win-bridge 使用 L2bridge 网络模式,将容器连接到主机的底层网络,提供最佳性能。需要用户定义的路由 (UDR) 来实现节点间连接。 |
L2Tunnel | 这是 l2bridge 的一种特殊情况,但仅在 Azure 上使用。所有数据包都发送到应用 SDN 策略的虚拟化主机。 | MAC 被重写,IP 在底层网络上可见 | Azure-CNI | Azure-CNI 允许将容器与 Azure vNET 集成,并允许它们利用 Azure 虚拟网络提供的 一系列功能。例如,安全地连接到 Azure 服务或使用 Azure NSG。有关一些示例,请参阅 azure-cni |
Overlay | 容器获得了一个连接到外部 vSwitch 的 vNIC。每个覆盖网络都有自己的 IP 子网,由自定义 IP 前缀定义。覆盖网络驱动程序使用 VXLAN 封装。 | 使用外部标头封装。 | win-overlay、Flannel VXLAN(使用 win-overlay) | 当需要将虚拟容器网络与主机底层网络隔离时(例如出于安全原因),应使用 win-overlay。如果您的数据中心中的 IP 受限,则允许对不同的覆盖网络(具有不同的 VNID 标记)重复使用 IP。此选项需要在 Windows Server 2019 上安装 KB4489899。 |
Transparent(ovn-kubernetes 的特殊用例) | 需要外部 vSwitch。容器连接到外部 vSwitch,该 vSwitch 通过逻辑网络(逻辑交换机和路由器)实现 Pod 内通信。 | 数据包通过 GENEVE 或 STT 隧道封装,以到达不在同一主机上的 Pod。 数据包通过 ovn 网络控制器提供的隧道元数据信息转发或丢弃。 NAT 用于南北向通信。 | ovn-kubernetes | 通过 ansible 部署。可以通过 Kubernetes 策略应用分布式 ACL。支持 IPAM。无需 kube-proxy 即可实现负载均衡。无需使用 iptables/netsh 即可完成 NAT。 |
NAT(*不在 Kubernetes 中使用*) | 为容器提供连接到内部 vSwitch 的 vNIC。使用名为 WinNAT 的内部组件提供 DNS/DHCP | MAC 和 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 选项
- host-local
- azure-vnet-ipam(仅适用于 azure-cni)
- Windows Server IPAM(如果没有设置 IPAM,则为回退选项)
负载均衡和服务
Kubernetes 服务 是一个抽象概念,它定义了一组逻辑 Pod 以及通过网络访问它们的方法。在包含 Windows 节点的集群中,您可以使用以下类型的服务
NodePort
ClusterIP
LoadBalancer
ExternalName
Windows 容器网络在某些重要方面与 Linux 网络不同。Windows 容器网络的 Microsoft 文档 提供了更多详细信息和背景信息。
在 Windows 上,您可以使用以下设置来配置服务和负载均衡行为
功能 | 描述 | 最低支持的 Windows 操作系统版本 | 如何启用 |
---|---|---|---|
会话粘性 | 确保来自特定客户端的连接每次都传递到同一个 Pod。 | Windows Server 2022 | 将 service.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 2019 | 将 service.spec.externalTrafficPolicy 设置为“Local”,并在 kube-proxy 中启用 DSR |
警告
如果目标节点运行的是 Windows Server 2022,则叠加网络上的 NodePort 服务存在已知问题。要完全避免此问题,可以使用 externalTrafficPolicy: Local
配置服务。
在安装了 KB5005619 或更高版本的 Windows Server 2022 上,l2bridge 网络上的 Pod 到 Pod 连接存在已知问题。要解决此问题并恢复 Pod 到 Pod 连接,可以在 kube-proxy 中禁用 WinDSR 功能。
这些问题需要操作系统修复。请关注 https://github.com/microsoft/Windows-Containers/issues/204 获取更新。
限制
Windows 节点上不支持以下网络功能
- 主机网络模式
- 从节点本身访问本地 NodePort(适用于其他节点或外部客户端)
- 单个服务的后台 Pod(或唯一目标地址)超过 64 个
- 连接到叠加网络的 Windows Pod 之间的 IPv6 通信
- 非 DSR 模式下的本地流量策略
- 使用
win-overlay
、win-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 后端文档。