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


Установка AGIC с помощью существующего развертывания Шлюз приложений

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

Необходимые компоненты

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

Добавьте репозиторий 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. Предоставьте участнику удостоверений доступ к развертыванию Шлюз приложений. Вам нужен идентификатор развертывания Шлюз приложений, который выглядит следующим /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
    
  4. Предоставьте читателю удостоверений доступ к группе ресурсов Шлюз приложений. Идентификатор группы ресурсов выглядит следующим образом /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.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
    
  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 с компьютеров, использующих масштабируемый набор виртуальных машин, необходимо ограничить только настройку 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:

  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 и по умолчанию блокирует применение agIC конфигурации prohibit-all-targets , необходимо расширить разрешения 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 и развертывание Шлюз приложений, и вы настроили AGIC в кластере. У вас есть входящий prod.contoso.com трафик и он успешно обслуживается из кластера.

Вы хотите добавить staging.contoso.com в существующее Шлюз приложений развертывание, но его необходимо разместить на виртуальной машине. Вы будете повторно использовать существующее развертывание Шлюз приложений и вручную настроить прослушиватель и серверные пулыstaging.contoso.com. Но настройка конфигурации Шлюз приложений вручную (с помощью портал Azure, API Resource Manager или 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.