Настройка имени личного домена и 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 с надстройкой маршрутизации приложений.
- Azure Key Vault, если вы хотите настроить завершение SSL и сохранить сертификаты в хранилище, размещенном в Azure.
- Azure DNS, если вы хотите настроить глобальное и частное управление зонами и разместить их в Azure.
- Чтобы подключить Azure Key Vault или зону Azure DNS, вам потребуется роль владельца, администратора учетной записи Azure или соадминистратора Azure в подписке Azure.
- Все общедоступные зоны DNS должны находиться в одной подписке и группе ресурсов.
Подключение к кластеру AKS
Чтобы подключиться к кластеру Kubernetes с локального компьютера, используйте kubectl
клиент командной строки Kubernetes. Ее можно установить локально с помощью команды az aks install-cli . Если вы используете Azure Cloud Shell, kubectl
уже установлен.
Настройте kubectl для подключения к кластеру az aks get-credentials
Kubernetes с помощью команды.
az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>
Завершение трафика HTTPS с помощью сертификатов из Azure Key Vault
Чтобы включить поддержку трафика HTTPS, ознакомьтесь со следующими предварительными условиями:
- SSL-сертификат. Если у вас нет сертификата, можно создать сертификат.
Создание 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 имеет надежное партнерство с некоторыми центрами сертификации.
Создайте самозаверяющий 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>"
Экспортируйте 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, ознакомьтесь со следующим предварительным условием:
- Надстройка маршрутизации приложений может быть настроена для автоматического создания записей в одной или нескольких глобальных и частных зонах DNS Azure для узлов, определенных в ресурсах входящего трафика. Все глобальные зоны Azure DNS должны находиться в одной группе ресурсов, а все частные зоны Azure DNS должны находиться в одной группе ресурсов. Если у вас нет зоны Azure DNS, ее можно создать.
Создание общедоступной зоны Azure DNS
Примечание.
Если у вас уже есть зона Azure DNS, можно пропустить этот шаг.
Создайте зону 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 см. в сводке управляемых удостоверений.
Получите идентификатор ресурса для зоны DNS с помощью
az network dns zone show
команды и задайте выходные данные переменной с именем ZONEID.ZONEID=$(az network dns zone show --resource-group <ResourceGroupName> --name <ZoneName> --query "id" --output tsv)
Обновите надстройку, чтобы включить интеграцию с Azure DNS с помощью
az aks approuting zone
команды. Вы можете передать разделенный запятыми список идентификаторов ресурсов зоны DNS.az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
Создание входящего трафика, использующего имя узла и сертификат из Azure Key Vault
Надстройка маршрутизации приложений создает класс входящего трафика в кластере с именем webapprouting.kubernetes.azure.com. При создании объекта Ingress с этим классом он активирует надстройку.
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
Скопируйте следующий манифест 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-
значению имени ресурса входящего трафика (frommetadata.name
). В примере YAMLsecretName
должно быть равно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>
Создайте ресурсы кластера с помощью
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 в рамках анализа производительности и использования приложения.
Azure Kubernetes Service