Installieren eines Application Gateway-Eingangscontrollers (Application Gateway Ingress Controller, AGIC) mithilfe eines neuen Application Gateways

Die nachfolgenden Anweisungen gehen davon aus, dass der Application Gateway-Eingangscontroller (Application Gateway Ingress Controller, AGIC) in einer Umgebung ohne bereits vorhandene Komponenten installiert wird.

Tipp

Weitere Informationen unter Was ist Anwendungsgateway für Container.

Erforderliche Befehlszeilentools

Es wird empfohlen, Azure Cloud Shell für alle unten aufgeführten Befehlszeilenvorgänge zu verwenden. Starten Sie Ihre Shell über shell.azure.com oder durch Klicken auf den Link:

Alternativ können Sie Cloud Shell über das Azure-Portal mithilfe des folgenden Symbols starten:

Portal launch

Ihre Azure Cloud Shell verfügt bereits über alle erforderlichen Tools. Wenn Sie sich für die Verwendung einer anderen Umgebung entscheiden, stellen Sie sicher, dass die folgenden Befehlszeilentools installiert sind:

Erstellen einer Identität

Führen Sie die folgenden Schritte aus, um ein Microsoft Entra Dienstprinzipalobjekt zu erstellen. Notieren Sie sich die Werte für appId, password und objectId - diese Werte werden in den folgenden Schritten verwendet.

  1. Erstellen des AD-Dienstprinzipals (Mehr über Azure RBAC erfahren):

    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)
    

    Die Werte appId und password aus der JSON-Ausgabe werden in den folgenden Schritten verwendet.

  2. Verwenden Sie die appId aus der Ausgabe des vorherigen Befehls, um die id des neuen Dienstprinzipals abzurufen:

    objectId=$(az ad sp show --id $appId --query "id" -o tsv)
    

    Die Ausgabe dieses Befehls ist objectId. Sie wird in der Azure Resource Manager-Vorlage verwendet.

  3. Erstellen Sie die Parameterdatei, die später in der Azure Resource Manager-Vorlagenbereitstellung verwendet wird.

    cat <<EOF > parameters.json
    {
      "aksServicePrincipalAppId": { "value": "$appId" },
      "aksServicePrincipalClientSecret": { "value": "$password" },
      "aksServicePrincipalObjectId": { "value": "$objectId" },
      "aksEnableRBAC": { "value": false }
    }
    EOF
    

    Legen Sie zum Bereitstellen eines für Kubernetes RBAC aktivierten Clusters das Feld aksEnableRBAC auf true fest.

Bereitstellungskomponenten

In diesem Schritt werden Ihrem Abonnement die folgenden Komponenten hinzugefügt:

  1. Laden Sie die Azure Resource Manager-Vorlage herunter, und ändern Sie die Vorlage nach Bedarf.

    wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/deploy/azuredeploy.json -O template.json
    
  2. Bereitstellen der Azure Resource Manager-Vorlage mit der Azure-Befehlszeilenschnittstelle. Die Bereitstellung kann bis zu 5 Minuten dauern.

    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
    
  3. Nachdem die Bereitstellung abgeschlossen ist, laden Sie die Bereitstellungsausgabe in eine Datei namens deployment-outputs.json herunter.

    az deployment group show -g $resourceGroupName -n $deploymentName --query "properties.outputs" -o json > deployment-outputs.json
    

Einrichten des Azure Application Gateway-Eingangscontrollers

Mit den Anweisungen im vorherigen Abschnitt haben wir einen neuen AKS-Cluster und ein Application Gateway erstellt und konfiguriert. Wir können nun eine Beispiel-App und einen eingehenden Controller in unserer neuen Kubernetes-Infrastruktur bereitstellen.

Einrichten von Kubernetes-Anmeldeinformationen

Für die folgenden Schritte benötigen Sie den Befehl zum Einrichten von kubectl, mit dem eine Verbindung mit unserem neuen Kubernetes-Cluster hergestellt wird. In Cloud Shell ist kubectl bereits installiert. Wir verwenden die az-CLI zum Abrufen von Anmeldeinformationen für Kubernetes.

Abrufen von Anmeldeinformationen für den neu bereitgestellten AKS (weitere Informationen):

# 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

Installieren der Microsoft Entra-Podidentität

Die Microsoft Entra-Podidentität bietet tokenbasierten Zugriff auf Azure Resource Manager (ARM).

Die Microsoft Entra-Podidentität fügt Ihrem Kubernetes-Cluster folgende Komponenten hinzu:

So installieren Sie Microsoft Entra-Podidentität auf Ihrem Cluster:

  • Für Kubernetes RBAC aktivierter AKS-Cluster

    kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment-rbac.yaml
    
  • Für Kubernetes RBAC deaktivierter AKS-Cluster

    kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment.yaml
    

Installieren von Helm

