Dela via


Installera en Application Gateway-ingresskontrollant (AGIC) med hjälp av en befintlig Application Gateway

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

Disposition

Förutsättningar

Det här dokumentet förutsätter att du redan har följande verktyg och infrastruktur installerad:

Säkerhetskopiera Application Gateway-konfigurationen innan du installerar AGIC:

  1. Från Azure-portalen går du till din Application Gateway-instans.
  2. Under avsnittet Automation väljer du Exportera mall och sedan Ladda ned.

Zip-filen som du laddade ned innehåller JSON-mallar, bash- och PowerShell-skript som du kan använda för att återställa App Gateway om det skulle bli nödvändigt

Installera Helm

Helm är en pakethanterare för Kubernetes som används för att installera application-gateway-kubernetes-ingress paketet.

Kommentar

Om du använder Cloud Shell behöver du inte installera Helm. Azure Cloud Shell levereras med Helm version 3. Hoppa över det första steget och lägg bara till AGIC Helm-lagringsplatsen.

  1. Installera Helm och kör följande för att lägga till application-gateway-kubernetes-ingress Helm-paketet:

    • Kubernetes RBAC-aktiverat AKS-kluster
    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. Lägg till AGIC Helm-lagringsplatsen:

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

Azure 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.

Konfigurera Microsoft Entra-arbetsbelastnings-ID

Microsoft Entra-arbetsbelastnings-ID är en identitet som du tilldelar till en programvaruarbetsbelastning för att autentisera och komma åt andra tjänster och resurser. Med den här identiteten kan AKS-podden använda den här identiteten och autentisera med andra Azure-resurser. För den här konfigurationen behöver vi auktorisering för AGIC-podden för att göra HTTP-begäranden till ARM.

  1. Använd kommandot Azure CLI az account set för att ange en specifik prenumeration som den aktuella aktiva prenumerationen. Använd sedan kommandot az identity create för att skapa en hanterad identitet. Identiteten måste skapas i nodresursgruppen. Nodresursgruppen tilldelas som standard ett namn, till exempel MC_myResourceGroup_myAKSCluster_eastus.

    az account set --subscription "subscriptionID"
    
    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 för den nyligen skapade identiteten principalId :

    $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. Du behöver ID:t för Application Gateway, som ser ut så här: /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 så här: /subscriptions/A/resourceGroups/B. Du kan hämta alla resursgrupper med: 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 behörigheten Microsoft.Network/virtualNetworks/subnets/join/action delegerad till undernätet där Application Gateway distribueras. Om en anpassad roll inte har definierats med den här behörigheten kan du använda den inbyggda rollen Nätverksdeltagare , som innehåller behörigheten Microsoft.Network/virtualNetworks/subnets/join/action .

Använda tjänstens huvudnamn

Det är också möjligt att ge AGIC-åtkomst till ARM med hjälp av en Kubernetes-hemlighet.

  1. Skapa ett Huvudnamn för Active Directory-tjänsten och koda 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. Mer information finns helm-config.yaml i nästa avsnitt.

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

Distribuera Azure Application Gateway-tillägget för ingresskontrollant

Skapa ett distributionsmanifest för ingresskontrollant

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

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

Installera ingresskontrollant som ett Helm-diagram

I de första stegen installerar vi Helm's Tiller i ditt Kubernetes-kluster. Använd Cloud Shell för att installera AGIC Helm-paketet:

  1. Lägg till helm-lagringsplatsen application-gateway-kubernetes-ingress och utför en helm-uppdatering

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. Ladda ned helm-config.yaml, som konfigurerar AGIC:

    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 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>, där är resursgruppen som <resourcegroup> är värd för de infrastrukturresurser som är relaterade till AKS-klustret, Application Gateway och hanterad identitet.

  4. Installera Helm-diagrammet application-gateway-kubernetes-ingress med konfigurationen helm-config.yaml från föregående steg

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

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

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

Se den här guiden för att förstå hur du kan exponera en AKS-tjänst via HTTP eller HTTPS på Internet med hjälp av en Azure Application Gateway.

Delad programgateway

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

Säkerhetskopiera Application Gateway-konfigurationen innan du aktiverar den här inställningen:

  1. Från Azure-portalen går du till din Application Gateway instans
  2. Under avsnittet Automation väljer du Exportera mall och sedan Ladda ned.

Zip-filen som du laddade ned innehåller JSON-mallar, bash- och PowerShell-skript som du kan använda för att återställa Application Gateway

Exempel på ett scenario

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

  • dev.contoso.com – finns i ett nytt AKS-kluster med Application Gateway och AGIC
  • prod.contoso.com – värdhanterad på en Skalningsuppsättning för virtuella Azure-datorer

Med standardinställningar förutsätter AGIC 100 % ägarskap för den Application Gateway som den pekar på. AGIC skriver över alla App Gateway-konfigurationer. 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.

För att installera AGIC och även fungera prod.contoso.com från våra vm-skalningsuppsättningsdatorer måste vi begränsa AGIC till att endast konfigurera dev.contoso.com . Detta underlättas genom instansiering av följande 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

Kommandot ovan skapar ett AzureIngressProhibitedTarget objekt. Detta gör AGIC (version 0.8.0 och senare) medveten om förekomsten av Application Gateway-konfiguration för prod.contoso.com och instruerar uttryckligen den att undvika att ändra någon konfiguration som är relaterad till värdnamnet.

Aktivera med 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 . Under avsnittet appgw: lägger du till shared nyckeln 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. AzureIngressProhibitedTarget Kontrollera att CRD:en är installerad med:

    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 \
        ingress-azure application-gateway-kubernetes-ingress/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, som namnet antyder, förbjuder AGIC från att ändra konfiguration för alla värdar och sökvägar. Helm installerar med appgw.shared=true distribuerar AGIC, men 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, breddar du AGIC-behörigheter:

  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. Först 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 för en befintlig AGIC-installation

Anta att vi redan har ett fungerande AKS-kluster, Application Gateway och konfigurerat AGIC i klustret. Vi har en ingress för prod.contoso.com och hanterar trafik för den från klustret. Vi vill lägga staging.contoso.com till vår befintliga Application Gateway, men måste vara värd för den på en virtuell dator. Vi ska återanvända den befintliga Application Gateway och manuellt konfigurera en lyssnare och serverdelspooler för staging.contoso.com. Men att manuellt justera Application Gateway-konfigurationen (med hjälp av portalen, ARM-API:er eller Terraform) skulle strida mot AGIC:s antaganden om fullständigt ägande. Kort efter att vi har tillämpat ändringar skriver AGIC över eller tar bort dem.

Vi kan hindra AGIC från att göra ändringar i en delmängd av konfigurationen.

  1. Skapa en ny YAML-fil med namnet AzureIngressProhibitedTarget med 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-portalen – lägg till lyssnare, routningsregler, serverdelar osv. Det nya objektet som vi skapade (manually-configured-staging-environment) förbjuder AGIC från att skriva över Application Gateway-konfigurationen som är relaterad till staging.contoso.com.