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


Установите AGIC с помощью нового развертывания Application Gateway

Инструкции в этой статье предполагают, что вы хотите установить контроллер доступа через шлюз приложений (AGIC) в среде, где отсутствуют ранее существовавшие компоненты.

Tip

Рассмотрите возможность использования Application Gateway for Containers в качестве решения для входящего трафика в Kubernetes. Для получения дополнительной информации см. Быстрый старт: Развертывание Application Gateway для контейнеров с контроллером ALB.

Установите необходимые инструменты командной строки

Мы рекомендуем использовать Azure Cloud Shell для всех операций командной строки в этой статье. Вы можете открыть Cloud Shell, выбрав кнопку Запуск Cloud Shell.

В качестве альтернативы, откройте Cloud Shell с портала Azure, выбрав его значок.

Значок Azure PowerShell в портале

В вашей Cloud Shell уже есть все необходимые инструменты. Если вы решите использовать другую среду, убедитесь, что установлены следующие инструменты командной строки:

Создать идентичность

Используйте следующие шаги, чтобы создать объект сервисного принципала Microsoft Entra.

  1. Создайте основного пользователя службы Active Directory, который включает роль контроля доступа на основе ролей Azure (RBAC):

    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/mySubscriptionID -o json > auth.json
    appId=$(jq -r ".appId" auth.json)
    password=$(jq -r ".password" auth.json)
    

    Запишите значения appId и password из JSON-выходных данных. Вы будете использовать их на следующих этапах.

  2. Используйте значение appId из вывода предыдущей команды, чтобы получить id нового основного служебного объекта.

    objectId=$(az ad sp show --id $appId --query "id" -o tsv)
    

    Выходные данные этой команды — objectId. Запишите это значение, так как оно понадобится на следующем этапе.

  3. Создайте файл параметров, который вы будете использовать для развертывания в шаблоне диспетчера ресурсов Azure (шаблон ARM).

    cat <<EOF > parameters.json
    {
      "aksServicePrincipalAppId": { "value": "$appId" },
      "aksServicePrincipalClientSecret": { "value": "$password" },
      "aksServicePrincipalObjectId": { "value": "$objectId" },
      "aksEnableRBAC": { "value": false }
    }
    EOF
    

    Чтобы развернуть кластер с поддержкой RBAC для Kubernetes, установите aksEnableRBAC на true.

Развернуть компоненты

Указанная ниже процедура добавляет эти компоненты к вашей подписке:

Для развертывания компонентов:

  1. Скачать шаблон ARM:

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/deploy/azuredeploy.json -O template.json
    
  2. Разверните шаблон ARM с помощью Azure CLI и при необходимости измените его. Развертывание может занять до 5 минут.

    resourceGroupName="MyResourceGroup"
    location="westus2"
    deploymentName="ingress-appgw"
    
    # create a resource group
    az group create -n $resourceGroupName -l $location
    
    # modify the template as needed
    az deployment group create \
            -g $resourceGroupName \
            -n $deploymentName \
            --template-file template.json \
            --parameters parameters.json
    
  3. После завершения развертывания загрузите результат развертывания в файл с именем deployment-outputs.json:

    az deployment group show -g $resourceGroupName -n $deploymentName --query "properties.outputs" -o json > deployment-outputs.json
    

Настройте AGIC

Используя инструкции из предыдущего раздела, вы создали и настроили новый кластер AKS и развертывание Application Gateway. Теперь вы готовы развернуть пример приложения и контроллер входящих подключений в вашей новой инфраструктуре Kubernetes.

Настройте учетные данные Kubernetes

Для следующих шагов вам необходимо настроить команду kubectl, которую вы будете использовать для подключения к вашему новому кластеру Kubernetes. В Cloud Shell уже установлено kubectl. Вы будете использовать az (Azure CLI), чтобы получить учетные данные для Kubernetes.

Получите учетные данные для вашего недавно развернутого экземпляра AKS. Для получения дополнительной информации о следующих командах смотрите Использование Azure RBAC для авторизации Kubernetes с помощью kubectl.

# use the deployment-outputs.json file created after deployment to get the cluster name and resource group name
aksClusterName=$(jq -r ".aksClusterName.value" deployment-outputs.json)
resourceGroupName=$(jq -r ".resourceGroupName.value" deployment-outputs.json)

az aks get-credentials --resource-group $resourceGroupName --name $aksClusterName

Установите Microsoft Entra Pod Identity

Microsoft Entra Pod Identity предоставляет доступ на основе токенов к Azure Resource Manager.

Microsoft Entra Pod Identity добавляет следующие компоненты в ваш кластер Kubernetes:

Чтобы установить Microsoft Entra Pod Identity в ваш кластер, используйте одну из следующих команд:

  • Kubernetes RBAC-enabled AKS cluster:

    kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment-rbac.yaml
    
  • Кластер AKS Kubernetes с отключённым RBAC:

    kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment.yaml
    

Добавить репозиторий Helm

Helm — это менеджер пакетов для Kubernetes. Вы используете это для установки пакета application-gateway-kubernetes-ingress.

Если вы используете Cloud Shell, вам не нужно устанавливать Helm. Cloud Shell поставляется с Helm версии 3. Выполните одну из следующих команд, чтобы добавить репозиторий AGIC Helm:

  • Кластер AKS с включенной функцией RBAC Kubernetes

    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
    
  • Кластер AKS Kubernetes с отключённым RBAC:

    helm init
    

