Dela via


Installera AGIC med hjälp av en befintlig Application Gateway-distribution

Application Gateway Ingress Controller (AGIC) är en podd i ditt AKS-kluster (Azure Kubernetes Service). AGIC övervakar Kubernetes inkommande resurser. Den skapar och tillämpar en Azure Application Gateway-konfiguration baserat på status för Kubernetes-klustret.

Dricks

Överväg Application Gateway för containrar för din Kubernetes-ingresslösning. Mer information finns i Snabbstart: Distribuera Application Gateway för containrar ALB-styrenhet.

Förutsättningar

Den här artikeln förutsätter att du redan har installerat följande verktyg och infrastruktur:

Lägg till Helm-lagringsplatsen

Helm är pakethanterare för Kubernetes. Du använder det för att installera application-gateway-kubernetes-ingress paketet.

Om du använder Cloud Shell behöver du inte installera Helm. Cloud Shell levereras med Helm version 3. Kör följande kommandon för att lägga till AGIC Helm-lagringsplatsen för ett AKS-kluster som är aktiverat med Rollbaserad åtkomstkontroll för Kubernetes (RBAC):

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

Säkerhetskopiera Application Gateway-distributionen

Innan du installerar AGIC säkerhetskopierar du konfigurationen av Application Gateway-distributionen:

  1. I Azure Portal går du till distributionen av Application Gateway.
  2. I avsnittet Automation väljer du Exportera mall och sedan Ladda ned.

Den nedladdade .zip-filen innehåller JSON-mallar, Bash-skript och PowerShell-skript som du kan använda för att återställa Application Gateway om en återställning blir nödvändig.

Konfigurera en identitet för Resource Manager-autentisering

AGIC kommunicerar med Kubernetes API-servern och Azure Resource Manager. Det kräver en identitet för att få åtkomst till dessa API:er. Du kan använda antingen Microsoft Entra-arbetsbelastnings-ID eller ett huvudnamn för tjänsten.

Konfigurera Microsoft Entra-arbetsbelastnings-ID

Microsoft Entra-arbetsbelastnings-ID är en identitet som du tilldelar till en programvaruarbetsbelastning. Med den här identiteten kan AKS-podden autentisera med andra Azure-resurser.

För den här konfigurationen behöver du auktorisering för AGIC-podden för att göra HTTP-begäranden till Azure Resource Manager.

  1. Använd kommandot Azure CLI az account set för att ange att en specifik prenumeration ska vara den aktuella aktiva prenumerationen:

    az account set --subscription "subscriptionID"
    

    Använd sedan kommandot az identity create för att skapa en hanterad identitet. Du måste skapa identiteten i nodresursgruppen. Nodresursgruppen tilldelas som standard ett namn, till exempel MC_myResourceGroup_myAKSCluster_eastus.

    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. För rolltilldelningen kör du följande kommando för att identifiera principalId värdet för den nyligen skapade identiteten:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Ge identitetsdeltagaren åtkomst till din Application Gateway-distribution. Du behöver ID:t för Application Gateway-distributionen, som ser ut som /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C.

    Hämta först listan över Application Gateway-ID:t i din prenumeration genom att köra följande kommando:

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

    Om du vill tilldela åtkomst till identitetsdeltagare kör du följande kommando:

    $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. Ge identitetsläsaren åtkomst till resursgruppen Application Gateway. Resursgrupps-ID:t ser ut som /subscriptions/A/resourceGroups/B. Du kan hämta alla resursgrupper genom att köra 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
    

Kommentar

Kontrollera att den identitet som AGIC använder har behörigheten Microsoft.Network/virtualNetworks/subnets/join/action delegerad till undernätet där Application Gateway distribueras. Om du inte har definierat en anpassad roll som har den här behörigheten kan du använda den inbyggda rollen Nätverksdeltagare .

Konfigurera ett huvudnamn för tjänsten

Det är också möjligt att ge AGIC-åtkomst till Azure Resource Manager med hjälp av en Kubernetes-hemlighet:

  1. Skapa ett Huvudnamn för Active Directory-tjänsten och koda det med Base64. Base64-kodningen krävs för att JSON-bloben ska sparas i Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Lägg till den Base64-kodade JSON-bloben i helm-config.yaml filen. Filen helm-config.yaml konfigurerar AGIC.

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

Distribuera AGIC-tillägget

Skapa ett distributionsmanifest för ingresskontrollanten

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

Distribuera ingresskontrollanten

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

Installera ingresskontrollanten som ett Helm-diagram

Använd Cloud Shell för att installera AGIC Helm-paketet:

  1. Utför en Helm-uppdatering:

    helm repo update
    
  2. Ladda ned helm-config.yaml:

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

    Eller kopiera följande YAML-fil:

    # 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. Redigera helm-config.yaml och fyll i värdena för appgw och armAuth.

    Kommentar

    <identity-client-id> är en egenskap för det Microsoft Entra-arbetsbelastnings-ID-värde som du konfigurerade i föregående avsnitt. Du kan hämta den här informationen genom att köra följande kommando: az identity show -g <resourcegroup> -n <identity-name>. I det kommandot <resourcegroup> är resursgruppen som är värd för de infrastrukturresurser som är relaterade till AKS-klustret, Application Gateway och den hanterade identiteten.

  4. Installera Helm-diagrammet med konfigurationen helm-config.yaml från föregående steg:

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

    Du kan också kombinera helm-config.yaml och Helm-kommandot i ett steg:

    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. Kontrollera loggen för den nyligen skapade podden för att kontrollera att den startade korrekt.

