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


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

Ingress — это объект API, определяющий правила, которые позволяют внешним доступ к службам в кластере Azure Kubernetes Service (AKS). При создании объекта Ingress, использующего классы Ingress для маршрутизации приложений nginx, надстройка создает, настраивает и управляет одним или несколькими Ingress контроллерами в вашем кластере 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 для подключения к вашему кластеру Kubernetes с помощью команды az aks get-credentials.

az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>

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

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

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

Примечание.

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

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

az keyvault create --resource-group <ResourceGroupName> --location <Location> --name <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> --name <KeyVaultCertificateName> --file 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 --resource-group <ResourceGroupName> --name <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

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

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

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

Если у вас нет зоны Azure DNS, ее можно создать.

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

Примечание.

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

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

    az network dns zone create --resource-group <ResourceGroupName> --name <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 --resource-group <ResourceGroupName> --name <ZoneName> --query "id" --output tsv)
    
  2. Обновите надстройку, чтобы включить интеграцию с Azure DNS с помощью az aks approuting zone команды. Вы можете передать разделенный запятыми список идентификаторов ресурсов зоны DNS.

    az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
    

Создать Ingress, использующий имя узла и сертификат из 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> --name <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 определяет имя секрета, содержащего сертификат для этого ресурса Ingress. Этот сертификат отображается в браузере, когда клиент переходит по URL-адресу, указанному <Hostname> в ключе. Убедитесь, что значение secretName равно keyvault-, за которым следует значение имени ресурса Ingress (из 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
    

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

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

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

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

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 в рамках анализа производительности и использования вашего приложения.