Установка AGIC с помощью существующего развертывания Шлюз приложений
Контроллер Шлюз приложений входящего трафика (AGIC) — это модуль pod в кластере Служба Azure Kubernetes (AKS). AGIC отслеживает ресурсы Входящего трафика 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
Предоставьте участнику удостоверений доступ к развертыванию Шлюз приложений. Вам нужен идентификатор развертывания Шлюз приложений, который выглядит следующим
/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C
образом.Сначала получите список идентификаторов Шлюз приложений в подписке, выполнив следующую команду:
az network application-gateway list --query '[].id'
Чтобы назначить доступ участника удостоверений, выполните следующую команду:
$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
Предоставьте читателю удостоверений доступ к группе ресурсов Шлюз приложений. Идентификатор группы ресурсов выглядит следующим образом
/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.0 -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.0 \ --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
с компьютеров, использующих масштабируемый набор виртуальных машин, необходимо ограничить только настройку dev.contoso.com
AGIC. Это ограничение упрощается путем создания экземпляра следующего пользовательского определения ресурсов (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:
Убедитесь, что
AzureIngressProhibitedTarget
crD установлен: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
и по умолчанию блокирует применение agIC конфигурации prohibit-all-targets
, необходимо расширить разрешения 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 и развертывание Шлюз приложений, и вы настроили AGIC в кластере. У вас есть входящий prod.contoso.com
трафик и он успешно обслуживается из кластера.
Вы хотите добавить staging.contoso.com
в существующее Шлюз приложений развертывание, но его необходимо разместить на виртуальной машине. Вы будете повторно использовать существующее развертывание Шлюз приложений и вручную настроить прослушиватель и серверные пулыstaging.contoso.com
. Но настройка конфигурации Шлюз приложений вручную (с помощью портал Azure, API Resource Manager или 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
.