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 (Beta)、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。每個 Overlay 網路都有自己的 IP 子網路,由自訂 IP 首碼定義。Overlay 網路驅動程式使用 VXLAN 封裝。使用外部標頭封裝。win-overlayFlannel VXLAN (使用 win-overlay)當希望虛擬容器網路與主機底層隔離時 (例如,基於安全原因),應使用 win-overlay。如果您在資料中心中的 IP 受到限制,則允許針對不同的 Overlay 網路 (具有不同的 VNID 標籤) 重新使用 IP。此選項需要在 Windows Server 2019 上安裝 KB4489899
Transparent (用於 ovn-kubernetes 的特殊使用案例)需要外部 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) 和 主機閘道網路後端 (穩定支援;委派給 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 服務 (Service) 是一種抽象概念,定義一組邏輯 Pod 以及透過網路存取這些 Pod 的方法。在包含 Windows 節點的叢集中,您可以使用以下類型的服務

  • NodePort
  • ClusterIP
  • LoadBalancer
  • ExternalName

Windows 容器網路在某些重要方面與 Linux 網路不同。Microsoft Windows 容器網路文件提供了更多詳細資訊和背景知識。

在 Windows 上,您可以使用以下設定來配置服務和負載平衡行為

Windows 服務設定
功能描述最低支援 Windows OS 組建版本如何啟用
工作階段親和性確保來自特定用戶端的連線每次都傳遞到相同的 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,從而將目標服務的虛擬 IP 保留在到達後端 Pod 的封包中。同時停用節點到節點的轉發。Windows Server, version 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 由於缺少 CHECK 實作,因此未實作 CNI spec v0.4.0。
  • Flannel VXLAN CNI 外掛程式在 Windows 上有以下限制
    • 僅適用於本機 Pod 的節點到 Pod 連線才有可能使用 Flannel v0.12.0 (或更高版本)。
    • Flannel 僅限於使用 VNI 4096 和 UDP 連接埠 4789。有關這些參數的更多詳細資訊,請參閱官方 Flannel VXLAN 後端文件。
上次修改時間:2024 年 5 月 29 日下午 4:41 PST: Updated and added links in 'Networking on Windows' doc (d501dbe174)