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


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