Instalación de AGIC usando una implementación de Application Gateway existente
El controlador de entrada de Application Gateway (AGIC) es un pod dentro del clúster de Azure Kubernetes Service (AKS). AGIC supervisa los recursos de entrada de Kubernetes. Crea y aplica una configuración de Azure Application Gateway basada en el estado del clúster de Kubernetes.
Sugerencia
Considere Puerta de enlace de aplicaciones para contenedores como solución de entrada de Kubernetes. Para más información, consulte Inicio rápido: Implementación de controlador de ALB para Puerta de enlace de aplicaciones para contenedores.
Requisitos previos
Este artículo asume que usted ya ha instalado las siguientes herramientas e infraestructura:
- Un clúster de AKS con Azure Container Networking Interface (CNI).
- Application Gateway v2 en la misma red virtual que el clúster de AKS.
- Id. de carga de trabajo de Microsoft Entra configurado para su clúster de AKS.
- Azure Cloud Shell como el entorno de shell de Azure, que tiene
az
(CLI de Azure),kubectl
yhelm
instalados. Estas herramientas son necesarias para los comandos compatibles con la configuración de esta implementación.
Adición del repositorio de Helm
Helm es un administrador de paquetes para Kubernetes. Se usa para instalar el paquete application-gateway-kubernetes-ingress
.
Si usa Cloud Shell, no es necesario instalar Helm. Cloud Shell viene con la versión 3 de Helm. Ejecute los siguientes comandos para agregar el repositorio de AGIC Helm para un clúster de AKS habilitado con el control de acceso basado en roles (RBAC) de 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
Hacer una copia de seguridad de la implementación de Application Gateway
Antes de instalar AGIC, haga una copia de seguridad de la configuración de su implementación de Application Gateway:
- En Azure Portal, vaya a su implementación de Application Gateway.
- En la sección Automatización, seleccione Exportar plantilla y después seleccione Descargar.
El archivo .zip descargado contiene plantillas JSON, scripts de Bash y scripts de PowerShell que puede usar para restaurar Application Gateway, en caso de que sea necesaria una restauración.
Configuración de una identidad para la autenticación de Resource Manager
AGIC se comunica con el servidor de API de Kubernetes y con Azure Resource Manager. Una identidad es necesaria para acceder a estas API. Puede usar el Id. de carga de trabajo de Microsoft Entra o una entidad de servicio.
Configurar un id. de carga de trabajo de Microsoft Entra
Id. de carga de trabajo de Microsoft Entra es una identidad que se asigna a una carga de trabajo de software. Esta identidad habilita su pod de AKS para autenticarse con otros recursos de Azure.
Para esta configuración, necesita autorización para que el módulo de AGIC realice solicitudes HTTP a Azure Resource Manager.
Use el comando az account set de la CLI de Azure para que una suscripción específica se establezca como la suscripción activa actual:
az account set --subscription "subscriptionID"
Después, use el comando az identity create para crear una identidad administrada. Debe crear la identidad en el grupo de recursos de nodo. Al grupo de recursos del nodo se le asigna un nombre predeterminado, como
MC_myResourceGroup_myAKSCluster_eastus
.az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
Para la asignación del rol, ejecute el siguiente comando para identificar el valor
principalId
de la identidad recién creada:$resourceGroup="resource-group-name" $identityName="identity-name" az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
Conceda a la identidad acceso de Colaborador a su implementación de Application Gateway. Necesita el id. de la implementación de Application Gateway, que es similar a
/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C
.En primer lugar, ejecute el comando siguiente para obtener la lista de id. de Application Gateway de la suscripción:
az network application-gateway list --query '[].id'
Para asignar acceso al Colaborador de identidad, ejecute el siguiente comando:
$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
Conceda acceso a la identidad de Lector al grupo de recursos de Application Gateway. El id. del grupo de recursos tiene el siguiente aspecto:
/subscriptions/A/resourceGroups/B
. Puede obtener todos los grupos de recursos ejecutandoaz 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
Nota:
Asegúrese de que la identidad que utiliza AGIC tiene el permiso Microsoft.Network/virtualNetworks/subnets/join/action delegado en la subred en la que está implementada Application Gateway. Si no ha definido un rol personalizado que tenga este permiso, puede usar el rol integrado Colaborador de red.
Configuración de una entidad de servicio
También es posible proporcionar acceso a AGIC a Azure Resource Manager usando un secreto de Kubernetes:
Cree una entidad de seguridad de servicio de Active Directory y codifíquela con Base64. La codificación Base64 es necesaria para guardar el blob JSON en Kubernetes.
az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
Agregue el blob JSON codificado en Base64 al archivo
helm-config.yaml
. El archivohelm-config.yaml
configura AGIC.armAuth: type: servicePrincipal secretJSON: <Base64-Encoded-Credentials>
Implementación del complemento AGIC
Creación de un manifiesto de implementación para el controlador de entrada
---
# 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
Implementar el controlador de entrada
$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace
Instalación del controlador de entrada como gráfico de Helm
Use Cloud Shell para instalar el paquete de Helm de AGIC:
Realice una actualización de Helm:
helm repo update
Descargue
helm-config.yaml
:wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
O copie el siguiente archivo 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>
Edite
helm-config.yaml
y rellene los valores deappgw
yarmAuth
.Nota:
<identity-client-id>
es una propiedad del valor de Id. de carga de trabajo de Microsoft Entra que usted estableció en la sección anterior. Puede recuperar esta información ejecutando el siguiente comando:az identity show -g <resourcegroup> -n <identity-name>
. En ese comando,<resourcegroup>
es el grupo de recursos que hospeda los recursos de infraestructura relacionados con el clúster de AKS, Application Gateway y la identidad administrada.Instale los gráficos de Helm con la configuración
helm-config.yaml
del paso anterior:helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
Como alternativa, puede combinar
helm-config.yaml
y el comando de Helm en un paso:helm install oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure \ --name agic-controller \ --version 1.7.5 \ --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
Compruebe el registro del pod recién creado para verificar que se ha iniciado correctamente.
Para comprender cómo puede exponer un servicio AKS a Internet a través de HTTP o HTTPS usando una implementación de Azure Application Gateway, consulte esta guía de instrucciones.
Configuración de una implementación compartida de Application Gateway
De manera predeterminada, AGIC asume la plena propiedad de la implementación de Application Gateway a la que está vinculado. AGIC versión 0.8.0 y posteriores pueden compartir una única implementación de Application Gateway con otros componentes de Azure. Por ejemplo, podría utilizar la misma implementación de Application Gateway para una aplicación hospedada en un conjunto de escalado de máquinas virtuales de Azure y un clúster de AKS.
Escenario de ejemplo
Veamos una implementación imaginaria de Application Gateway que administra el tráfico de dos sitios web:
dev.contoso.com
: hospedado en un nuevo clúster de AKS, mediante Application Gateway y AGIC.prod.contoso.com
: hospedado en un conjunto de escalado de máquinas virtuales.
Con la configuración predeterminada, AGIC asume el 100 % de la propiedad de la implementación de Application Gateway a la que apunta. AGIC sobrescribe toda la configuración de App Gateway. Si crea manualmente un cliente de escucha para prod.contoso.com
en Application Gateway sin definirlo en la entrada de Kubernetes, AGIC elimina la configuración de prod.contoso.com
en cuestión de segundos.
Para instalar AGIC y servir también prod.contoso.com
desde las máquinas que usan el conjunto de escalado de máquinas virtuales, debe restringir AGIC para configurar solo dev.contoso.com
. Para facilitar esta restricción, cree una instancia de la siguiente definición personalizada de recursos (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
El comando anterior crea un objeto AzureIngressProhibitedTarget
. Este objeto hace que AGIC (versión 0.8.0 y posteriores) reconozca la existencia de la configuración de Application Gateway para prod.contoso.com
. Este objeto también instruye explícitamente a AGIC para que evite cambiar cualquier configuración relacionada con ese nombre de host.
Habilitación de una implementación compartida de Application Gateway mediante una nueva instalación de AGIC
Para limitar AGIC (versión 0.8.0 y posteriores) a un subconjunto de la configuración de Application Gateway, modifique la plantilla helm-config.yaml
.
En la sección appgw:
, agregue una clave shared
y establézcala en true
:
appgw:
subscriptionId: <subscriptionId> # existing field
resourceGroup: <resourceGroupName> # existing field
name: <applicationGatewayName> # existing field
shared: true # Add this field to enable shared Application Gateway
Aplique los cambios de Helm:
Asegúrese de que el CRD de
AzureIngressProhibitedTarget
esté instalado:kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
Actualice Helm:
helm upgrade \ --recreate-pods \ -f helm-config.yaml \ agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
Como resultado, el clúster de AKS tiene una nueva instancia de AzureIngressProhibitedTarget
denominada prohibit-all-targets
:
kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml
El objeto prohibit-all-targets
prohíbe a AGIC cambiar la configuración de cualquier host y ruta de acceso. Helm instalado con appgw.shared=true
implementa AGIC, pero no realiza ningún cambio en Application Gateway.
Ampliar permisos
Dado que Helm con appgw.shared=true
y el prohibit-all-targets
predeterminado impide que AGIC aplique una configuración, debe ampliar los permisos de AGIC:
Cree un nuevo archivo YAML llamado
AzureIngressProhibitedTarget
con el siguiente fragmento que contiene su configuración específica: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
Ahora que ha creado su propia prohibición personalizada, puede eliminar la predeterminada, que es demasiado amplia:
kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
Habilitación de una implementación compartida de Application Gateway para una instalación de AGIC existente
Supongamos que ya tiene un clúster de AKS en funcionamiento y una implementación de Application Gateway, y que ha configurado AGIC en su clúster. Tiene una entrada para prod.contoso.com
y atiende correctamente el tráfico desde el clúster.
Quiere agregar staging.contoso.com
a su implementación existente de Application Gateway, pero necesita hospedarla en una máquina virtual. Va a reutilizar la implementación existente de Application Gateway y configurar manualmente un grupo de escucha y back-end para staging.contoso.com
. Sin embargo, ajustar manualmente la configuración de Application Gateway (mediante el uso de Azure Portal, API de Resource Manager o Terraform) entraría en conflicto con las suposiciones de propiedad total de AGIC. Poco después de aplicar los cambios, AGIC los sobrescribe o elimina.
Puede prohibir a AGIC que realice cambios en un subconjunto de la configuración:
Cree un nuevo archivo YAML llamado
AzureIngressProhibitedTarget
usando el siguiente fragmento de código: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
Revise el objeto recién creado:
kubectl get AzureIngressProhibitedTargets
Modifique la configuración de Application Gateway desde Azure Portal. Por ejemplo, agregue clientes de escucha, reglas de enrutamiento y back-ends. El nuevo objeto que creó (
manually-configured-staging-environment
) prohíbe a AGIC sobrescribir la configuración de Application Gateway relacionada constaging.contoso.com
.