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


Настройка имени личного домена и SSL-сертификата с помощью надстройки маршрутизации приложений для службы Azure Kubernetes (AKS)

В этой статье показано, как настроить пользовательские доменные имена и СЕРТИФИКАТЫ SSL/TLS для входящего трафика AKS с помощью Azure Key Vault и Azure DNS с надстройкой маршрутизации приложений для AKS.

Предварительные условия

  • Кластер AKS с надстройкой маршрутизации приложений.

  • Azure Key Vault, если вы хотите настроить завершение SSL и сохранить сертификаты в хранилище, размещенном в Azure. Если у вас его нет, см. статью "Создание хранилища ключей" с помощью Azure CLI.

  • Чтобы включить поддержку трафика HTTPS, требуется SSL-сертификат. Если у вас его нет, см. статью о создании сертификата.

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

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

Требуемые разрешения Azure

Для вашей учетной записи пользователя требуется: роль владельца, администратора учетной записи Azure, или соадминистратора Azure в рамках подписки Azure.

Что делают команды: Когда вы запускаете az aks approuting update --attach-kv или az aks approuting zone add --attach-zones, эти команды используют ваши разрешения на назначение ролей для автоматического предоставления управляемому удостоверению надстройки маршрутизации приложений следующих ролей:

  • Роль пользователя сертификата Key Vault в Azure Key Vault (для доступа к сертификатам).
  • Роль участника зоны DNS в зонах Azure DNS (для управления записями DNS).

Дополнительные сведения о удостоверениях AKS см. в Сводке об управляемых удостоверениях.

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

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

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

    # Set environment variables for your resource group and cluster name
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS cluster credentials
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

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

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

Внимание

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

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

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

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

Импорт самозаверяющего SSL-сертификата в Azure Key Vault

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

    # Set environment variables for your key vault name and certificate name
    export KEY_VAULT_NAME=<key-vault-name>
    export KEY_VAULT_CERT_NAME=<key-vault-certificate-name>
    
    # Import the SSL certificate into Azure Key Vault
    az keyvault certificate import --vault-name $KEY_VAULT_NAME --name $KEY_VAULT_CERT_NAME --file aks-ingress-tls.pfx [--password <certificate password if specified>]
    

Примечание.

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

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

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

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

    KEY_VAULT_ID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)
    
  2. Обновите надстройку маршрутизации приложений для активации поставщика Azure Key Vault в драйвере CSI хранилища секретов и примените необходимые назначения ролей, используя команду az aks approuting update с аргументами --enable-kv и --attach-kv.

    az aks approuting update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-kv --attach-kv ${KEY_VAULT_ID}
    

Создание глобальной зоны Azure DNS

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

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

    # Set environment variables for your resource group and DNS zone name
    export RESOURCE_GROUP=<resource-group-name>
    export ZONE_NAME=<zone-name>
    
    # Create the Azure DNS zone
    az network dns zone create --resource-group $RESOURCE_GROUP --name $ZONE_NAME
    

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

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

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

    az aks approuting zone add --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --ids=${ZONE_ID} --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 $KEY_VAULT_NAME --name $KEY_VAULT_CERT_NAME --query "id" --output tsv
    

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

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

    Обновите <host-name> с именем вашего DNS хоста и <key-vault-certificate-uri> с URI, возвращенным предыдущей командой. Строковое значение для <key-vault-certificate-uri> должно включать только https://yourkeyvault.vault.azure.net/certificates/certname. Удалите версию сертификата в конце строки URI, чтобы получить текущую версию.

    Ключ secretName в разделе tls определяет имя секрета, содержащего сертификат для этого ресурса Ingress. Этот сертификат отображается в браузере, когда клиент переходит по URL-адресу, указанному <host-name> в ключе. Убедитесь, что значение 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: <key-vault-certificate-uri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <host-name>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <host-name>
        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 в рамках анализа производительности и использования приложения.