Поддержка нескольких подсетей в сетевой службе узлов

Область применения: Windows Server 2022

Использование нескольких подсетей для каждой сети теперь поддерживается в службе "Сеть узлов" (HNS) для контейнеров Windows. Ранее конфигурации конечных точек контейнеров HNS с ограниченным доступом к Kubernetes использовали только длину префикса базовой подсети. HNS улучшен, поэтому можно использовать более строгие подсети, такие как подсети с более длинной длиной префикса, а также несколько подсетей на рабочий узел Windows. Первый сетевой интерфейс контейнера (CNI), который может использовать эту функцию, является Calico для Windows. Политики сети Calico — это решение для безопасности сети с открытым исходным кодом, основанное Tigera.

Можно использовать несколько подсетей в HNS только для l2bridge, l2tunnel и наложения сетевых драйверов. Эти сетевые драйверы могут предоставлять несколько подсетей, а затем разрешать каждой конечной точке привязку к одной из этих подсетей.

HNS и служба вычислений узлов (HCS) работают вместе для создания контейнеров и подключения конечных точек к сети. Вы можете взаимодействовать с HNS с помощью вспомогательного модуля HNS PowerShell.

Требования Calico

Для поддержки нескольких подсетей для CNI Calico требуется разделение подсети на меньшие IP-блоки. Все блоки IP-адресов должны совместно использовать один и тот же шлюз, но каждый блок IP-адресов может иметь собственный отдельный домен вещания. Чтобы максимально эффективно распределить IPV4, Калифорния требует создания очень небольших блоков IP-адресов (как минимум один блок = четыре IP-адреса), помимо настройки очень небольших префиксов на конечных точках контейнера (как минимум /32).

Полная реализация Calico управление IP-адресами (IPAM) работает следующим образом:

Функция IPAM Calico предназначена для выделения IP-адресов рабочим нагрузкам по запросу. Calico также поддерживает несколько пулов IP-адресов для группирования администраторов. При настройке выделения для определенной рабочей нагрузки набор разрешенных пулов может быть ограничен конфигурацией, которая позволяет использовать различные варианты использования. Следуйте приведенным ниже рекомендациям для различных вариантов использования:

  • Используйте несколько несвязанных пулов для увеличения емкости.
  • Для сетей l2bridge в стойке настройте пул IP-адресов на стойку, где узлы в стойке могут выделяться только из определенного пула.
  • Используйте пул IP-адресов на уровне стека, где интерфейсные модули pod получают IP-адреса из внешнего пула (который может быть общедоступным), но серверные модули pod (потенциально на одном узле) получают IP-адреса из другого диапазона. Это позволяет Calico соответствовать агрессивным требованиям к секционированием сети (как это может потребоваться для работы с устаревшими брандмауэрами).
  • Используйте очень маленькие микро пулы, по одному для каждого уровня стека. Так как эти пулы настолько малы, они требуют, чтобы каждый узел поддерживал рабочие нагрузки из нескольких пулов.

Ip-адреса всегда выделяются из блоков, и эти блоки могут быть аффинены к конкретному узлу. Узел всегда пытается назначить IP-адреса из одного из собственных аффинных блоков, если есть пробел (и только если блок находится из разрешенного пула для данной рабочей нагрузки). Если ни один из существующих блоков узла не имеет места, узел попытается запросить новый блок из разрешенного пула. Если пустые блоки недоступны, узел будет заимствовать IP-адрес из любого блока в разрешенном пуле, который имеет свободное место, даже если этот блок аффинен к другому узлу.

Calico использует самую длинную маршрутизацию префикса для поддержки агрегирования. Каждый узел объявляет маршруты для всех аффинных блоков и объявляет /32 маршруты для любых IP-адресов, которые он заимствовал. Так как маршрут /32 более конкретный, удаленные узлы, которые должны пересылать в /32, будут использовать маршрут /32 вместо более широкого /26 маршрута к узлу с аффинным блоком.

