Delen via


Een Application Gateway-ingangscontroller (AGIC) installeren met behulp van een bestaande Application Gateway

De AGIC (Application Gateway Ingress Controller) is een pod in uw AKS-cluster (Azure Kubernetes Service). AGIC bewaakt de Kubernetes-toegangsbeheerbronnen en maakt en past Application Gateway-configuratie toe op basis van de status van het Kubernetes-cluster.

Overzicht

Vereisten

In dit document wordt ervan uitgegaan dat u al de volgende hulpprogramma's en infrastructuur hebt geïnstalleerd:

Maak een back-up van de configuratie van uw Application Gateway voordat u AGIC installeert:

  1. Navigeer vanuit Azure Portal naar uw Application Gateway-exemplaar.
  2. Selecteer in de sectie Automation de optie Sjabloon Exporteren en selecteer vervolgens Downloaden.

Het zip-bestand dat u hebt gedownload, bevat JSON-sjablonen, bash- en PowerShell-scripts die u kunt gebruiken om App Gateway te herstellen, indien nodig

Helm installeren

Helm is een pakketbeheerder voor Kubernetes, die wordt gebruikt om het application-gateway-kubernetes-ingress pakket te installeren.

Notitie

Als u Cloud Shell gebruikt, hoeft u Helm niet te installeren. Azure Cloud Shell wordt geleverd met Helm versie 3. Sla de eerste stap over en voeg gewoon de AGIC Helm-opslagplaats toe.

  1. Installeer Helm en voer het volgende uit om het Helm-pakket toe te voegen application-gateway-kubernetes-ingress :

    • AKS-cluster met Kubernetes RBAC ingeschakeld
    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
    
  2. Voeg de AGIC Helm-opslagplaats toe:

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

Azure Resource Manager-verificatie

AGIC communiceert met de Kubernetes API-server en de Azure Resource Manager. Er is een identiteit vereist voor toegang tot deze API's.

Microsoft Entra Workload-ID instellen

Microsoft Entra Workload-ID is een identiteit die u toewijst aan een softwareworkload, om andere services en resources te verifiëren en te openen. Met deze identiteit kan uw AKS-pod deze identiteit gebruiken en verifiëren met andere Azure-resources. Voor deze configuratie hebben we autorisatie nodig voor de AGIC-pod om HTTP-aanvragen naar ARM te verzenden.

  1. Gebruik de azure CLI az account set command om een specifiek abonnement in te stellen op het huidige actieve abonnement. Gebruik vervolgens de opdracht az identity create om een beheerde identiteit te maken. De identiteit moet worden gemaakt in de resourcegroep van het knooppunt. De knooppuntresourcegroep krijgt standaard een naam, zoals MC_myResourceGroup_myAKSCluster_eastus.

    az account set --subscription "subscriptionID"
    
    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. Voer voor de roltoewijzing de volgende opdracht uit om de principalId zojuist gemaakte identiteit te identificeren:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Ververleent de inzender van de identiteit toegang tot uw Application Gateway. U hebt de id van de Toepassingsgateway nodig, die er als volgt uitziet: /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C. Haal eerst de lijst met Application Gateway-id's op in uw abonnement door de volgende opdracht uit te voeren:

    az network application-gateway list --query '[].id'
    

    Voer de volgende opdracht uit om de toegang tot inzender voor identiteiten toe te wijzen:

    $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. Verdeel de identiteitslezer toegang tot de Application Gateway-resourcegroep. De resourcegroep-id ziet er als volgt uit: /subscriptions/A/resourceGroups/B. U kunt alle resourcegroepen ophalen met: 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
    

Notitie

Zorg ervoor dat voor de identiteit die door AGIC wordt gebruikt, de machtiging Microsoft.Network/virtualNetworks/subnets/join/action is gedelegeerd aan het subnet waar Application Gateway is geïmplementeerd. Als een aangepaste rol niet is gedefinieerd met deze machtiging, kunt u de ingebouwde rol Inzender voor netwerken gebruiken, die de machtiging Microsoft.Network/virtualNetworks/subnetten/join/action bevat.

Een service-principal gebruiken

