Delen via


AGIC installeren met behulp van een bestaande Application Gateway-implementatie

De AGIC (Application Gateway Ingress Controller) is een pod in uw AKS-cluster (Azure Kubernetes Service). AGIC bewaakt de Kubernetes-toegangsbeheerobjectbronnen. Er wordt een Azure-toepassing Gateway-configuratie gemaakt en toegepast op basis van de status van het Kubernetes-cluster.

Tip

Overweeg Application Gateway for Containers voor uw Kubernetes-oplossing voor inkomend verkeer. Zie quickstart: Application Gateway for Containers ALB Controller implementeren voor meer informatie.

Vereisten

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

De Helm-opslagplaats toevoegen

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

Als u Cloud Shell gebruikt, hoeft u Helm niet te installeren. Cloud Shell wordt geleverd met Helm versie 3. Voer de volgende opdrachten uit om de AGIC Helm-opslagplaats toe te voegen voor een AKS-cluster dat is ingeschakeld met op rollen gebaseerd toegangsbeheer (RBAC) van 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

Een back-up maken van de implementatie van Application Gateway

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

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

Het gedownloade bestand .zip bevat JSON-sjablonen, Bash-scripts en PowerShell-scripts die u kunt gebruiken om Application Gateway te herstellen als een herstel nodig is.

Een identiteit instellen voor Resource Manager-verificatie

AGIC communiceert met de Kubernetes API-server en Azure Resource Manager. Er is een identiteit vereist voor toegang tot deze API's. U kunt Microsoft Entra Workload-ID of een service-principal gebruiken.

Microsoft Entra Workload-ID instellen

Microsoft Entra Workload-ID is een identiteit die u toewijst aan een softwareworkload. Met deze identiteit kan uw AKS-pod worden geverifieerd met andere Azure-resources.

Voor deze configuratie hebt u autorisatie nodig voor de AGIC-pod om HTTP-aanvragen te kunnen indienen bij Azure Resource Manager.

  1. Gebruik de azure CLI az account set command om een specifiek abonnement in te stellen op het huidige actieve abonnement:

    az account set --subscription "subscriptionID"
    

    Gebruik vervolgens de opdracht az identity create om een beheerde identiteit te maken. U moet de identiteit maken in de resourcegroep van het knooppunt. De knooppuntresourcegroep krijgt standaard een naam, zoals MC_myResourceGroup_myAKSCluster_eastus.

    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. Voer voor de roltoewijzing de volgende opdracht uit om de waarde voor 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. Verdeel de inzender van de identiteit toegang tot uw Application Gateway-implementatie. U hebt de id van de Application Gateway-implementatie nodig, die er als /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/Cvolgt uitziet.

    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 /subscriptions/A/resourceGroups/Buit. U kunt alle resourcegroepen ophalen door uit te voeren 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 AGIC gebruikt de machtiging Microsoft.Network/virtualNetworks/subnets/join/action is gedelegeerd aan het subnet waarin Application Gateway is geïmplementeerd. Als u geen aangepaste rol met deze machtiging hebt gedefinieerd, kunt u de ingebouwde rol Inzender voor netwerken gebruiken.

Een service-principal instellen

Het is ook mogelijk om AGIC-toegang te bieden tot Azure Resource Manager met behulp van een Kubernetes-geheim:

  1. Maak een Active Directory-service-principal en codeer deze met Base64. De Base64-codering is vereist om de JSON-blob op te slaan 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. Het helm-config.yaml bestand configureert AGIC.

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

De AGIC-invoegtoepassing implementeren

Een implementatiemanifest maken voor de ingangscontroller

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

De ingangscontroller implementeren

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

De ingangscontroller installeren als een Helm-grafiek

Cloud Shell gebruiken om het AGIC Helm-pakket te installeren:

  1. Een Helm-update uitvoeren:

    helm repo update
    
  2. Downloaden helm-config.yaml:

    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

    <identity-client-id>is een eigenschap van de Microsoft Entra Workload-ID waarde 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>. In deze opdracht <resourcegroup> is de resourcegroep die als host fungeert voor de infrastructuurresources die betrekking hebben op het AKS-cluster, Application Gateway en de beheerde identiteit.

  4. Installeer de Helm-grafiek met de helm-config.yaml configuratie uit de vorige stap:

    helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
    

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

    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. Controleer het logboek van de zojuist gemaakte pod om te controleren of deze correct is gestart.

