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


Использование общедоступных IP-адресов уровня экземпляра в Служба Azure Kubernetes (AKS)

Узлы AKS не нуждаются в собственных общедоступных IP-адресах для обмена данными. Однако сценарии могут потребовать, чтобы узлы в пуле узлов получали собственные выделенные общедоступные IP-адреса. Типичный сценарий — для игровых рабочих нагрузок, в которых консоль должна установить прямое подключение к облачной виртуальной машине для снижения числа прыжков. Этот сценарий можно достичь на AKS, задав общедоступный IP-адрес узла.

В первую очередь создается новая группа ресурсов.

az group create --name <resourceGroup> --location <region>

Создайте новый кластер AKS и подключите общедоступный IP-адрес для узлов. Каждый узел в пуле узлов получает уникальный общедоступный IP-адрес. Это можно проверить, просмотрев экземпляры масштабируемых наборов виртуальных машин.

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --location <region> \
    --enable-node-public-ip \
    --generate-ssh-keys

Для существующих кластеров AKS можно также добавить новый пул узлов и подключить общедоступный IP-адрес для узлов.

az aks nodepool add --resource-group <resourceGroup> --cluster-name <aksClusterName> --name <newNodePool> --enable-node-public-ip

Добавление префикса общедоступных IP-адресов

Использование префикса общедоступного IP-адреса имеет ряд преимуществ. AKS поддерживает использование адресов из существующего префикса общедоступного IP-адреса для узлов, передавая идентификатор ресурса с флагом --node-public-ip-prefix-id при создании нового кластера или добавлении пула узлов.

Сначала создайте префикс общедоступного IP-адреса с помощью команды az network public-ip prefix create:

az network public-ip prefix create --length 28 --location <region> --name <publicIPPrefixName> --resource-group <resourceGroup>

Просмотрите выходные данные и запишите значение id для префикса.

{
  ...
  "id": "/subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName>",
  ...
}

Наконец, при создании нового кластера или добавлении нового пула узлов используйте флаг --node-public-ip-prefix-id и передайте идентификатор ресурса префикса.

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --location <region> \
    --enable-node-public-ip \
    --node-public-ip-prefix-id /subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName> \
    --generate-ssh-keys

Поиск общедоступных IP-адресов для узлов

Общедоступные IP-адреса для узлов можно узнать различными способами.

  • Выполните команду Azure CLI az vmss list-instance-public-ips.
  • Используйте команды PowerShell или bash.
  • Общедоступные IP-адреса можно также просмотреть в портале Azure, просмотрев экземпляры в масштабируемом наборе виртуальных машин.

Внимание

Группа ресурсов узла содержит узлы и их общедоступные IP-адреса. Используйте группу ресурсов узла при выполнении команд, чтобы найти общедоступные IP-адреса узлов.

az vmss list-instance-public-ips --resource-group <MC_region_aksClusterName_region> --name <virtualMachineScaleSetName>

Использование тегов общедоступных IP-адресов на общедоступных IP-адресах узла

Теги общедоступных IP-адресов можно использовать на общедоступных IP-адресах узла для использования функции предпочтения маршрутизации Azure.

Требования

  • Требуется AKS версии 1.29 или более поздней.

Создание нового кластера с помощью предпочтения маршрутизации в Интернете

az aks create \
    --name <aksClusterName> \
    --location <region> \
    --resource-group <resourceGroup> \
    --enable-node-public-ip \
    --node-public-ip-tags RoutingPreference=Internet \
    --generate-ssh-keys

Добавление пула узлов с предпочтениями маршрутизации в Интернете

az aks nodepool add --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --location <region> \
  --resource-group <resourceGroup> \
  --enable-node-public-ip \
  --node-public-ip-tags RoutingPreference=Internet

Разрешить подключения к порту узла и добавлять пулы узлов в группы безопасности приложений

Узлы AKS, использующие общедоступные IP-адреса узлов, которые размещают службы на их адресе узла, должны добавить правило NSG, чтобы разрешить трафик. Добавление требуемых портов в конфигурацию пула узлов создаст соответствующие правила разрешения в группе безопасности сети кластера.

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

Формат спецификации порта узла

При указании списка разрешенных портов используйте отдельный запятый список с записями в формате port/protocol или startPort-endPort/protocol.

Примеры:

  • 80/tcp
  • 80/tcp,443/tcp
  • 53/udp,80/tcp
  • 50000-60000/tcp