Information om hur du kan exponera en AKS-tjänst för Internet via HTTP eller HTTPS med hjälp av en Azure Application Gateway-distribution finns i den här guiden.

Konfigurera en delad Application Gateway-distribution

Som standard förutsätter AGIC fullständigt ägarskap för Application Gateway-distributionen som den är länkad till. AGIC version 0.8.0 och senare kan dela en enda Application Gateway-distribution med andra Azure-komponenter. Du kan till exempel använda samma Application Gateway-distribution för en app som finns på en skalningsuppsättning för virtuella Azure-datorer och ett AKS-kluster.

Exempelscenario

Nu ska vi titta på en imaginär Application Gateway-distribution som hanterar trafik för två webbplatser:

  • dev.contoso.com: Finns i ett nytt AKS-kluster med hjälp av Application Gateway och AGIC.
  • prod.contoso.com: Finns på en VM-skalningsuppsättning.

Med standardinställningar förutsätter AGIC 100 % ägarskap för Application Gateway-distributionen som den pekas på. AGIC skriver över all App Gateway-konfiguration. Om du manuellt skapar en lyssnare för prod.contoso.com på Application Gateway utan att definiera den i Kubernetes-ingressen tar AGIC bort konfigurationen prod.contoso.com inom några sekunder.

Om du vill installera AGIC och även hantera prod.contoso.com från datorerna som använder vm-skalningsuppsättningen måste du begränsa AGIC till att endast konfigurera dev.contoso.com . Du underlättar den här begränsningen genom att instansiera följande anpassade resursdefinition (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

Föregående kommando skapar ett AzureIngressProhibitedTarget objekt. Det här objektet gör AGIC (version 0.8.0 och senare) medveten om förekomsten av Application Gateway-konfigurationen för prod.contoso.com. Det här objektet instruerar också uttryckligen AGIC att undvika att ändra någon konfiguration som är relaterad till värdnamnet.

Aktivera en delad Application Gateway-distribution med hjälp av en ny AGIC-installation

Om du vill begränsa AGIC (version 0.8.0 och senare) till en delmängd av Application Gateway-konfigurationen ändrar du mallen helm-config.yaml . I avsnittet appgw: lägger du till en shared nyckel och ställer in den på true:

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

Tillämpa Helm-ändringarna:

  1. Kontrollera att CRD:en AzureIngressProhibitedTarget är installerad:

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

    helm upgrade \
        --recreate-pods \
        -f helm-config.yaml \
        agic-controller
        oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
    

Därför har AKS-klustret en ny instans med AzureIngressProhibitedTarget namnet prohibit-all-targets:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

Objektet prohibit-all-targets förbjuder AGIC från att ändra konfigurationen för alla värdar och sökvägar. Helm installerat med appgw.shared=true distribuerar AGIC, men det gör inga ändringar i Application Gateway.

Utöka behörigheter

Eftersom Helm med appgw.shared=true och standard prohibit-all-targets blockerar AGIC från att tillämpa en konfiguration måste du bredda AGIC-behörigheterna:

  1. Skapa en ny YAML-fil med namnet AzureIngressProhibitedTarget med följande kodfragment som innehåller din specifika konfiguration:

    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 när du har skapat ett eget anpassat förbud kan du ta bort standardförbudet, som är för brett:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Aktivera en delad Application Gateway-distribution för en befintlig AGIC-installation

Anta att du redan har ett fungerande AKS-kluster och en Application Gateway-distribution och att du har konfigurerat AGIC i klustret. Du har en ingress för prod.contoso.com och hanterar trafik för den från klustret.

Du vill lägga staging.contoso.com till i din befintliga Application Gateway-distribution, men du måste vara värd för den på en virtuell dator. Du ska återanvända den befintliga Application Gateway-distributionen och manuellt konfigurera en lyssnare och serverdelspooler för staging.contoso.com. Men att manuellt justera Application Gateway-konfigurationen (med hjälp av Azure Portal, Resource Manager-API:er eller Terraform) skulle strida mot AGIC:s antaganden om fullständigt ägande. Kort efter att du har tillämpat ändringar skriver AGIC över eller tar bort dem.

Du kan förhindra att AGIC gör ändringar i en delmängd av konfigurationen:

  1. Skapa en ny YAML-fil med namnet AzureIngressProhibitedTarget med hjälp av följande kodfragment:

    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. Visa det nyligen skapade objektet:

    kubectl get AzureIngressProhibitedTargets
    
  3. Ändra Application Gateway-konfigurationen från Azure Portal. Du kan till exempel lägga till lyssnare, routningsregler och serverdelar. Det nya objektet som du skapade (manually-configured-staging-environment) förbjuder AGIC från att skriva över Application Gateway-konfigurationen som är relaterad till staging.contoso.com.