Het is ook mogelijk om AGIC-toegang tot ARM te bieden met behulp van een Kubernetes-geheim.

  1. Maak een Active Directory-service-principal en codeer met base64. De base64-codering is vereist voor het opslaan van de JSON-blob in Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Voeg de met Base64 gecodeerde JSON-blob toe aan het helm-config.yaml bestand. Meer informatie vindt helm-config.yaml u in de volgende sectie.

    armAuth:
        type: servicePrincipal
        secretJSON: <Base64-Encoded-Credentials>
    

De Azure-toepassing Gateway Controller-invoegtoepassing voor inkomend verkeer implementeren

Een distributiemanifest voor inkomend verkeercontroller maken

---
# 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

Toegangsbeheerobjectcontroller implementeren

$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace

Toegangsbeheerobjectcontroller installeren als helm-grafiek

In de eerste stappen installeren we Helm's Tiller op uw Kubernetes-cluster. Cloud Shell gebruiken om het AGIC Helm-pakket te installeren:

  1. De application-gateway-kubernetes-ingress Helm-opslagplaats toevoegen en een Helm-update uitvoeren

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. Download helm-config.yaml, waarmee AGIC wordt geconfigureerd:

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

    Of kopieer het volgende YAML-bestand:

    # 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. Bewerk helm-config.yaml en vul de waarden voor appgw en armAuthin.

    Notitie

    Dit <identity-client-id> is een eigenschap van de Microsoft Entra Workload-ID die u in de vorige sectie hebt ingesteld. U kunt deze informatie ophalen door de volgende opdracht uit te voeren: az identity show -g <resourcegroup> -n <identity-name>, waar <resourcegroup> is de resourcegroep die als host fungeert voor de infrastructuurresources die betrekking hebben op het AKS-cluster, Application Gateway en beheerde identiteit.

  4. Helm-grafiek application-gateway-kubernetes-ingress installeren met de helm-config.yaml configuratie uit de vorige stap

    helm install -f <helm-config.yaml> application-gateway-kubernetes-ingress/ingress-azure
    

    U kunt de helm-config.yaml helm-opdracht ook in één stap combineren:

    helm install ./helm/ingress-azure \
         --name ingress-azure \
         --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. Controleer het logboek van de zojuist gemaakte pod om te controleren of deze correct is gestart

Raadpleeg deze handleiding voor meer informatie over hoe u een AKS-service via HTTP of HTTPS beschikbaar kunt maken voor internet met behulp van een Azure-toepassing Gateway.

Gedeelde toepassingsgateway

Standaard wordt ervan uitgegaan dat AGIC volledig eigendom is van de Application Gateway waaraan deze is gekoppeld. AGIC versie 0.8.0 en hoger kan één Application Gateway delen met andere Azure-onderdelen. We kunnen bijvoorbeeld dezelfde Toepassingsgateway gebruiken voor een app die wordt gehost op virtuele-machineschaalset en een AKS-cluster.

Maak een back-up van de configuratie van uw Application Gateway voordat u deze instelling inschakelt:

  1. Navigeer vanuit Azure Portal naar uw Application Gateway exemplaar
  2. Selecteer in de sectie Automation de optie Sjabloon Exporteren en selecteer vervolgens Downloaden.

Het zip-bestand dat u hebt gedownload, bevat JSON-sjablonen, bash- en PowerShell-scripts die u kunt gebruiken om Application Gateway te herstellen

Voorbeeldscenario

Laten we eens kijken naar een imaginaire Application Gateway, waarmee verkeer voor twee websites wordt beheerd:

Bij de standaardinstellingen wordt ervan uitgegaan dat AGIC 100% eigendom is van de Application Gateway waarnaar wordt verwezen. AGIC overschrijft alle configuratie van App Gateway. Als u handmatig een listener voor prod.contoso.com (op Application Gateway) maakt zonder deze te definiëren in het Kubernetes-toegangsbeheerobject, verwijdert AGIC de prod.contoso.com configuratie binnen enkele seconden.

Als u AGIC wilt installeren en ook wilt leveren prod.contoso.com vanaf onze virtuele-machineschaalsetmachines, moeten we AGIC beperken tot alleen configureren dev.contoso.com . Dit wordt mogelijk gemaakt door de volgende CRD te instantiëren:

cat <<EOF | kubectl apply -f -
apiVersion: "appgw.ingress.k8s.io/v1"
kind: AzureIngressProhibitedTarget
metadata:
  name: prod-contoso-com
spec:
  hostname: prod.contoso.com
EOF

Met de bovenstaande opdracht wordt een AzureIngressProhibitedTarget object gemaakt. Hierdoor wordt AGIC (versie 0.8.0 en hoger) op de hoogte gesteld van het bestaan van Application Gateway-configuratie voor prod.contoso.com en expliciet instrueert het om te voorkomen dat configuraties met betrekking tot die hostnaam worden gewijzigd.

Inschakelen met nieuwe AGIC-installatie

Wijzig de helm-config.yaml sjabloon om AGIC (versie 0.8.0 en hoger) te beperken tot een subset van de Application Gateway-configuratie. Voeg onder de appgw: sectie een sleutel toe shared en stel deze in op true.

appgw:
    subscriptionId: <subscriptionId>    # existing field
    resourceGroup: <resourceGroupName>  # existing field
    name: <applicationGatewayName>      # existing field
    shared: true                        # <<<<< Add this field to enable shared Application Gateway >>>>>

Pas de Helm-wijzigingen toe:

  1. Zorg ervoor dat de AzureIngressProhibitedTarget CRD is geïnstalleerd met:

    kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
    
  2. Helm bijwerken:

    helm upgrade \
        --recreate-pods \
        -f helm-config.yaml \
        ingress-azure application-gateway-kubernetes-ingress/ingress-azure
    

Als gevolg hiervan heeft uw AKS-cluster een nieuw exemplaar van AzureIngressProhibitedTarget de aangeroepen prohibit-all-targets:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

Het object prohibit-all-targets, zoals de naam al aangeeft, verbiedt AGIC om de configuratie voor elke host en elk pad te wijzigen. Helm wordt geïnstalleerd met appgw.shared=true AGIC, maar er worden geen wijzigingen aangebracht in Application Gateway.

Machtigingen uitbreiden

Aangezien Helm met appgw.shared=true en de standaardinstelling prohibit-all-targets blokkeert dat AGIC een configuratie toepast, verbreedt u AGIC-machtigingen:

  1. Maak een nieuw YAML-bestand met de naam AzureIngressProhibitedTarget met het volgende fragment met uw specifieke installatie:

    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. Pas nadat u uw eigen aangepaste verbod hebt gemaakt, kunt u de standaardinstelling verwijderen, wat te breed is:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Inschakelen voor een bestaande AGIC-installatie

Stel dat we al een werkend AKS-cluster, Application Gateway en AGIC in ons cluster hebben geconfigureerd. We hebben toegangsbeheerobjecten waarvoor prod.contoso.com het verkeer van het cluster is geslaagd. We willen toevoegen staging.contoso.com aan onze bestaande Application Gateway, maar moeten deze hosten op een VIRTUELE machine. We gaan de bestaande Application Gateway opnieuw gebruiken en handmatig een listener en back-endpools configureren voor staging.contoso.com. Maar het handmatig aanpassen van de configuratie van Application Gateway (met behulp van portal, ARM-API's of Terraform) zou conflicteren met de veronderstellingen van volledig eigendom van AGIC. Kort nadat we wijzigingen hebben toegepast, overschrijft of verwijdert AGIC deze.

We kunnen AGIC verbieden om wijzigingen aan te brengen in een subset van de configuratie.

  1. Maak een nieuw YAML-bestand met de naam AzureIngressProhibitedTarget met het volgende fragment:

    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. Het zojuist gemaakte object weergeven:

    kubectl get AzureIngressProhibitedTargets
    
  3. De configuratie van Application Gateway wijzigen vanuit Azure Portal: listeners, routeringsregels, back-ends enzovoort toevoegen. Het nieuwe object dat we hebben gemaakt (manually-configured-staging-environment) verbiedt AGIC om de application gateway-configuratie te overschrijven die betrekking heeft op staging.contoso.com.