主機網路服務中的多個子網支援
適用於:Windows Server 2022
Windows 容器的主機網路服務 (HNS) 現在支援針對每個網路使用多個子網。 先前,HNS 限制 Kubernetes 容器端點組態只能使用基礎子網的前置長度。 HNS 已增強,因此您可以使用更嚴格的子網,例如具有較長前置長度的子網,以及每個 Windows 背景工作節點的多個子網。 第一個可讓此功能使用的容器網路介面 (CNI) 是適用於 Windows 的 Calico。 Calico 網路原則是 Tigera 所建立的開放原始碼網路和網路安全性解決方案。
您只能針對 l2bridge、l2tunnel 和重迭網路驅動程式,在 HNS 中使用多個子網。 這些網路驅動程式可以公開多個子網,然後允許每個端點系結至其中一個子網。
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 路由,而不是使用 affine 區塊將更廣泛的 /26 路由傳送至主機。
由於 Calico 是路由 L3 網路,因此值得注意的是 /26 路由不是子網。 例如,沒有網路或廣播位址;和區塊的 「0」 和 「255」 位址會作為一般 IP 使用。
Calico HNS 數據平面需求
有數個 Calico 連線和原則需求,可啟用 HNS 中的多個子網:
- 相同主機上的所有工作負載都必須彼此連線,以及連線到遠端 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 子網的 am 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.1.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}