Compartir vía


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.

Requisitos previos

Este artículo asume que usted ya ha instalado las siguientes herramientas e infraestructura:

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:

  1. En Azure Portal, vaya a su implementación de Application Gateway.
  2. 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.

  1. 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"
    
  2. 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
    
  3. 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
    
  4. 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 ejecutando 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
    

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:

  1. 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
    
  2. Agregue el blob JSON codificado en Base64 al archivo helm-config.yaml. El archivo helm-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:

  1. Realice una actualización de Helm:

    helm repo update
    
  2. 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>
    
  3. Edite helm-config.yaml y rellene los valores de appgw y armAuth.

    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.

  4. 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
    
  5. 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:

  1. 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
    
  2. 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:

  1. 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
    
  2. 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:

  1. 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
    
  2. Revise el objeto recién creado:

    kubectl get AzureIngressProhibitedTargets
    
  3. 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 con staging.contoso.com.