Установка контроллера объекта ingress Шлюза приложений (AGIC) с помощью нового Шлюза приложений
В приведенных ниже инструкциях предполагается, что контроллер объекта ingress Шлюза приложений (AGIC) будет установлен в среде, где еще нет никаких компонентов.
Совет
См. также раздел "Что такое Шлюз приложений для контейнеров".
Необходимые средства командной строки
Для всех приведенных ниже операций командной строки рекомендуется использовать Azure Cloud Shell. Запустите оболочку из shell.azure.com или по ссылке.
Кроме того, можно запустить Cloud Shell с портала Azure с помощью следующего значка:
В Azure Cloud Shell уже есть все необходимые средства и инструменты. Если вы решили использовать другую среду, убедитесь, что установлены следующие средства командной строки:
az
— Azure CLI: ознакомьтесь с инструкциями по установкеkubectl
— средство командной строки Kubernetes: инструкции по установкеhelm
— диспетчер пакетов Kubernetes: инструкции по установкеjq
— обработчик командной строки JSON: инструкции по установке
Создание удостоверения
Выполните приведенные ниже действия, чтобы создать объект субъекта-службы Microsoft Entra. appId
Запишите значения password
и objectId
значения. Эти значения будут использоваться в следующих шагах.
Создайте субъект-службу 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 понадобятся вам на следующих шагах.Используйте
appId
из выходных данных предыдущей команды, чтобы получитьid
нового субъекта-службы:objectId=$(az ad sp show --id $appId --query "id" -o tsv)
Эта команда возвращает значение
objectId
, которое будет использоваться в шаблоне Azure Resource Manager ниже.Создайте файл параметров, который будет использоваться в развертывании шаблона Azure Resource Manager позже.
cat <<EOF > parameters.json { "aksServicePrincipalAppId": { "value": "$appId" }, "aksServicePrincipalClientSecret": { "value": "$password" }, "aksServicePrincipalObjectId": { "value": "$objectId" }, "aksEnableRBAC": { "value": false } } EOF
Чтобы развернуть кластер с поддержкой Kubernetes RBAC, задайте для поля
aksEnableRBAC
значениеtrue
.
Развертывание компонентов
На этом шаге в подписку будут добавлены следующие компоненты:
- Служба Azure Kubernetes
- Шлюз приложений версии 2
- виртуальная сеть с двумя подсетями
- Общедоступный IP-адрес
- Управляемое удостоверение, которое будет использоваться удостоверением Microsoft Entra Pod
Скачайте шаблон Azure Resource Manager и при необходимости измените его.
wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/deploy/azuredeploy.json -O template.json
Разверните шаблон 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
После завершения развертывания скачайте его выходные данные в файл
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:
- определения пользовательских ресурсов Kubernetes:
AzureIdentity
,AzureAssignedIdentity
,AzureIdentityBinding
; - компонент Контроллер управляемых удостоверений (MIC);
- компонент Node Managed Identity (NMI).
Чтобы установить удостоверение 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.
Установите 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
Добавьте репозиторий Helm AGIC:
helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/ helm repo update
Установка диаграммы Helm контроллера входящего трафика
Используйте созданный выше файл
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)
Загрузите файл 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>
Отредактируйте только что скачанный файл 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
.Установите пакет контроллера входящего трафика Шлюза приложений:
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 с помощью Шлюза приложений.