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

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

В этой статье описывается создание статического общедоступного IP-адреса и его назначение службе Kubernetes.

Перед началом работы

  • Вам понадобится установленный и настроенный Azure CLI версии 2.0.59 или новее. Чтобы узнать версию, выполните команду az --version. Сведения об установке или обновлении см. в разделе Install Azure CLI.
  • В этой статье рассматривается использование IP-адреса с номером SKU Стандартный и подсистемы балансировки нагрузки с номером SKUСтандартный. Дополнительные сведения см. в статье Типы IP-адресов и методы их распределения в Azure.

Создание кластера AKS

  1. Создайте группу ресурсов Azure с помощью az group create команды.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Создайте кластер AKS с помощью az aks create команды.

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

Создание статического IP-адреса

  1. Получите имя группы ресурсов узла с помощью az aks show команды и запроса для nodeResourceGroup свойства.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. Создайте статический общедоступный IP-адрес в группе ресурсов узла с помощью az network public-ip create команды.

    az network public-ip create \
        --resource-group <node resource group name> \
        --name myAKSPublicIP \
        --sku Standard \
        --allocation-method static
    

    Внимание

    AKS больше не поддерживает балансировщик нагрузки Basic. Если в кластере используется базовый Load Balancer, выполните обновление до Load Balancer (цен. категория "Стандартный") перед настройкой статического общедоступного IP-адреса.

  3. Получите статический общедоступный IP-адрес с помощью az network public-ip show команды. Укажите имя группы ресурсов узла и созданного вами общедоступного IP-адреса, а затем выполните запрос для ipAddress.

    az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
    

Создание службы Kubernetes со статическим IP-адресом

  1. Создайте файл с именем load-balancer-service.yaml и скопируйте содержимое следующего ФАЙЛА YAML. Укажите имя ресурса общедоступного IP-адреса (myAKSPublicIP), созданное в разделе "Создание статического IP-адреса " и имени группы ресурсов узла.

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

    Внимание

    Свойство loadBalancerIP в манифесте службы Kubernetes считается устаревшим в соответствии с upstream Kubernetes. Существующие сервисы продолжают работать без изменений, но вместо них используйте аннотации сервисов.

    Annotation Purpose
    service.beta.kubernetes.io/azure-pip-name Укажите имя ресурса общедоступного IP-адреса.
    service.beta.kubernetes.io/azure-load-balancer-ipv4 Укажите IPv4-адрес.
    service.beta.kubernetes.io/azure-load-balancer-ipv6 Укажите IPv6-адрес.
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    

    Примечание.

    service.beta.kubernetes.io/azure-pip-name Добавление заметки гарантирует наиболее эффективное создание LoadBalancer и настоятельно рекомендуется избежать потенциального регулирования.

  2. Задайте общедоступную метку DNS для службы с помощью заметки service.beta.kubernetes.io/azure-dns-label-name службы. Эта служба публикует полное доменное имя (FQDN) для службы с помощью общедоступных DNS-серверов Azure и домена верхнего уровня. Значение аннотации должно быть уникальным в расположении Azure, поэтому рекомендуется использовать достаточно подробно описанную метку. Azure автоматически добавляет суффикс по умолчанию, например <location>.cloudapp.azure.com, к имени, которое вы указали, создавая полное доменное имя.

    Примечание.

    Если вы хотите опубликовать службу в собственном домене, ознакомьтесь с azure DNS и проектом внешнего DNS .

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
        service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    
  3. Перед созданием сервиса убедитесь, что в вашем кластере есть рабочая нагрузка с подами, использующими метку app: azure-load-balancer. Манифест сервиса выбирает поды с этой меткой, но не создает Deployment.

  4. Создайте службу с помощью kubectl apply команды.

    kubectl apply -f load-balancer-service.yaml
    
  5. Убедитесь, что служба выбирает по крайней мере один запущенный модуль pod.

    kubectl get pods -l app=azure-load-balancer
    
  6. Чтобы просмотреть метку DNS для подсистемы балансировки нагрузки, используйте kubectl describe команду.

    kubectl describe service azure-load-balancer
    

    Метка DNS будет указана в списке под Annotations, как показано в следующем кратком примере вывода:

    Name:                    azure-load-balancer
    Namespace:               default
    Labels:                  <none>
    Annotations:             service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
    

Устранение неполадок

В этом разделе предполагается, что вы завершили создание статического IP-адреса, попытались выполнить действия, описанные в статье "Создание службы Kubernetes со статическим IP-адресом" и запуск кластера AKS. Чтобы получить имя группы ресурсов узла, используйте az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv.

Если ресурс общедоступного IP-адреса, имя которого указано в аннотации service.beta.kubernetes.io/azure-pip-name, не существует в группе ресурсов, указанной в service.beta.kubernetes.io/azure-load-balancer-resource-group, или удостоверение плоскости управления AKS не может получить доступ к этой группе ресурсов, не удаётся создать службу балансировщика нагрузки. Для устранения неполадок просмотрите аннотации службы и события создания с помощью команды kubectl describe. Укажите имя службы, указанной в манифесте YAML, как показано в следующем примере:

kubectl describe service azure-load-balancer

В выходных данных отображаются сведения о ресурсе службы Kubernetes. Следующий пример вывода показывает Warning в Events: "user supplied IP address was not found". В этом сценарии убедитесь, что аннотация azure-pip-name соответствует имени ресурса статического общедоступного IP-адреса, а аннотация azure-load-balancer-resource-group соответствует группе ресурсов, которая его содержит.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
                          service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
Selector:                 app=azure-load-balancer
Type:                     LoadBalancer
IP:                       10.0.18.125
IP:                       40.121.183.52
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32582/TCP
Endpoints:                <pod-ip>:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   CreatingLoadBalancer        7s (x2 over 22s)  service-controller  Creating load balancer
  Warning  CreatingLoadBalancerFailed  6s (x2 over 12s)  service-controller  Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found

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

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