適用於:Windows Server 2025、Windows Server 2022
Windows 容器的主機網路服務 (HNS) 現在支援針對每個網路使用多個子網。 先前,HNS 限制 Kubernetes 容器端點組態只能使用基礎子網的前置長度。 HNS 已增強,因此您可以使用更嚴格的子網,例如具有更長前綴長度的子網,以及 Windows 工作節點可以使用多個子網。 第一個可讓此功能使用的容器網路介面 (CNI) 是適用於 Windows 的 Calico。 Calico 網路原則是 Tigera所建立的開放原始碼網路和網路安全性解決方案。
您可以在 HNS 中使用多個子網,這僅適用於 l2bridge、l2tunnel以及 overlay 網路驅動程式。 這些網路驅動程式可以公開多個子網,然後允許每個端點系結至其中一個子網。
HNS 和主機計算服務 (HCS) 會一起運作,以建立容器,並將端點連結至網路。 您可以使用 HNS Powershell 協助程式模組來與 HNS 互動。
Calico 需求
Calico CNI 的多個子網支援需要將子網細分為較小的IP區塊。 所有IP區塊都必須共用相同的閘道,但每個IP區塊可以有自己的個別廣播網域。 為了最大化 IPV4 的配置效率,Calico 除了在容器端點上設定極小的前置詞(小到 /32)之外,還需要建立極小的 IP 區塊(如一個區塊 = 四個 IP 位址)。
Calico IP 位址管理 (IPAM) 的完整實作運作方式如下:
Calico 的IPAM函式是設計來依需求將IP位址配置給工作負載。 Calico 也支援多個 IP 集區,用於管理分組。 設定特定工作負載的配置時,允許的集區集可能會受到配置限制,以支援各種使用案例。 針對不同的使用案例,請遵循下列指導方針:
- 使用多個分離的資源池來增加容量。
- 針對機架內的 l2bridge 網路,請設定每個機架的IP集區,其中機架內的主機只能從特定集區配置。
- 使用每個堆疊層的IP集區,其中前端Pod會從前端集區取得IP(可能是公用的),但後端Pod(可能位於相同主機上)會從不同的範圍接收IP。 這可讓 Calico 適應嚴格的網路分區需求(例如,可能需要與傳統防火牆一起工作)。
- 使用非常小型的微集區,針對堆疊的每個層級各使用一個。 由於這些集區非常小,因此每個主機都需要支援來自多個集區的工作負載。
IP 一律會從區塊配置,而且這些區塊可以與特定主機相依。 如果有空間,主機一律會嘗試從自己的其中一個仿射區塊指派IP(而且只有在該區塊來自指定工作負載的允許集區時)。 如果主機的現有區塊都沒有空間,主機會嘗試從允許的集區取得新的區塊。 如果沒有空的區塊可供使用,主機將會從具有可用空間的允許集區中的任何區塊借用IP,即使該區塊歸屬於另一部主機。
Calico 依賴 最長前綴匹配路由 來支持匯總。 每個主機都會公告其所有相依區塊的路由,並針對其借用的任何IP公告 /32路由。 因為 /32 路由更加具體,遠端主機在需要轉送至 /32 時,會使用 /32 路由,而不是使用較廣泛的 /26 路由指向具有 affine 區塊的主機。
由於 Calico 是路由 L3 網路,因此值得注意的是 /26 路由不是子網。 例如,沒有網路或廣播位址;和區塊的 「0」 和 「255」 位址會作為一般 IP 使用。
Calico HNS 資料平面需求
為啟用 HNS 中的多個子網,有數個 Calico 連接性和原則的需求:
- 相同主機上的所有工作負載都必須彼此連線,以及連線到遠端 Pod。
- Pod之間的所有封包路徑應符合下列條件,無論傳送者與接收者是否位於同一主機,或無論他們是直接互通還是通過服務集群 IP 互通:
- 存取控制清單 (ACL) 輸出和輸入原則必須套用。
- 傳送 Pod 的輸出原則和接收 Pod 的輸入原則都必須允許流量。
- 所有 Calico 程式化 ACL 規則都應該能夠檢視 Pod IP。
- 主機和Pod必須能夠彼此連線,並且透過邊界閘道協定(BGP)學到的路由連線到其他主機上的Pod。
每台主機對多個 IP 區塊的需求
若要支援每個主機的多個IP區塊,請檢閱下列需求:
- 對於指定的單一 IP 池,數據平面必須允許 Pod 新增來自不同且相異的 IP 區塊的 IP。 例如,IP 集區可能是 10.0.0.0/16,但主機可能會宣告一組隨機區塊:10.0.123.0/26 和 10.0.200.0/26。
- 集區和區塊的大小在首次分配之前不需要預先知道。 強烈建議這麼做。
- 來自相同集區的其他區塊可能存在於其他主機上。
- 各種區塊的常見前置詞可能會與主機自己的IP位址重疊。
支援 IP 借用的必要條件
Calico IPAM 會針對匯總目的,將IP配置給區塊中的主機。 如果IP集區已滿,節點也可以 從另一個節點區塊借用 IP。 在 BGP 詞彙中,借款人接著會針對借用的 IP 公告更具體的 /32 路由,然後將該 IP 的流量路由傳送至借用主機。
Windows 節點不支援此借用機制。 即使IP集區已滿,它們也不會借用IP,而且會標示其區塊,讓Linux節點也不會借用它們。
對micropools的支援需求
若要使用 micropools,會移除每個區塊保留四個 IP 的需求。 在微集區使用案例中,會使用非常小型的集區和非常小的區塊,因此每個區塊有四個IP會浪費大部分的IP。 您可以針對每個主機或每個集區要求少量保留的IP。 最佳做法是將所有 第 2 層 的支援限制解除(例如,且不應支持廣播,也不應有保留的 IP)。
使用 PowerShell 建立子網和 IP 子網
在繼續之前,請確定您已從 HNS PowerShell 資源庫安裝 HNS.V2.psm1 模組,。
下列步驟說明如何使用範例建立子網和IP子網。
若要建立具有一個 192.168.0.0/16 子網的 l2bridge 網络,其中包含 192.168.1.0/24 IP 子網和 192.168.2.0/24 IP 子網,請執行下列命令:
$net1 = New-HnsNetwork -Type L2Bridge -Name Test1 -AddressPrefix "192.168.0.0/16" -Gateway "192.168.0.1" -Verbose -IPSubnets @(@{"IpAddressPrefix"="192.168.1.0/24";"Flags"=0},@{"IpAddressPrefix"="192.168.2.0/24";"Flags"=[IPSubnetFlags]::EnableBroadcast})若要將包含 172.16.16.0/16 子網的新子網新增至 l2bridge 網路,請執行下列命令:
New-HnsSubnet -NetworkID $net1.ID -Subnets @{ "IpAddressPrefix"="172.16.0.0/16"; "Routes"=@(@{"NextHop"="172.16.0.1";"DestinationPrefix"="0.0.0.0"}); "IpSubnets"=@(@{"IpAddressPrefix"="172.16.1.0/24"})若要將新的 172.16.2.0/24 IP 子網新增至 172.16.0.0/16 子網,請執行下列命令:
New-HnsIPSubnet -NetworkID $net1.ID -SubnetID $net2.Subnets[1].ID -IPSubnets @{"IpAddressPrefix"="172.16.2.0/24";"Flags"=0}
若要移除IP子網,請使用下列步驟:
若要移除 172.16.2.0/24 IP 子網,請執行下列命令:
$net2 = Get-HnsNetwork -ID $net1.ID Remove-HnsIpSubnet -NetworkID $net1.ID -SubnetID $net2.Subnets[1].ID -IPSubnets @{"ID"=$net2.Subnets[1].IPSubnets[1].ID}若要移除 172.16.0.0/16 子網,請執行下列命令:
Remove-HnsSubnet -NetworkID $net1.ID -Subnets @{"ID"=$net2.Subnets[1].ID}