Установите Helm-чарт для контроллера входа

  1. Use the deployment-outputs.json file that you created earlier to create the following variables:

    applicationGatewayName=$(jq -r ".applicationGatewayName.value" deployment-outputs.json)
    resourceGroupName=$(jq -r ".resourceGroupName.value" deployment-outputs.json)
    subscriptionId=$(jq -r ".subscriptionId.value" deployment-outputs.json)
    identityClientId=$(jq -r ".identityClientId.value" deployment-outputs.json)
    identityResourceId=$(jq -r ".identityResourceId.value" deployment-outputs.json)
    
  2. Загрузите helm-config.yaml, который настраивает AGIC:

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
    

    Or copy the following YAML file:

    # 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 will manage
    #
    appgw:
        subscriptionId: <subscriptionId>
        resourceGroup: <resourceGroupName>
        name: <applicationGatewayName>
    
        # Setting appgw.shared to "true" will create 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 will 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: AAD-Pod-Identity (https://github.com/Azure/aad-pod-identity)
    armAuth:
        type: aadPodIdentity
        identityResourceID: <identityResourceId>
        identityClientID:  <identityClientId>
    
    ## Alternatively you can use Service Principal credentials
    # armAuth:
    #    type: servicePrincipal
    #    secretJSON: <<Generate this value with: "az ad sp create-for-rbac --subscription <subscription-uuid> --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.

    sed -i "s|<subscriptionId>|${subscriptionId}|g" helm-config.yaml
    sed -i "s|<resourceGroupName>|${resourceGroupName}|g" helm-config.yaml
    sed -i "s|<applicationGatewayName>|${applicationGatewayName}|g" helm-config.yaml
    sed -i "s|<identityResourceId>|${identityResourceId}|g" helm-config.yaml
    sed -i "s|<identityClientId>|${identityClientId}|g" helm-config.yaml
    

    Note

    If you're deploying to a sovereign cloud (for example, Azure Government), you must add the appgw.environment configuration parameter and set it to the appropriate value.

    Вот значения:

    • verbosityLevel: Устанавливает уровень детализации для инфраструктуры ведения журналов AGIC. Для возможных значений смотрите Уровни ведения журнала.
    • appgw.environment: Sets the cloud environment. Возможные значения: AZURECHINACLOUD, AZUREGERMANCLOUD, AZUREPUBLICCLOUD, AZUREUSGOVERNMENTCLOUD.
    • appgw.subscriptionId: Идентификатор подписки в Azure, в которой находится Application Gateway. Пример: aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e.
    • appgw.resourceGroup: Название группы ресурсов Azure, в которой вы создали развертывание шлюза приложений. Пример: app-gw-resource-group.
    • appgw.name: Название развертывания Application Gateway. Пример: applicationgatewayd0f0.
    • appgw.shared: Булевый флаг, который по умолчанию принимает значение false. Установите это на true, если вам требуется совместное развертывание Application Gateway.
    • kubernetes.watchNamespace: Указывает пространство имен, которое AGIC должен отслеживать. Значение пространства имен может быть одной строкой или списком пространств имен, разделенных запятыми.
    • armAuth.type: Может быть aadPodIdentity или servicePrincipal.
    • armAuth.identityResourceID: Идентификатор ресурса управляемой идентификации Azure.
    • armAuth.identityClientID: ID клиента идентификационной записи.
    • armAuth.secretJSON: Требуется только в случае, если вы выбираете Service Principal в качестве типа секрета (то есть, когда вы устанавливаете armAuth.type на servicePrincipal).

    Заметка

    Вы создали значения identityResourceID и identityClientID на предыдущих этапах для развертывания компонентов. Вы можете получить их снова, используя следующую команду:

    az identity show -g <resource-group> -n <identity-name>
    

    В команде <resource-group> выступает в качестве группы ресурсов для развертывания вашего шлюза приложений. Заполнитель <identity-name> - это имя созданной учетной записи. Вы можете перечислить все идентичности для конкретной подписки, используя az identity list.

  4. Установите пакет AGIC:

    helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.8.1 -f helm-config.yaml
    

Установить примерное приложение

Теперь, когда у вас установлены Application Gateway, AKS и AGIC, вы можете установить пример приложения через Azure Cloud Shell:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: aspnetapp
  labels:
    app: aspnetapp
spec:
  containers:
  - image: "mcr.microsoft.com/dotnet/samples:aspnetapp"
    name: aspnetapp-image
    ports:
    - containerPort: 8080
      protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: aspnetapp
spec:
  selector:
    app: aspnetapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aspnetapp
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: aspnetapp
            port:
              number: 80
        pathType: Exact
EOF

В качестве альтернативы вы можете:

  • Загрузите предыдущий файл YAML:

    curl https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml -o aspnetapp.yaml
    
  • Примените файл YAML:

    kubectl apply -f aspnetapp.yaml
    
  • Для получения дополнительных примеров того, как открыть доступ к службе AKS в интернет через HTTP или HTTPS с помощью Application Gateway, см. это руководство.
  • Для получения информации о шлюзе приложений для контейнеров см. эту обзорную статью.