Настройка контроллера входящего трафика NGINX для поддержки частной зоны DNS Azure с надстройкой маршрутизации приложений

В этой статье показано, как настроить контроллер входящего трафика NGINX для работы с внутренней подсистемой балансировки нагрузки Azure и настроить частную зону Azure DNS, чтобы разрешить разрешение DNS для частных конечных точек для разрешения определенных доменов.

Подготовка к работе

Подключение к кластеру AKS

Чтобы подключиться к кластеру Kubernetes с локального компьютера, используйте kubectlклиент командной строки Kubernetes. Ее можно установить локально с помощью команды az aks install-cli . Если вы используете Azure Cloud Shell, kubectl уже установлен.

В следующем примере настраивается подключение к кластеру с именем myAKSCluster в myResourceGroup с помощью az aks get-credentials команды.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Создание виртуальной сети

Чтобы опубликовать частную зону DNS в виртуальной сети, необходимо указать список виртуальных сетей, разрешенных для разрешения записей в пределах зоны. Они называются ссылками виртуальной сети.

В следующем примере создается виртуальная сеть с именем myAzureVNet в группе ресурсов myResourceGroup и одна подсеть с именем mySubnet для создания в виртуальной сети с определенным префиксом адреса.

az network vnet create \
  --name myAzureVNet \
  --resource-group myResourceGroup \
  --location eastus \
  --address-prefix 10.2.0.0/16 \
  --subnet-name mysubnet \
  --subnet-prefixes 10.2.0.0/24

Создание частной зоны DNS Azure

Примечание.

Вы можете настроить надстройку маршрутизации приложений для автоматического создания записей в одной или нескольких глобальных и частных зонах DNS Azure для узлов, определенных в ресурсах Ingress. Все глобальные зоны Azure DNS и все частные зоны Azure DNS должны находиться в одной группе ресурсов.

Вы создаете зону DNS с помощью команды create az network private-dns zone, указывая имя зоны и группу ресурсов, в которой он будет создан. В следующем примере создается зона DNS с именем private.contoso.com в группе ресурсов myResourceGroup .

az network private-dns zone create --resource-group myResourceGoup -n private.contoso.com

Вы создаете ссылку виртуальной сети на зону DNS, созданную ранее с помощью команды az network private-dns link vnet create . В следующем примере создается ссылка с именем myDNSLink к зоне private.contoso.com для виртуальной сети myAzureVNet. --registration-enabled Включите параметр, чтобы указать ссылку, не включена регистрация.

az network private-dns link vnet create --resource-group myResourceGroup \
  --name myDNSLink \
  --zone-name private.contoso.com \
  --virtual-network myAzureVNet \
  --registration-enabled false

Функция автоматической регистрации частной зоны Azure DNS управляет записями DNS для виртуальных машин, развернутых в виртуальной сети. При связывании виртуальной сети с частной зоной DNS с включенным параметром запись DNS создается для каждой виртуальной машины Azure для узла AKS, развернутого в виртуальной сети.

Присоединение частной зоны DNS Azure к надстройке маршрутизации приложений

Примечание.

Команда az aks approuting zone add использует разрешения пользователя, выполняющего команду, для создания назначения роли зоны Azure DNS. Роль участника Частная зона DNS зоны — это встроенная роль для управления частными ресурсами DNS и назначается управляемому удостоверению надстройки. Дополнительные сведения об управляемых удостоверениях AKS см. в сводке управляемых удостоверений.

  1. Получите идентификатор ресурса для зоны DNS с помощью az network dns zone show команды и задайте выходные данные переменной с именем ZONEID. В следующем примере выполняется запрос зоны private.contoso.com в группе ресурсов myResourceGroup.

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --query "id" --output tsv)
    
  2. Обновите надстройку, чтобы включить интеграцию с Azure DNS с помощью az aks approuting zone команды. Вы можете передать разделенный запятыми список идентификаторов ресурсов зоны DNS. В следующем примере обновляется кластер AKS myAKSCluster в группе ресурсов myResourceGroup.

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${ZONEID} --attach-zones
    

Создание контроллера входящего трафика NGINX с частным IP-адресом и внутренней подсистемой балансировки нагрузки

Надстройка маршрутизации приложений использует пользовательское определение ресурсов Kubernetes (CRD), вызываемое NginxIngressController для настройки контроллеров входящего трафика NGINX. Можно создать дополнительные контроллеры входящего трафика или изменить существующую конфигурацию.

NginxIngressController CRD имеет loadBalancerAnnotations поле для управления поведением службы контроллера входящего трафика NGINX, задав заметки подсистемы балансировки нагрузки.