Требования

  • Требуется AKS версии 1.29 или более поздней.

Создание кластера с разрешенными портами и группами безопасности приложений

az aks create \
    --resource-group <resourceGroup> \
    --name <aksClusterName> \
    --nodepool-name <nodePoolName> \
    --nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
    --nodepool-asg-ids "<asgId>,<asgId>" \
    --generate-ssh-keys

Добавление нового пула узлов с разрешенными портами и группами безопасности приложений

az aks nodepool add \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Обновление разрешенных портов и групп безопасности приложений для пула узлов

az aks nodepool update \
  --resource-group <resourceGroup> \
  --cluster-name <aksClusterName> \
  --name <nodePoolName> \
  --allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
  --asg-ids "<asgId>,<asgId>"

Автоматическое назначение портов узла для рабочих нагрузок pod (предварительная версия)

Если общедоступные IP-адреса настроены на узлах, порты узлов можно использовать, чтобы разрешить pod напрямую получать трафик без необходимости настраивать службу подсистемы балансировки нагрузки. Это особенно полезно в таких сценариях, как игры, где временный характер IP-адреса узла и порта не является проблемой, так как служба сопоставления в известном имени узла может предоставить правильный узел и порт для использования во время подключения. Однако, поскольку только один процесс на узле может прослушивать один и тот же порт, использование приложений с портами узлов может привести к проблемам с планированием. Чтобы избежать этой проблемы, AKS предоставляет возможность динамически назначать доступный порт во время планирования, предотвращая конфликты.

Предупреждение

Трафик порта узла Pod будет заблокирован правилами NSG по умолчанию в кластере. Эта функция должна сочетаться с разрешением портов узла в пуле узлов, чтобы разрешить поток трафика.

Внимание

Предварительные версии функций AKS доступны на уровне самообслуживания. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS предоставляются с частичной клиентской поддержкой по мере возможности. Следовательно, эти функции не предназначены для использования в рабочей среде. Дополнительные сведения доступны в следующих статьях поддержки.

Требования

  • Требуется AKS версии 1.29 или более поздней.

Регистрация флага компонента PodHostPortAutoAssignPreview

Зарегистрируйте флаг компонента PodHostPortAutoAssignPreview, используя команду az feature register, как показано в указанном ниже примере.

az feature register --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

Через несколько минут отобразится состояние Registered (Зарегистрировано). Проверьте состояние регистрации с помощью команды az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"

Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью команды az provider register:

az provider register --namespace Microsoft.ContainerService

Автоматическое назначение порта узла модулем pod

Активация автоматического назначения порта узла выполняется путем развертывания рабочей нагрузки без каких-либо портов узла и применения kubernetes.azure.com/assign-hostports-for-containerports заметки со списком портов, которым требуются назначения портов узла. Значение заметки должно быть указано в виде разделенного запятыми списка записей, напримерport/protocol, где порт является отдельным номером порта, определенным в спецификации Pod, и протоколомtcp.udp

Порты будут назначены из диапазона 40000-59999 и будут уникальными в кластере. Назначенные порты также будут добавлены в переменные среды в модуле pod, чтобы приложение знали, какие порты были назначены. Имя переменной среды будет находиться в следующем формате (например, ниже): <deployment name>_PORT_<port number>_<protocol>_HOSTPORTнапример, будет приведен mydeployment_PORT_8080_TCP_HOSTPORT: 41932пример.

Ниже приведен пример echoserver развертывания, показывающий сопоставление портов узла для портов 8080 и 8443:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-hostport
  labels:
    app: echoserver-hostport
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echoserver-hostport
  template:
    metadata:
      annotations:
        kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
      labels:
        app: echoserver-hostport
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: echoserver-hostport
          image: k8s.gcr.io/echoserver:1.10
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            - name: https
              containerPort: 8443
              protocol: TCP

При применении hostPort развертывания записи будут находиться в YAML отдельных модулей pod:

$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
  echoserver-hostport:
    Container ID:   containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
    Image:          k8s.gcr.io/echoserver:1.10
    Image ID:       k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229                                                                                                      Ports:          8080/TCP, 8443/TCP
    Host Ports:     46645/TCP, 49482/TCP
    State:          Running
      Started:      Thu, 12 Jan 2023 18:02:50 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      echoserver-hostport_PORT_8443_TCP_HOSTPORT:  49482
      echoserver-hostport_PORT_8080_TCP_HOSTPORT:  46645

Следующие шаги