호스트 네트워킹 서비스의 다중 서브넷 지원

적용 대상: Windows Server 2022

이제 Windows 컨테이너용 HNS(호스트 네트워킹 서비스)에서 네트워크당 여러 서브넷 사용이 지원됩니다. 이전에는 HNS가 기본 서브넷의 접두사 길이만 사용하도록 Kubernetes 컨테이너 엔드포인트 구성을 제한했습니다. 접두사 길이가 긴 서브넷과 같은 더 제한적인 서브넷과 Windows 작업자 노드당 여러 서브넷을 사용할 수 있도록 HNS가 향상되었습니다. 이 기능을 사용할 수 있는 첫 번째 CNI(컨테이너 네트워킹 인터페이스)는 Windows용 Calico입니다. Calico 네트워크 정책은 Tigera에서 설립한 오픈 소스 네트워크 및 네트워크 보안 솔루션입니다.

l2bridge, l2tunnel오버레이 네트워크 드라이버에 대해서만 HNS에서 여러 서브넷을 활용할 수 있습니다. 이러한 네트워크 드라이버는 여러 서브넷을 노출한 다음 각 엔드포인트가 이러한 서브넷 중 하나에 바인딩되도록 허용할 수 있습니다.

HNS와 HCS(호스트 컴퓨팅 서비스)는 함께 작동하여 컨테이너를 만들고 엔드포인트를 네트워크에 연결합니다. HNS Powershell 도우미 모듈사용하여 HNS와 상호 작용할 수 있습니다.

Calico 요구 사항

Calico CNI에 대한 여러 서브넷 지원을 사용하려면 서브넷을 더 작은 IP 블록으로 세분화해야 합니다. 모든 IP 블록은 동일한 게이트웨이를 공유해야 하지만 각 IP 블록에는 별도의 브로드캐스트가 있을 수 있습니다기본. IPV4 할당을 최대한 효율적으로 최대화하려면 컨테이너 엔드포인트(/32만큼 작음)에 매우 작은 접두사를 설정하는 것 외에도 매우 작은 IP 블록(1블록 = IP 주소 4개)을 만들어야 합니다.

CALico IP 주소 관리(IPAM)의 전체 구현은 다음과 같이 작동합니다.

Calico의 IPAM 함수는 주문형 워크로드에 IP 주소를 할당하도록 설계되었습니다. Calico는 관리 그룹화에 대한 여러 IP 풀도 지원합니다. 특정 워크로드에 대한 할당을 구성할 때 허용되는 풀 집합은 다양한 사용 사례를 허용하는 구성에 의해 제한될 수 있습니다. 다양한 사용 사례에 대한 아래 지침을 따르세요.

  • 여러 개의 연결이 해제된 풀을 사용하여 용량을 늘입니다.
  • 랙 내의 l2bridge 네트워크의 경우 랙 내의 호스트가 특정 풀에서만 할당할 수 있는 랙당 IP 풀을 구성합니다.
  • 프런트 엔드 Pod가 프런트 엔드 풀(공용일 수 있음)에서 IP를 가져오지만 백 엔드 Pod(잠재적으로 동일한 호스트에 있음)가 다른 범위에서 IP를 수신하는 스택 계층당 IP 풀을 사용합니다. 이를 통해 Calico는 적극적인 네트워크 분할 요구 사항에 부합할 수 있습니다(레거시 방화벽을 사용하는 데 필요할 수 있음).
  • 스택의 각 계층에 대해 하나씩 매우 작은 마이크로 풀을 사용합니다. 이러한 풀은 너무 작기 때문에 각 호스트가 여러 풀의 워크로드를 지원해야 합니다.

IP는 항상 블록에서 할당되며 해당 블록은 특정 호스트에 연결될 수 있습니다. 호스트는 항상 공간이 있는 경우(그리고 지정된 워크로드에 대해 허용된 풀에서 블록이 있는 경우에만) 자체 아핀 블록 중 하나에서 IP를 할당하려고 시도합니다. 호스트의 기존 블록에 공간이 없는 경우 호스트는 허용된 풀에서 새 블록을 클레임하려고 합니다. 빈 블록을 사용할 수 없는 경우 호스트는 사용 가능한 여유 공간이 있는 허용된 풀의 모든 블록에서 IP를 빌려 줍니다.

Calico는 집계를 지원하기 위해 가장 긴 접두사 일치 라우팅 을 사용합니다. 각 호스트는 모든 아핀 블록에 대한 경로를 보급하고 빌린 IP에 대해 /32 경로를 보급합니다. /32 경로가 더 구체적이기 때문에 /32로 전달해야 하는 원격 호스트는 아핀 블록이 있는 호스트에 대한 광범위한 /26 경로 대신 /32 경로를 사용합니다.

Calico는 라우트된 L3 네트워크이므로 /26 경로가 서브넷이 아님을 주목할 필요가 있습니다. 예를 들어 네트워크 또는 브로드캐스트 주소는 없습니다. 블록의 "0" 및 "255" 주소는 일반 IP로 사용됩니다.

Calico HNS 데이터 평면 요구 사항

HNS에서 여러 서브넷을 사용하도록 설정하기 위한 몇 가지 Calico 연결 및 정책 요구 사항이 있습니다.

  • 동일한 호스트의 모든 워크로드는 서로 및 원격 Pod에 연결되어 있어야 합니다.
  • Pod 간의 모든 패킷 경로에는 보낸 사람 및 수신자가 동일한 호스트에 공동 배치되어 있는지 여부와 직접 또는 서비스 클러스터 IP를 통해 서로 액세스하는지 여부에 관계없이 다음이 있어야 합니다.
    • ACL(액세스 제어 목록) 송신 및 수신 정책이 적용되어야 합니다.
    • 송신 Pod의 송신 정책과 수신 Pod의 수신 정책 모두 트래픽을 허용해야 합니다.
    • 모든 Calico 프로그래밍 ACL 규칙은 Pod IP를 볼 수 있어야 합니다.
  • 호스트와 Pod는 서로 도달하고 BGP(Border Gateway Protocol)를 통해 학습된 경로를 통해 다른 호스트의 Pod에 연결할 수 있어야 합니다.

호스트 요구 사항당 여러 IP 블록

호스트당 여러 IP 블록을 지원하려면 다음 요구 사항을 검토합니다.

  • 지정된 단일 IP 풀의 경우 데이터 평면은 서로 다른 연결되지 않는 IP 블록의 IP와 함께 Pod를 추가할 수 있도록 허용해야 합니다. 예를 들어 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.1.0/24 IP 서브넷과 192.168.2.0/24 IP 서브넷을 포함하는 하나의 192.168.0.0/16 서브넷이 있는 am 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.0.0/16 서브넷에 새 172.16.2.0/24 IP 서브넷을 추가하려면 다음 명령을 실행합니다.

    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}