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


Установите AGIC (Azure Gateway Ingress Controller) с помощью существующего развертывания Application Gateway (Шлюз приложений).

Контроллер входящего трафика шлюза приложений (AGIC) — это "pod" внутри вашего кластера Службы Kubernetes Azure (AKS). AGIC отслеживает ресурсы Ingress Kubernetes. Он создает и применяет конфигурацию Шлюз приложений Azure на основе состояния кластера Kubernetes.

Совет

Рассмотрите Шлюз приложений для контейнеров в качестве решения для входа в Kubernetes. Дополнительные сведения см. в разделе Краткое руководство: развертывание Шлюза приложений для контроллера контейнеров ALB.

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

В этой статье предполагается, что вы уже установили следующие средства и инфраструктуру:

Добавьте репозиторий 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 создайте резервную копию конфигурации Шлюз приложений развертывания:

  1. В портал Azure перейдите к развертыванию шлюза приложений.
  2. В разделе "Автоматизация" выберите "Экспорт шаблона" и нажмите кнопку "Скачать".

Скачанный .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.

  1. Используйте команду 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"
    
  2. Для назначения роли выполните следующую команду, чтобы определить principalId значение для созданного удостоверения:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Предоставьте доступ к вашему развертыванию шлюза приложений для роли 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
    
  4. Предоставьте учетной записи 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:

  1. Создайте субъект-службу Active Directory и закодируйте его с помощью Base64. Кодировка Base64 необходима для сохранения большого двоичного объекта JSON в Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Добавьте большой двоичный объект 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:

  1. Проведите обновление Helm:

    helm repo update
    
  2. Скачать 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>
    
  3. Измените helm-config.yaml и заполните значения для appgw и armAuth.

    Примечание.

    <identity-client-id>— это свойство значения Идентификация рабочей нагрузки Microsoft Entra, настроенного в предыдущем разделе. Эти сведения можно получить, выполнив следующую команду: az identity show -g <resourcegroup> -n <identity-name> В этой команде <resourcegroup> используется группа ресурсов, в которой размещаются ресурсы инфраструктуры, связанные с кластером AKS, Шлюз приложений и управляемым удостоверением.

  4. Установите диаграмму 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
    
  5. Проверьте журнал только что созданного модуля 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:

  1. Убедитесь, что AzureIngressProhibitedTarget CRD установлен.

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. Обновите 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:

  1. Создайте файл 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
    
  2. Теперь, когда вы создали собственный пользовательский запрет, вы можете удалить стандартный, который слишком широк.

    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 вносить изменения в подмножество конфигурации:

  1. Создайте файл 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
    
  2. Просмотрите вновь созданный объект:

    kubectl get AzureIngressProhibitedTargets
    
  3. Измените конфигурацию Шлюза Приложений из портала Azure. Например, добавьте прослушиватели, правила маршрутизации и бекенды. Созданный вами объект (manually-configured-staging-environment) запрещает AGIC перезаписывать конфигурацию, относящуюся к Шлюзу приложений staging.contoso.com.