Так как Calico является перенаправленной сетью L3, стоит отметить, что маршруты /26 не предназначены для подсетей. Например, нет сетевого или широковещательного адреса; и адреса "0" и "255" блока используются как обычные IP-адреса.

Требования к плоскости данных Calico HNS

Существует несколько требований к подключению и политике Calico для включения нескольких подсетей в HNS:

  • Все рабочие нагрузки на одном узле должны иметь подключение друг к другу и удаленным модулям pod.
  • Все пути к пакетам между модулями pod должны иметь следующий тип, независимо от того, является ли отправитель и получатель совместно расположенными на одном узле, и независимо от того, имеют ли они доступ друг к другу напрямую или через IP-адрес кластера служб:
    • Необходимо применить исходящий список управления доступом (ACL) и политики входящего трафика.
    • Политика исходящего трафика модуля pod отправки и политики входящего трафика принимающего модуля pod должны разрешать трафик.
    • Все правила ACL, запрограммированные в Calico, должны иметь возможность просматривать IP-адреса pod.
  • Узлы и модули pod должны иметь возможность связаться друг с другом, а также получить доступ к модулям pod на других узлах по маршрутам, извлеченным по протоколу BGP.

Несколько блоков IP-адресов для каждого узла

Чтобы поддерживать несколько блоков IP-адресов на узел, ознакомьтесь со следующими требованиями:

  • Для заданного пула IP-адресов плоскость данных должна разрешать добавлять модули pod с ip-адресами из разных блоков IP-адресов. Например, пул IP-адресов может иметь значение 10.0.0.0/16, но узел может претендовать на пару случайных блоков: 10.0.123.0/26 и 10.0.200.0/26.
  • Пул и размер блоков не должны быть известны заранее первого выделения. Настоятельно рекомендуется сделать это.
  • Другие блоки из одного пула могут присутствовать на других узлах.
  • Общий префикс различных блоков может перекрываться с собственным IP-адресом узла.

Требования к поддержке заимствования IP-адресов

IPAM Calico выделяет IP-адреса для размещения в блоках для агрегирования. Если пул IP-адресов заполнен, узлы также могут заимствовать IP-адреса из блока другого узла. В терминах BGP заемщик затем объявляет более конкретный маршрут /32 для заимствованного IP-адреса, а затем трафик для этого IP-адреса направляется на узел заимствования.

Узлы Windows не поддерживают этот механизм заимствования. Они не будут заимствовать IP-адреса, даже если пул IP-адресов заполнен, и они помечают их блоки, чтобы узлы Linux также не заимствовали их.

Требования к поддержке микропулов

Чтобы использовать микропули, требуется зарезервировать четыре IP-адреса на блок. В случае использования микропула используются очень небольшие пулы и очень небольшие блоки, поэтому четыре IP-адреса на блок отходов больше всего ip-адресов. Для каждого узла или пула может потребоваться небольшое количество зарезервированных IP-адресов. Рекомендуется отменить все ограничения поддержки уровня 2 (например, не должно быть поддержки широковещательной трансляции и без зарезервированных IP-адресов).

Создание подсети и подсети IP с помощью PowerShell

Прежде чем продолжить, убедитесь, что у вас установлен модуль HNS.V2.psm1 из коллекции HNS PowerShell.

Ниже описано, как создать подсеть и подсеть IP с помощью примеров.

  1. Чтобы создать сеть am l2bridge с одной подсетью 192.168.0/16, содержащей подсеть IP-адресов 192.168.1.0/24 и подсеть 192.168.2.0/24, выполните следующую команду:

    $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.0.0/16, содержащую подсеть 172.16.1.0/16 IP в сеть 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. Чтобы добавить новую подсеть IP-адреса 172.16.2.0/24 в подсеть 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. Чтобы удалить подсеть IP-адреса 172.16.2.0/24, выполните следующую команду:

       $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}