ホスト ネットワーク サービスでの複数のサブネットのサポート

適用対象: Windows Server 2022

Windows コンテナーのホスト ネットワーク サービス (HNS) では、ネットワークごとに複数のサブネットを使用できるようになりました。 以前は、HNS では、基になるサブネットのプレフィックス長のみを使用するように Kubernetes コンテナー エンドポイント構成が制限されていました。 HNS が強化され、プレフィックスの長さが長いサブネットや Windows ワーカー ノードごとに複数のサブネットなど、より制限の厳しいサブネットを使用できます。 この機能を実現できる最初のコンテナー ネットワーク インターフェイス (CNI) は、Windows 用 Calico です。 Calico ネットワーク ポリシーは、Tigera によって設立されたオープンソースのネットワークおよびネットワーク セキュリティ ソリューションです。

HNS では、l2bridge、l2tunnelおよびオーバーレイ ネットワーク ドライバーに対してのみ、複数のサブネットを利用できます。 これらのネットワーク ドライバーは、複数のサブネットを公開し、各エンドポイントがこれらのサブネットのいずれかにバインドできるようにします。

HNS とホスト コンピューティング サービス (HCS) は連携してコンテナーを作成し、エンドポイントをネットワークに接続します。 HNS PowerShell ヘルパー モジュール使用して HNS と対話できます。

Calico の要件

Calico CNI の複数のサブネットサポートでは、サブネットをより小さな IP ブロックに分割する必要があります。 すべての IP ブロックは同じゲートウェイを共有する必要がありますが、各 IP ブロックは独自のブロードキャストを持つことができますメイン。 IPV4 の割り当てを可能な限り効率的にするために、Calico では、コンテナー エンドポイントに非常に小さいプレフィックス (/32 以下) を設定することに加えて、非常に小さな IP ブロック (1 ブロック = 4 つの IP アドレス) を作成する必要があります。

Calico IP アドレス管理 (IPAM) の完全な実装は次のように機能します。

Calico の IPAM 関数は、オンデマンドでワークロードに IP アドレスを割り当てるために設計されています。 Calico では、管理グループ化のために複数の IP プールもサポートされています。 特定のワークロードの割り当てを構成する場合、許可されるプールのセットが構成によって制限される可能性があり、さまざまなユース ケースに対応できます。 さまざまなユース ケースについて、以下のガイドラインに従ってください。

  • 容量を増やすには、複数の不整合プールを使用します。
  • ラック内の l2bridge ネットワークの場合は、ラック内のホストが特定のプールからのみ割り当てることができるラックごとに IP プールを構成します。
  • フロントエンド ポッドがフロントエンド プール (パブリックである可能性がある) から IP を取得し、バックエンド ポッド (同じホスト上にある可能性がある) が異なる範囲の IP を受信するスタック層ごとに IP プールを使用します。 これにより、Calico は積極的なネットワーク パーティション分割の要件に適合できます (レガシ ファイアウォールを操作するために必要な場合があります)。
  • スタックの層ごとに 1 つずつ、非常に小さなマイクロ プールを使用します。 これらのプールは非常に小さいため、各ホストで複数のプールからのワークロードをサポートする必要があります。

IP は常にブロックから割り当てられ、それらのブロックは特定のホストにアフィンできます。 ホストは、スペースがある場合 (およびブロックが特定のワークロードで許可されているプールからのみ) 独自のアフィン ブロックの 1 つから IP を割り当てようとします。 ホストの既存のブロックにスペースがない場合、ホストは許可されたプールから新しいブロックを要求しようとします。 空のブロックが使用できない場合、ホストは、そのブロックが別のホストにアフィンである場合でも、使用可能な空き領域を持つ許可されたプール内の任意のブロックから IP を借用します。

Calico は、集約をサポートするために、最長の プレフィックス 一致ルーティング に依存します。 各ホストは、そのすべてのアフィン ブロックのルートをアドバタイズし、借用した IP に対して /32 ルートをアドバタイズします。 /32 ルートはより具体的であるため、/32 に転送する必要があるリモート ホストでは、アフィン ブロックを持つホストへのより広範な /26 ルートではなく、/32 ルートが使用されます。

Calico はルーティングされた L3 ネットワークであるため、/26 ルートはサブネットを意図していない点に注意してください。 たとえば、ネットワークアドレスやブロードキャストアドレスはありません。ブロックの "0" アドレスと "255" アドレスは、通常の IP として使用されます。

Calico HNS データ プレーンの要件

HNS で複数のサブネットを有効にするには、いくつかの Calico 接続とポリシー要件があります。

  • 同じホスト上のすべてのワークロードは、互いに接続し、リモート ポッドに接続する必要があります。
  • ポッド間のすべてのパケット パスには、送信側と受信側が同じホスト上に併置されているかどうか、およびそれらが互いに直接アクセスするか、サービス クラスター IP によってアクセスするかに関係なく、次のものが必要です。
    • アクセス制御リスト (ACL) エグレス ポリシーとイングレス ポリシーを適用する必要があります。
    • 送信ポッドのエグレス ポリシーと受信ポッドのイングレス ポリシーの両方でトラフィックを許可する必要があります。
    • Calico でプログラムされたすべての ACL ルールは、ポッド IP を表示できる必要があります。
  • ホストとポッドは、互いに到達でき、Border Gateway Protocol (BGP) 経由で学習されたルート経由で他のホスト上のポッドに到達できる必要があります。

ホストごとの複数の IP ブロックの要件

ホストごとに複数の IP ブロックをサポートするには、次の要件を確認します。

  • 特定の単一の IP プールの場合、データ プレーンでは、異なる分離された 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 ノードもそれらのブロックを借用しないようにブロックをマークします。

マイクロプールをサポートするための要件

マイクロプールを使用するには、ブロックごとに 4 つの IP を予約する必要があります。 マイクロプールのユース ケースでは、非常に小さいプールと非常に小さなブロックが使用されるため、ブロックあたり 4 つの IP がほとんどの IP を無駄にします。 ホストごとまたはプールごとに、少数の予約済み IP を要求できます。 ベスト プラクティスは、レイヤー 2 のすべてのサポート制限を解除する方法です (たとえば、ブロードキャストのサポートがなく、予約済み IP がない必要があります)。

PowerShell を使用してサブネットと IP サブネットを作成する

続行する前に、HNS PowerShell ギャラリーから HNS.V2.psm1 モジュールがインストールされていることを確認してください。

次の手順では、例を使用してサブネットと IP サブネットを作成する方法について説明します。

  1. 192.168.0.0/24 IP サブネットと 192.168.2.0/24 IP サブネットを含む 192.168.0.0/16 サブネットを持つ l2bridge ネットワークを作成するには、次のコマンドを実行します。

    $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})
    
  2. 172.16.1.0/16 IP サブネットを含む新しい 172.16.0.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"})
    
  3. 新しい 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 サブネットを削除するには、次の手順に従います。

  1. 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}
    
  2. 172.16.0.0/16 サブネットを削除するには、次のコマンドを実行します。

    Remove-HnsSubnet -NetworkID $net1.ID -Subnets @{"ID"=$net2.Subnets[1].ID}