Настройка имени личного домена и SSL-сертификата с помощью надстройки маршрутизации приложений

Ingress — это объект API, определяющий правила, которые позволяют внешним доступом к службам в кластере Служба Azure Kubernetes (AKS). При создании объекта Ingress, использующего классы Ingress для маршрутизации приложений nginx, надстройка создает, настраивает и управляет одним или несколькими контроллерами входящего трафика в кластере AKS.

В этой статье показано, как настроить расширенную конфигурацию входящего трафика для шифрования трафика с помощью SSL/TLS-сертификатов, хранящихся в Azure Key Vault, и использовать Azure DNS для управления зонами DNS.

Надстройка маршрутизации приложений с функциями nginx

Надстройка маршрутизации приложений с nginx обеспечивает следующее:

  • Простая настройка управляемых контроллеров Ingress nginx.
  • Интеграция с внешним DNS, например Azure DNS для глобального и частного управления зонами
  • Завершение SSL с сертификатами, хранящимися в хранилище ключей, например Azure Key Vault.

Необходимые компоненты

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

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

Настройте kubectl для подключения к кластеру az aks get-credentials Kubernetes с помощью команды.

az aks get-credentials -g <ResourceGroupName> -n <ClusterName>

Завершение трафика HTTPS с помощью сертификатов из Azure Key Vault

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

Создание Azure Key Vault для хранения сертификата

Примечание.

Если у вас уже есть Azure Key Vault, этот шаг можно пропустить.

Создайте Azure Key Vault с помощью az keyvault create команды.

az keyvault create -g <ResourceGroupName> -l <Location> -n <KeyVaultName> --enable-rbac-authorization true

Создание и экспорт самозаверяющего SSL-сертификата

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

Внимание

Самозаверяющие сертификаты — это цифровые сертификаты, которые не подписаны доверенным сторонним ЦС. Самозаверяющие сертификаты создаются, выдаются и подписаны компанией или разработчиком, отвечающими за подписанный веб-сайт или программное обеспечение. Именно поэтому самозаверяющиеся сертификаты считаются небезопасными для общедоступных веб-сайтов и приложений. Azure Key Vault имеет надежное партнерство с некоторыми центрами сертификации.

  1. Создайте самозаверяющий SSL-сертификат для использования с входящего трафика с помощью openssl req команды. Убедитесь, что вы замените <Hostname> DNS-имя, используемое вами.

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. Экспортируйте SSL-сертификат и пропустите строку пароля с помощью openssl pkcs12 -export команды.

    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key -out aks-ingress-tls.pfx
    

Импорт сертификата в Azure Key Vault

Импортируйте SSL-сертификат в Azure Key Vault с помощью az keyvault certificate import команды. Если сертификат защищен паролем, можно передать пароль через --password флаг.

az keyvault certificate import --vault-name <KeyVaultName> -n <KeyVaultCertificateName> -f aks-ingress-tls.pfx [--password <certificate password if specified>]

Важно!

Чтобы включить надстройку для перезагрузки сертификатов из Azure Key Vault при их изменении, необходимо включить функцию автоматической смены секретов в драйвере CSI хранилища секретов с аргументом --enable-secret-rotation. Если авторотация включена, драйвер обновляет подключение pod и секрет Kubernetes путем периодического опроса изменений в зависимости от указанного интервала опроса поворота. Интервал опроса поворота по умолчанию составляет две минуты.

Включение интеграции Azure Key Vault

В кластере с включенной надстройкой маршрутизации приложений используйте az aks approuting update команду с помощью --enable-kv--attach-kv аргументов, чтобы включить поставщик Azure Key Vault для драйвера CSI Хранилища секретов и применить необходимые назначения ролей.

Azure Key Vault предлагает две системы авторизации: управление доступом на основе ролей Azure (Azure RBAC), которая работает на плоскости управления, а также модель политики доступа, которая работает как на плоскости управления, так и на плоскости данных. Операция --attach-kv выберет соответствующую модель доступа для использования.

Примечание.

Команда az aks approuting update --attach-kv использует разрешения пользователя, выполняющего команду, для создания назначения роли Azure Key Vault. Эта роль назначается управляемому удостоверению надстройки. Дополнительные сведения об управляемых удостоверениях AKS см. в сводке управляемых удостоверений.

Получите идентификатор ресурса Azure Key Vault.

KEYVAULTID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)

Затем обновите надстройку маршрутизации приложений, чтобы включить драйвер CSI хранилища секретов Azure Key Vault и применить назначение роли.

az aks approuting update -g <ResourceGroupName> -n <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

Включение интеграции Azure DNS

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

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

Создание общедоступной зоны Azure DNS

Примечание.

Если у вас уже есть зона Azure DNS, можно пропустить этот шаг.

  1. Создайте зону Azure DNS с помощью az network dns zone create команды.

    az network dns zone create -g <ResourceGroupName> -n <ZoneName>
    

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

Примечание.

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

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

    ZONEID=$(az network dns zone show -g <ResourceGroupName> -n <ZoneName> --query "id" --output tsv)
    
  2. Обновите надстройку, чтобы включить интеграцию с Azure DNS с помощью az aks approuting zone команды. Вы можете передать разделенный запятыми список идентификаторов ресурсов зоны DNS.

    az aks approuting zone add -g <ResourceGroupName> -n <ClusterName> --ids=${ZONEID} --attach-zones
    

Создание входящего трафика, использующего имя узла и сертификат из Azure Key Vault

Надстройка маршрутизации приложений создает класс входящего трафика в кластере с именем webapprouting.kubernetes.azure.com. При создании объекта Ingress с этим классом он активирует надстройку.

  1. URI сертификата для использования в ingress из Azure Key Vault с помощью az keyvault certificate show команды.

    az keyvault certificate show --vault-name <KeyVaultName> -n <KeyVaultCertificateName> --query "id" --output tsv
    

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

    https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
    
  2. Скопируйте следующий манифест YAML в новый файл с именем ingress.yaml и сохраните его на локальном компьютере.

    Обновите <Hostname> имя узла DNS и <KeyVaultCertificateUri> URI, возвращенный командой, чтобы запросить Azure Key Vault на шаге 1 выше. Строковое значение *<KeyVaultCertificateUri>* для должно включать https://yourkeyvault.vault.azure.net/certificates/certnameтолько . Версия сертификата в конце строки URI должна быть опущена, чтобы получить текущую версию.

    Ключ secretName в tls разделе определяет имя секрета, содержащего сертификат для этого ресурса входящего трафика. Этот сертификат отображается в браузере, когда клиент переходит по URL-адресу, указанному <Hostname> в ключе. Убедитесь, что значение secretName равно keyvault- значению имени ресурса входящего трафика (from metadata.name). В примере YAML secretName должно быть равно keyvault-<your Ingress name>.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.azure.com/tls-cert-keyvault-uri: <KeyVaultCertificateUri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <Hostname>
        secretName: keyvault-<your ingress name>
    
  3. Создайте ресурсы кластера с помощью 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   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

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

Узнайте о мониторинге метрик контроллера Ingress-nginx, включенных в надстройку маршрутизации приложений с помощью Prometheus в Grafana в рамках анализа производительности и использования приложения.