Выполните следующие действия, чтобы создать контроллер входящего трафика NGINX с внутренним интерфейсом Azure Load Balancer с частным IP-адресом.

  1. Скопируйте следующий манифест YAML в новый файл с именем nginx-internal-controller.yaml и сохраните файл на локальном компьютере.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. Создайте ресурсы контроллера входящего трафика NGINX с помощью kubectl apply команды.

    kubectl apply -f nginx-internal-controller.yaml
    

    В следующем примере выходных данных показан созданный ресурс:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. Проверка создания контроллера входящего трафика

    Состояние контроллера входящего трафика NGINX можно проверить с помощью kubectl get nginxingresscontroller команды.

    kubectl get nginxingresscontroller
    

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

    NAME             INGRESSCLASS                         CONTROLLERNAMEPREFIX   AVAILABLE
    default          webapprouting.kubernetes.azure.com   nginx                  True
    nginx-internal   nginx-internal                       nginx-internal         True
    

Развертывание приложения

Надстройка маршрутизации приложений использует заметки в объектах входящего трафика Kubernetes для создания соответствующих ресурсов.

  1. Создайте пространство имен приложения, вызываемое hello-web-app-routing для запуска примеров модулей pod с помощью kubectl create namespace команды.

    kubectl create namespace hello-web-app-routing
    
  2. Создайте развертывание, скопируйте следующий манифест YAML в новый файл с именем deployment.yaml и сохраните файл на локальном компьютере.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld  
      namespace: hello-web-app-routing
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld
      template:
        metadata:
          labels:
            app: aks-helloworld
        spec:
          containers:
          - name: aks-helloworld
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    
  3. Создайте службу, скопируйте следующий манифест YAML в новый файл с именем service.yaml и сохраните файл на локальном компьютере.

    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld
    
  4. Создайте ресурсы кластера с помощью kubectl apply команды.

    kubectl apply -f deployment.yaml -n hello-web-app-routing
    

    В следующем примере выходных данных показан созданный ресурс:

    deployment.apps/aks-helloworld created created
    
    kubectl apply -f service.yaml -n hello-web-app-routing
    

    В следующем примере выходных данных показан созданный ресурс:

    service/aks-helloworld created created
    

Создайте ресурс входящего трафика, использующий имя узла в частной зоне DNS Azure и частный IP-адрес.

  1. Скопируйте следующий манифест YAML в новый файл с именем ingress.yaml и сохраните его на локальном компьютере.

    Обновите <Hostname> имя узла DNS, например helloworld.private.contoso.com. Убедитесь, что вы указываете nginx-internal для параметра ingressClassName.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: nginx-internal
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. Создайте ресурсы кластера с помощью kubectl apply команды.

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    В следующем примере выходных данных показан созданный ресурс:

    ingress.networking.k8s.io/aks-helloworld created
    

Проверка создания управляемого входящего трафика

Вы можете проверить, создан ли управляемый входящий трафик с помощью kubectl get ingress команды.

kubectl get ingress -n hello-web-app-routing

В следующем примере выходных данных показан созданный управляемый входящий трафик:

NAME             CLASS            HOSTS                            ADDRESS      PORTS   AGE
aks-helloworld   nginx-internal   helloworld.private.contoso.com   10.224.0.7   80      98s

Проверка обновления частной зоны DNS Azure

Через несколько минут выполните команду az network private-dns record-set a list , чтобы просмотреть записи A для частной зоны DNS Azure. Укажите имя группы ресурсов и имя зоны DNS. В этом примере группа ресурсов — myResourceGroup , а зона DNS — private.contoso.com.

az network private-dns record-set a list --resource-group myResourceGroup --zone-name private.contoso.com

В следующем примере выходных данных показана созданная запись:

[
  {
    "aRecords": [
      {
        "ipv4Address": "10.224.0.7"
      }
    ],
    "etag": "188f0ce5-90e3-49e6-a479-9e4053f21965",
    "fqdn": "helloworld.private.contoso.com.",
    "id": "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/foo/providers/Microsoft.Network/privateDnsZones/private.contoso.com/A/helloworld",
    "isAutoRegistered": false,
    "name": "helloworld",
    "resourceGroup": "foo",
    "ttl": 300,
    "type": "Microsoft.Network/privateDnsZones/A"
  }
]

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

Дополнительные сведения о конфигурации, связанные с шифрованием SSL, другим расширенным контроллером входящего трафика NGINX и конфигурацией ресурсов входящего трафика, просмотрите конфигурацию DNS и SSL и конфигурацию маршрутизации приложений.