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-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。每個 Overlay 網路都有自己的 IP 子網路,由自訂 IP 首碼定義。Overlay 網路驅動程式使用 VXLAN 封裝。 | 使用外部標頭封裝。 | win-overlay、Flannel VXLAN (使用 win-overlay) | 當希望虛擬容器網路與主機底層隔離時 (例如,基於安全原因),應使用 win-overlay。如果您在資料中心中的 IP 受到限制,則允許針對不同的 Overlay 網路 (具有不同的 VNID 標籤) 重新使用 IP。此選項需要在 Windows Server 2019 上安裝 KB4489899。 |
Transparent (用於 ovn-kubernetes 的特殊使用案例) | 需要外部 vSwitch。容器連接到外部 vSwitch,這透過邏輯網路 (邏輯交換器和路由器) 啟用 Pod 內通訊。 | 封包透過 GENEVE 或 STT 通道傳輸封裝,以到達不在同一主機上的 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 選項
- host-local
- azure-vnet-ipam (僅適用於 azure-cni)
- Windows Server IPAM (若未設定 IPAM 時的備用選項)
負載平衡與服務
Kubernetes 服務 (Service) 是一種抽象概念,定義一組邏輯 Pod 以及透過網路存取這些 Pod 的方法。在包含 Windows 節點的叢集中,您可以使用以下類型的服務
NodePort
ClusterIP
LoadBalancer
ExternalName
Windows 容器網路在某些重要方面與 Linux 網路不同。Microsoft Windows 容器網路文件提供了更多詳細資訊和背景知識。
在 Windows 上,您可以使用以下設定來配置服務和負載平衡行為
功能 | 描述 | 最低支援 Windows OS 組建版本 | 如何啟用 |
---|---|---|---|
工作階段親和性 | 確保來自特定用戶端的連線每次都傳遞到相同的 Pod。 | Windows Server 2022 | 將 service.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 2019 | 將 service.spec.externalTrafficPolicy 設定為 "Local",並在 kube-proxy 中啟用 DSR |
警告
在覆蓋網路上的 NodePort 服務存在已知問題,如果目標節點正在執行 Windows Server 2022。為了完全避免此問題,您可以將服務配置為 externalTrafficPolicy: Local
。
在安裝 KB5005619 或更高版本的 Windows Server 2022 上的 l2bridge 網路中,Pod 到 Pod 的連線存在已知問題。為了解決此問題並恢復 Pod 到 Pod 的連線,您可以在 kube-proxy 中停用 WinDSR 功能。
這些問題需要 OS 修正程式。請關注 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 由於缺少
CHECK
實作,因此未實作 CNI spec v0.4.0。 - Flannel VXLAN CNI 外掛程式在 Windows 上有以下限制
- 僅適用於本機 Pod 的節點到 Pod 連線才有可能使用 Flannel v0.12.0 (或更高版本)。
- Flannel 僅限於使用 VNI 4096 和 UDP 連接埠 4789。有關這些參數的更多詳細資訊,請參閱官方 Flannel VXLAN 後端文件。