Helm ist ein Paket-Manager für Kubernetes. Wir verwenden es, um das application-gateway-kubernetes-ingress-Paket zu installieren.

Hinweis

Wenn Sie Cloud Shell verwenden, müssen Sie Helm nicht installieren. Azure Cloud Shell ist in Helm Version 3 enthalten. Überspringen Sie den ersten Schritt und fügen Sie einfach das AGIC Helm-Repository hinzu.

  1. Installieren Sie Helm, und führen Sie Folgendes aus, um das Helm-Paket application-gateway-kubernetes-ingress hinzuzufügen:

    • Für Kubernetes RBAC aktivierter AKS-Cluster

      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
      
    • Für Kubernetes RBAC deaktivierter AKS-Cluster

      helm init
      
  2. Fügen Sie das AGIC-Helm-Repository hinzu:

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

Installieren des Helm-Eingangscontrollerdiagramms

  1. Verwenden Sie die oben erstellte Datei deployment-outputs.json, und erstellen Sie die folgenden Variablen.

    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)
    
  2. Laden Sie die Datei „helm-config.yaml“ herunter, mit der AGIC konfiguriert wird:

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

    Oder kopieren Sie die folgende YAML-Datei:

    # 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>
    
  3. Bearbeiten Sie die neu heruntergeladene Datei „helm-config.yaml“, und füllen Sie die Abschnitte appgw und armAuth aus.

    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
    

    Hinweis

    Für die Bereitstellung in Sovereign Clouds (z. B. Azure Government) muss der Konfigurationsparameter appgw.environment hinzugefügt und auf den entsprechenden Wert festgelegt werden, wie unten dokumentiert.

    Werte:

    • verbosityLevel: Legt die Ausführlichkeitsebene der AGIC-Protokollinfrastruktur fest. Unter Protokolliergrade finden Sie mögliche Werte.
    • appgw.environment: Legt die Cloudumgebung fest. Mögliche Werte: AZURECHINACLOUD, AZUREGERMANCLOUD, AZUREPUBLICCLOUD, AZUREUSGOVERNMENTCLOUD
    • appgw.subscriptionId: Die ID des Azure-Abonnements, in dem sich die Application Gateway-Instanz befindet. Beispiel: a123b234-a3b4-557d-b2df-a0bc12de1234
    • appgw.resourceGroup: Der Name der Azure-Ressourcengruppe, in der die Application Gateway-Instanz erstellt wurde. Beispiel: app-gw-resource-group
    • appgw.name: Name der Application Gateway-Instanz. Beispiel: applicationgatewayd0f0
    • appgw.shared: Für dieses boolesche Flag muss standardmäßig false festgelegt werden. Legen Sie es auf true fest, wenn Sie eine freigegebene Application Gateway-Instanz benötigen.
    • kubernetes.watchNamespace: Geben Sie den Namespace an, den AGIC überwachen sollte. Beim Namespace kann es sich um eine einzelne Zeichenfolge oder eine durch Trennzeichen getrennte Namespace-Liste handeln.
    • armAuth.type: kann aadPodIdentity oder servicePrincipal sein.
    • armAuth.identityResourceID: Die Ressourcen-ID der verwalteten Azure-Identität
    • armAuth.identityClientID: Die Client-ID der Identität Weitere Inforamtionen zu identityClientID finden Sie unten.
    • armAuth.secretJSON: Nur erforderlich, wenn der Typ des Dienstprinzipalgeheimnisses ausgewählt wird (beim Festlegen von armAuth.type auf servicePrincipal)

    Hinweis

    Bei identityResourceID und identityClientID handelt es sich um Werte, die während der Schritte Komponenten bereitstellen erstellt wurden. Sie können mit dem folgenden Befehl erneut abgerufen werden:

    az identity show -g <resource-group> -n <identity-name>
    

    <resource-group> im obigen Befehl ist die Ressourcengruppe Ihres Application Gateways. <identity-name> ist der Name der erstellten Identität. Alle Identitäten für ein bestimmtes Abonnement werden unter Verwendung von az identity list aufgelistet:

  4. Installieren Sie das Application Gateway-Eingangscontrollerpaket:

    helm install -f helm-config.yaml --generate-name application-gateway-kubernetes-ingress/ingress-azure
    

Installieren einer Beispiel-App

Nach der Installation der Application Gateway-Instanz sowie von AKS und AGIC können Sie die Beispiel-App über Azure Cloud Shell installieren:

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

Alternativ können Sie Folgendes ausführen:

  • Laden Sie die oben genannte YAML-Datei herunter:

    curl https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml -o aspnetapp.yaml
    
  • Wenden Sie die YAML-Datei an:

    kubectl apply -f aspnetapp.yaml
    

Weitere Beispiele

In dieser Anleitung mit Vorgehensweisen finden Sie weitere Beispiele für das Bereitstellen eines AKS-Diensts im Internet über HTTP oder HTTPS mit Application Gateway.