Als u wilt weten hoe u een AKS-service beschikbaar kunt maken voor internet via HTTP of HTTPS met behulp van een Azure-toepassing Gateway-implementatie, raadpleegt u deze handleiding.

Een gedeelde Implementatie van Application Gateway instellen

AGIC gaat standaard uit van volledig eigendom van de Application Gateway-implementatie waaraan deze is gekoppeld. AGIC versie 0.8.0 en hoger kan één Application Gateway-implementatie delen met andere Azure-onderdelen. U kunt bijvoorbeeld dezelfde Application Gateway-implementatie gebruiken voor een app die wordt gehost op een virtuele-machineschaalset van Azure en een AKS-cluster.

Voorbeeldscenario

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

  • dev.contoso.com: gehost op een nieuw AKS-cluster met behulp van Application Gateway en AGIC.
  • prod.contoso.com: Gehost op een virtuele-machineschaalset.

Met de standaardinstellingen gaat AGIC ervan uit dat 100% eigendom is van de Application Gateway-implementatie waarnaar wordt verwezen. AGIC overschrijft alle App Gateway-configuraties. Als u handmatig een listener voor prod.contoso.com 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 fungeren prod.contoso.com vanaf de machines die gebruikmaken van de virtuele-machineschaalset, moet u AGIC beperken tot alleen configureren dev.contoso.com . U kunt deze beperking vergemakkelijken door de volgende aangepaste resourcedefinitie (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 voorgaande opdracht maakt u een AzureIngressProhibitedTarget object. Dit object maakt AGIC (versie 0.8.0 en hoger) op de hoogte van het bestaan van de Application Gateway-configuratie voor prod.contoso.com. Met dit object wordt AGIC ook expliciet geïnstrueerd om te voorkomen dat configuraties met betrekking tot die hostnaam worden gewijzigd.

Een gedeelde Application Gateway-implementatie inschakelen met behulp van een 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 in de appgw: sectie een shared sleutel toe 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:

    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 \
        agic-controller
        oci://mcr.microsoft.com/azure-application-gateway/charts/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 prohibit-all-targets object verbiedt AGIC om de configuratie voor een host en pad te wijzigen. Helm is geïnstalleerd met appgw.shared=true AGIC, maar er worden geen wijzigingen aangebracht in Application Gateway.

Machtigingen uitbreiden

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

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

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

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Een gedeelde Application Gateway-implementatie inschakelen voor een bestaande AGIC-installatie

Stel dat u al een werkend AKS-cluster en een Application Gateway-implementatie hebt en dat u AGIC hebt geconfigureerd in uw cluster. U hebt toegangsbeheerobjecten waarvoor prod.contoso.com het verkeer van het cluster is geslaagd.

U wilt toevoegen staging.contoso.com aan uw bestaande Application Gateway-implementatie, maar u moet deze hosten op een virtuele machine. U gaat de bestaande Application Gateway-implementatie opnieuw gebruiken en handmatig een listener en back-endpools configureren voor staging.contoso.com. Maar het handmatig aanpassen van de Application Gateway-configuratie (met behulp van Azure Portal, Resource Manager-API's of Terraform) zou conflicteren met de veronderstellingen van volledig eigendom van AGIC. Kort nadat u wijzigingen hebt toegepast, worden deze door AGIC overschreven of verwijderd.

U kunt AGIC verbieden om wijzigingen aan te brengen in een subset van de configuratie:

  1. Maak een nieuw YAML-bestand met de naam AzureIngressProhibitedTarget met behulp van 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. Wijzig de Application Gateway-configuratie vanuit Azure Portal. Voeg bijvoorbeeld listeners, routeringsregels en back-ends toe. Het nieuwe object dat u hebt gemaakt (manually-configured-staging-environment) verbiedt AGIC om de Application Gateway-configuratie met betrekking tot staging.contoso.com.