Использование общедоступных 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
Следующие шаги
Azure Kubernetes Service