Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Контроллер входящего трафика шлюза приложений (AGIC) — это "pod" внутри вашего кластера Службы Kubernetes Azure (AKS). AGIC отслеживает ресурсы Ingress Kubernetes. Он создает и применяет конфигурацию Шлюз приложений Azure на основе состояния кластера Kubernetes.
Совет
Рассмотрите Шлюз приложений для контейнеров в качестве решения для входа в Kubernetes. Дополнительные сведения см. в разделе Краткое руководство: развертывание Шлюза приложений для контроллера контейнеров ALB.
Предварительные условия
В этой статье предполагается, что вы уже установили следующие средства и инфраструктуру:
- Кластер AKS с сетевым интерфейсом контейнеров Azure (CNI).
- Шлюз приложений версии 2 в той же виртуальной сети, что и кластер AKS.
- Идентификатор рабочей нагрузки Microsoft Entra настроен для вашего кластера AKS.
-
Azure Cloud Shell в качестве среды Azure Shell , которая имеет
az(Azure CLI)kubectlиhelmустановлена. Эти средства необходимы для команд, поддерживающих настройку этого развертывания.
Добавьте репозиторий Helm.
Helm — это менеджер пакетов для Kubernetes. Вы используете его для установки application-gateway-kubernetes-ingress пакета.
Если вы используете Cloud Shell, вам не нужно устанавливать Helm. Cloud Shell поставляется с Helm версии 3. Выполните следующие команды, чтобы добавить репозиторий AGIC Helm для кластера AKS, который включен с помощью управления доступом на основе ролей Kubernetes (RBAC):
kubectl create serviceaccount --namespace kube-system tiller-sa
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller-sa
helm init --tiller-namespace kube-system --service-account tiller-sa
Резервное копирование развертывания шлюза приложений
Перед установкой AGIC создайте резервную копию конфигурации Шлюз приложений развертывания:
- В портал Azure перейдите к развертыванию шлюза приложений.
- В разделе "Автоматизация" выберите "Экспорт шаблона" и нажмите кнопку "Скачать".
Скачанный .zip файл содержит шаблоны JSON, скрипты Bash и скрипты PowerShell, которые можно использовать для восстановления Шлюз приложений, если восстановление станет необходимым.
Настройка идентификатора для аутентификации в Resource Manager
AGIC взаимодействует с сервером API Kubernetes и Azure Resource Manager. Для доступа к этим API-интерфейсам ему необходимо удостоверение. Можно использовать идентификатор нагрузки Microsoft Entra или учетную запись службы.
Настройка Идентификация рабочей нагрузки Microsoft Entra
Идентификация рабочей нагрузки Microsoft Entra — это удостоверение, которое назначается рабочей нагрузке программного обеспечения. Это удостоверение позволяет модулем pod AKS проходить проверку подлинности с помощью других ресурсов Azure.
Для этой конфигурации требуется авторизация pod AGIC для выполнения HTTP-запросов к Azure Resource Manager.
Используйте команду Azure CLI az account set , чтобы задать определенную подписку для текущей активной подписки:
az account set --subscription "subscriptionID"Затем используйте команду az identity create для создания управляемого удостоверения. Необходимо создать удостоверение в группе ресурсов узла. Группе ресурсов узла по умолчанию присваивается имя, например
MC_myResourceGroup_myAKSCluster_eastus.az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"Для назначения роли выполните следующую команду, чтобы определить
principalIdзначение для созданного удостоверения:$resourceGroup="resource-group-name" $identityName="identity-name" az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsvПредоставьте доступ к вашему развертыванию шлюза приложений для роли Contributor. Вам нужен идентификатор развертывания Шлюз приложений, который выглядит следующим
/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/Cобразом.Сначала получите список идентификаторов Шлюз приложений в подписке, выполнив следующую команду:
az network application-gateway list --query '[].id'Чтобы назначить доступ с ролью Contributor, выполните следующую команду:
$resourceGroup="resource-group-name" $identityName="identity-Name" # Get the Application Gateway ID $AppGatewayID=$(az network application-gateway list --query '[].id' -o tsv) $role="contributor" # Get the principal ID for the user-assigned identity $principalId=$(az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv) az role assignment create --assignee $principalId --role $role --scope $AppGatewayIDПредоставьте учетной записи Reader доступ к группе ресурсов шлюза приложений. Идентификатор группы ресурсов выглядит следующим образом
/subscriptions/A/resourceGroups/B. Вы можете получить все группы ресурсов, выполнив командуaz group list --query '[].id'.$resourceGroup="resource-group-name" $identityName="identity-Name" # Get the Application Gateway resource group $AppGatewayResourceGroup=$(az network application-gateway list --query '[].resourceGroup' -o tsv) # Get the Application Gateway resource group ID $AppGatewayResourceGroupID=$(az group show --name $AppGatewayResourceGroup --query id -o tsv) $role="Reader" # Get the principal ID for the user-assigned identity $principalId=$(az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv) # Assign the Reader role to the user-assigned identity at the resource group scope az role assignment create --role $role --assignee $principalId --scope $AppGatewayResourceGroupID
Примечание.
Убедитесь, что удостоверение, используемое AGIC, имеет соответствующие разрешения. Список разрешений, необходимых для идентификации, можно найти здесь: Настройка инфраструктуры — Разрешения. Если пользовательская роль не определена с необходимыми разрешениями, можно использовать роль участника сети .
Настройка учетной записи службы
Кроме того, можно предоставить доступ к Azure Resource Manager с помощью секрета Kubernetes:
Создайте субъект-службу Active Directory и закодируйте его с помощью Base64. Кодировка Base64 необходима для сохранения большого двоичного объекта JSON в Kubernetes.
az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0Добавьте большой двоичный объект JSON в кодировке Base64 в
helm-config.yamlфайл. Файлhelm-config.yamlнастраивает AGIC.armAuth: type: servicePrincipal secretJSON: <Base64-Encoded-Credentials>
Развертывание надстройки AGIC
Создание манифеста развертывания для контроллера входящего трафика
---
# file: pet-supplies-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pet-supplies-ingress
spec:
ingressClassName: azure-application-gateway
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: store-front
port:
number: 80
- path: /order-service
pathType: Prefix
backend:
service:
name: order-service
port:
number: 3000
- path: /product-service
pathType: Prefix
backend:
service:
name: product-service
port:
number: 3002
Разверните контроллер ingress
$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace
Установка контроллера входящего трафика в виде диаграммы Helm
Используйте оболочку Cloud Shell, чтобы установить пакет AGIC Helm:
Проведите обновление Helm:
helm repo updateСкачать
helm-config.yaml:wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yamlИли скопируйте следующий YAML-файл:
# This file contains the essential configs for the ingress controller helm chart # Verbosity level of the App Gateway Ingress Controller verbosityLevel: 3 ################################################################################ # Specify which application gateway the ingress controller must manage # appgw: subscriptionId: <subscriptionId> resourceGroup: <resourceGroupName> name: <applicationGatewayName> # Setting appgw.shared to "true" creates an AzureIngressProhibitedTarget CRD. # This prohibits AGIC from applying config for any host/path. # Use "kubectl get AzureIngressProhibitedTargets" to view and change this. shared: false ################################################################################ # Specify which kubernetes namespace the ingress controller must watch # Default value is "default" # Leaving this variable out or setting it to blank or empty string would # result in Ingress Controller observing all accessible namespaces. # # kubernetes: # watchNamespace: <namespace> ################################################################################ # Specify the authentication with Azure Resource Manager # # Two authentication methods are available: # - Option 1: Azure-AD-workload-identity armAuth: type: workloadIdentity identityClientID: <identityClientId> ## Alternatively you can use Service Principal credentials # armAuth: # type: servicePrincipal # secretJSON: <<Generate this value with: "az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0" >> ################################################################################ # Specify if the cluster is Kubernetes RBAC enabled or not rbac: enabled: false # true/false # Specify aks cluster related information. THIS IS BEING DEPRECATED. aksClusterConfiguration: apiServerAddress: <aks-api-server-address>Измените
helm-config.yamlи заполните значения дляappgwиarmAuth.Примечание.
<identity-client-id>— это свойство значения Идентификация рабочей нагрузки Microsoft Entra, настроенного в предыдущем разделе. Эти сведения можно получить, выполнив следующую команду:az identity show -g <resourcegroup> -n <identity-name>В этой команде<resourcegroup>используется группа ресурсов, в которой размещаются ресурсы инфраструктуры, связанные с кластером AKS, Шлюз приложений и управляемым удостоверением.Установите диаграмму Helm с
helm-config.yamlконфигурацией на предыдущем шаге:helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.8.1 -f helm-config.yamlКроме того, можно объединить
helm-config.yamlи команду Helm на одном шаге:helm install oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --name agic-controller \ --version 1.8.1 \ --namespace default \ --debug \ --set appgw.name=applicationgatewayABCD \ --set appgw.resourceGroup=your-resource-group \ --set appgw.subscriptionId=subscription-uuid \ --set appgw.shared=false \ --set armAuth.type=servicePrincipal \ --set armAuth.secretJSON=$(az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0) \ --set rbac.enabled=true \ --set verbosityLevel=3 \ --set kubernetes.watchNamespace=default \ --set aksClusterConfiguration.apiServerAddress=aks-abcdefg.hcp.westus2.azmk8s.ioПроверьте журнал только что созданного модуля pod, чтобы убедиться, что он запущен правильно.
Чтобы понять, как открыть доступ к службе AKS в интернете по протоколу HTTP или HTTPS с помощью развертывания Шлюза приложений Azure, см. это руководство.
Настройте совместное развертывание шлюза для приложений
По умолчанию AGIC берет на себя полное управление развертыванием шлюза приложений, с которым он связан. AGIC версии 0.8.0 и более поздних может совместно использоваться одно развертывание Шлюза приложений с другими компонентами Azure. Например, можно использовать то же развертывание Шлюза приложений для приложения, размещенного в наборе масштабируемых виртуальных машин Azure и кластере AKS.
Пример сценария
Рассмотрим воображаемое развертывание шлюза приложений, которое управляет трафиком для двух веб-сайтов.
-
dev.contoso.com: размещено в новом кластере AKS с использованием «Шлюза приложений» и AGIC. -
prod.contoso.com: размещён на масштабируемом наборе виртуальных машин.
По умолчанию AGIC принимает на себя 100% управление развертыванием Шлюза приложений, на который он указывает. AGIC перезаписывает всю конфигурацию шлюза приложений. Если вы вручную создадите прослушиватель для prod.contoso.com на Шлюзе приложений, не указав его во входящем контуре Kubernetes, AGIC удалит prod.contoso.com конфигурацию в течение нескольких секунд.
Чтобы установить AGIC и обслуживать prod.contoso.com с компьютеров, использующих масштабируемый набор виртуальных машин, необходимо ограничить AGIC только конфигурацией dev.contoso.com. Вы упрощаете выполнение этого ограничения путем создания следующего пользовательского определения ресурсов (CRD):
cat <<EOF | kubectl apply -f -
apiVersion: "appgw.ingress.k8s.io/v1"
kind: AzureIngressProhibitedTarget
metadata:
name: prod-contoso-com
spec:
hostname: prod.contoso.com
EOF
Предыдущая команда создает AzureIngressProhibitedTarget объект. Этот объект информирует AGIC (версии 0.8.0 и выше) о существовании конфигурации шлюз приложений для prod.contoso.com. Этот объект также явно указывает AGIC не изменять любую конфигурацию, связанную с этим именем хоста.
Включите развертывание общего Шлюза приложений с использованием новой установки AGIC.
Чтобы ограничить группу доступности (версии 0.8.0 и более поздней) подмножеством конфигурации Шлюз приложений, измените helm-config.yaml шаблон.
В разделе appgw: добавьте ключ shared и задайте для него значение true.
appgw:
subscriptionId: <subscriptionId> # existing field
resourceGroup: <resourceGroupName> # existing field
name: <applicationGatewayName> # existing field
shared: true # Add this field to enable shared Application Gateway
Примените изменения Helm:
Убедитесь, что
AzureIngressProhibitedTargetCRD установлен.kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yamlОбновите Helm:
helm upgrade \ --recreate-pods \ -f helm-config.yaml \ agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
В результате кластер AKS имеет новый экземпляр AzureIngressProhibitedTarget с именем prohibit-all-targets:
kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml
Объект prohibit-all-targets запрещает AGIC изменять конфигурацию для любого узла и пути. Helm, установленный с помощью appgw.shared=true, развертывает AGIC, но не вносит никаких изменений в Шлюз приложений.
Расширение разрешений
Поскольку Helm с appgw.shared=true и настройки по умолчанию prohibit-all-targets блокируют применение конфигурации AGIC, необходимо расширить разрешения для AGIC:
Создайте файл YAML
AzureIngressProhibitedTargetс именем следующего фрагмента кода, содержащего определенную настройку:cat <<EOF | kubectl apply -f - apiVersion: "appgw.ingress.k8s.io/v1" kind: AzureIngressProhibitedTarget metadata: name: your-custom-prohibitions spec: hostname: your.own-hostname.com EOFТеперь, когда вы создали собственный пользовательский запрет, вы можете удалить стандартный, который слишком широк.
kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
Включение совместного развертывания шлюза приложений для существующей установки AGIC.
Предположим, что у вас уже есть рабочий кластер AKS и развертывание Application Gateway, и вы настроили AGIC в кластере. У вас есть Ingress для prod.contoso.com и он успешно обслуживает трафик из кластера.
Вы хотите добавить staging.contoso.com в существующее развертывание шлюза приложений, но его необходимо разместить на виртуальной машине. Вы будете использовать повторно существующее развертывание шлюза приложений и вручную настроить прослушиватель и серверные пулы staging.contoso.com. Но вручная настройка конфигурации Шлюза приложений (с помощью портала Azure, API диспетчера ресурсов или Terraform) будет конфликтовать с принципами полного владения AGIC. Вскоре после применения изменений AGIC перезаписывает или удаляет их.
Вы можете запретить agIC вносить изменения в подмножество конфигурации:
Создайте файл YAML с именем
AzureIngressProhibitedTargetс помощью следующего фрагмента кода:cat <<EOF | kubectl apply -f - apiVersion: "appgw.ingress.k8s.io/v1" kind: AzureIngressProhibitedTarget metadata: name: manually-configured-staging-environment spec: hostname: staging.contoso.com EOFПросмотрите вновь созданный объект:
kubectl get AzureIngressProhibitedTargetsИзмените конфигурацию Шлюза Приложений из портала Azure. Например, добавьте прослушиватели, правила маршрутизации и бекенды. Созданный вами объект (
manually-configured-staging-environment) запрещает AGIC перезаписывать конфигурацию, относящуюся к Шлюзу приложенийstaging.contoso.com.