Установка контроллера объекта ingress Шлюза приложений (AGIC) с помощью нового Шлюза приложений

В приведенных ниже инструкциях предполагается, что контроллер объекта ingress Шлюза приложений (AGIC) будет установлен в среде, где еще нет никаких компонентов.

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

Для всех приведенных ниже операций командной строки рекомендуется использовать Azure Cloud Shell. Запустите оболочку из shell.azure.com или по ссылке.

Кроме того, можно запустить Cloud Shell с портала Azure с помощью следующего значка:

Portal launch

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

Создание удостоверения

Выполните приведенные ниже действия, чтобы создать объект субъекта-службы Microsoft Entra. appIdЗапишите значения passwordи objectId значения. Эти значения будут использоваться в следующих шагах.

  1. Создайте субъект-службу AD (подробнее об 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, которое будет использоваться в шаблоне Azure Resource Manager ниже.

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

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

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

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

На этом шаге в подписку будут добавлены следующие компоненты:

  1. Скачайте шаблон Azure Resource Manager и при необходимости измените его.

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/deploy/azuredeploy.json -O template.json
    
  2. Разверните шаблон Azure Resource Manager с помощью 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
    

Настройка контроллера объекта ingress Шлюза приложений

С помощью инструкций в предыдущем разделе мы создали и настроили новый кластер AKS и Шлюз приложений. Теперь мы готовы развернуть пример приложения и контроллер входящего трафика в новую инфраструктуру Kubernetes.

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

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

Получите учетные данные для развернутых AKS (см. дополнительные сведения):

# use the deployment-outputs.json 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

Установка удостоверений Pod Microsoft Entra

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

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

Чтобы установить удостоверение Microsoft Entra Pod в кластер, выполните следующие действия.

  • Кластер AKS со включенным Kubernetes RBAC

    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. Azure Cloud Shell поставляется с Helm версии 3. Пропустите первый шаг и просто добавьте репозиторий AGIC Helm.

  1. Установите Helm и выполните следующую команду, чтобы добавить пакет Helm application-gateway-kubernetes-ingress:

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

      helm init
      
  2. Добавьте репозиторий Helm AGIC:

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    

Установка диаграммы Helm контроллера входящего трафика

  1. Используйте созданный выше файл deployment-outputs.json и создайте указанные ниже переменные.

    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
    

    Также можно скопировать файл 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 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 acessible 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
    

    Примечание.

    Для развертывания в национальных облаках (например, Azure для государственных организаций)appgw.environmentпараметр конфигурации необходимо добавить и задать соответствующее значение, как описано ниже.

    Значения:

    • verbosityLevel: задает уровень детализации инфраструктуры ведения журнала AGIC. Возможные значения можно найти в разделе Уровни ведения журнала.
    • appgw.environment: задает облачную среду. Возможные значения: AZURECHINACLOUD, AZUREGERMANCLOUD, AZUREPUBLICCLOUD, AZUREUSGOVERNMENTCLOUD
    • appgw.subscriptionId — идентификатор подписки Azure, в которой находится Шлюз приложений. Пример: a123b234-a3b4-557d-b2df-a0bc12de1234
    • appgw.resourceGroup: имя группы ресурсов Azure, в которой был создан Шлюз приложений. Пример: app-gw-resource-group
    • appgw.name: имя Шлюз приложений. Пример: applicationgatewayd0f0
    • appgw.shared: этот логический флаг должен быть по falseумолчанию. Задайте значение true, если вам нужен общий Шлюз приложений.
    • kubernetes.watchNamespace: укажите пространство имен, которое должен отслеживать AGIC. Значение пространства имен может быть одним строковым значением или разделенным запятыми списком пространств имен.
    • armAuth.type: может быть aadPodIdentity или servicePrincipal.
    • armAuth.identityResourceID: идентификатор ресурса управляемого удостоверения Azure.
    • armAuth.identityClientID: идентификатор клиента удостоверения. Дополнительные сведения об identityClientID приведены ниже.
    • armAuth.secretJSON: требуется только при выборе типа секрета субъекта-службы (если для параметра armAuth.type установлено значение servicePrincipal).

    Примечание.

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

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

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

  4. Установите пакет контроллера входящего трафика Шлюза приложений:

    helm install -f helm-config.yaml --generate-name application-gateway-kubernetes-ingress/ingress-azure
    

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

После установки Шлюза приложений, 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 с помощью Шлюза приложений.