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.

Tips

Överväg Application Gateway för Containers för din Kubernetes-ingresslösning. För mer information, se Snabbstart: Distribuera Application Gateway ALB Controller för containrar.

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 distributionen av Application Gateway

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 arbetsbelastnings-ID för Microsoft Entra

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"
    

    Sedan använder du 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 identiteten Bidragsgivare å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'
    

    För att tilldela identiteten Contributor åtkomst, kör 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 används av AGIC har rätt behörigheter. En lista över behörigheter som krävs av identiteten finns här: Konfigurera infrastruktur – Behörigheter. Om en anpassad roll inte har definierats med de behörigheter som krävs kan du använda 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 ingresskontrolleraren

$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.8.1 -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.8.1 \
         --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.

Ställ in en gemensam implementation av Application Gateway

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 är värd på en Azure-skalningsuppsättning för virtuella 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: Hostas på ett skaleringsset för virtuella maskiner.

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 maskinerna som använder den virtuella maskinernas skalfördelning måste du begränsa AGIC till att konfigurera endast 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 ditt AKS-kluster 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 lyckas hantera 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 backendpooler 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, dirigeringsregler och backend-tjänster. 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.