Поделиться через


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

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

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

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

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

Требования Calico

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

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

Функция 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).
    • Политика egress модуля отправки и политика ingress модуля приёма должны разрешать трафик.
    • Все правила ACL, запрограммированные в Calico, должны иметь возможность просматривать IP-адреса pod.
  • Узлы и модули pod должны иметь возможность связаться друг с другом, а также получить доступ к модулям pod на других узлах по маршрутам, извлеченным по протоколу BGP.

Требования к нескольким блокам IP-адресов на узел

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

  • Для заданного пула IP-адресов плоскость передачи данных должна разрешать добавлять поды с 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. Чтобы создать сеть l2bridge с одной подсетью 192.168.0.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, содержащую IP-подсеть 172.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"})
    
  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}