Instalace kontroleru příchozího přenosu dat služby Application Gateway (AGIC) pomocí existující služby Application Gateway

Kontroler příchozího přenosu dat služby Application Gateway (AGIC) je pod v rámci clusteru Azure Kubernetes Service (AKS). AGIC monitoruje prostředky příchozího přenosu dat Kubernetes a vytváří a používá konfiguraci služby Application Gateway na základě stavu clusteru Kubernetes.

Tip

Podívejte se také na téma Co je Application Gateway pro kontejnery.

Obrys

Požadavky

Tento dokument předpokládá, že už máte nainstalované následující nástroje a infrastrukturu:

Před instalací AGIC zálohujte konfiguraci služby Application Gateway:

  1. Na webu Azure Portal přejděte k vaší instanci služby Application Gateway.
  2. V části Automatizace vyberte Exportovat šablonu a pak vyberte Stáhnout.

Stažený soubor ZIP obsahuje šablony JSON, Bash a powershellové skripty, které byste mohli použít k obnovení služby App Gateway v případě potřeby.

Instalace nástroje Helm

Helm je správce balíčků pro Kubernetes, který se používá k instalaci application-gateway-kubernetes-ingress balíčku.

Poznámka:

Pokud používáte Cloud Shell, nemusíte instalovat Helm. Azure Cloud Shell se dodává s Helmem verze 3. Přeskočte první krok a stačí přidat úložiště AGIC Helm.

  1. Nainstalujte Helm a spuštěním následujícího příkazu přidejte application-gateway-kubernetes-ingress balíček Helm:

    • Cluster AKS s podporou RBAC 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
    
  2. Přidejte úložiště AGIC Helm:

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

Ověřování Azure Resource Manageru

AGIC komunikuje se serverem rozhraní API Kubernetes a Azure Resource Managerem. Vyžaduje identitu pro přístup k těmto rozhraním API.

Nastavení ID úloh Microsoft Entra

ID úloh Microsoft Entra je identita, kterou přiřadíte k softwarové úloze, k ověřování a přístupu k dalším službám a prostředkům. Tato identita umožňuje podu AKS používat tuto identitu a ověřovat ji s jinými prostředky Azure. Pro tuto konfiguraci potřebujeme autorizaci podu AGIC k provádění požadavků HTTP na ARM.

  1. Pomocí příkazu az account set v Azure CLI nastavte konkrétní předplatné, které bude aktuálním aktivním předplatným. Pak pomocí příkazu az identity create vytvořte spravovanou identitu. Identitu je potřeba vytvořit ve skupině prostředků uzlu. Skupina prostředků uzlu má ve výchozím nastavení přiřazený název, například MC_myResourceGroup_myAKSCluster_eastus.

    az account set --subscription "subscriptionID"
    
    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. Pro přiřazení role spusťte následující příkaz, který identifikuje nově vytvořenou principalId identitu:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Udělte přispěvateli identity přístup ke službě Application Gateway. Potřebujete ID služby Application Gateway, které vypadá takto: /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C. Nejprve získejte seznam ID služby Application Gateway ve vašem předplatném spuštěním následujícího příkazu:

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

    Pokud chcete přiřadit přístup přispěvatele identity, spusťte následující příkaz:

    $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. Udělte čtenáři identity přístup ke skupině prostředků služby Application Gateway. ID skupiny prostředků vypadá takto: /subscriptions/A/resourceGroups/B. Všechny skupiny prostředků můžete získat pomocí: 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
    

Poznámka:

Ujistěte se, že identita, kterou AGIC používá, má delegované oprávnění Microsoft.Network/virtualNetworks/subnets/join/action do podsítě, ve které je nasazená služba Application Gateway. Pokud s tímto oprávněním není definovaná vlastní role, můžete použít předdefinované role Přispěvatel sítě, která obsahuje oprávnění Microsoft.Network/virtualNetworks/subnets/join/action .

Použití instančního objektu

K ARM je také možné poskytnout přístup AGIC pomocí tajného kódu Kubernetes.

  1. Vytvořte instanční objekt služby Active Directory a kódujte ho pomocí base64. Kódování Base64 se vyžaduje pro uložení objektu blob JSON do Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Přidejte do helm-config.yaml souboru objekt blob JSON kódovaný s kódováním Base64. Další informace helm-config.yaml najdete v další části.

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

Nasazení doplňku kontroleru příchozího přenosu dat brány Aplikace Azure

Vytvoření manifestu nasazení kontroleru příchozího přenosu dat

---
# file: pet-supplies-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pet-supplies-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway

spec:
  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

Nasazení kontroleru příchozího přenosu dat

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

Instalace kontroleru příchozího přenosu dat jako chartu Helm

V několika prvních krocích nainstalujeme Helm tiller do clusteru Kubernetes. Pomocí Cloud Shellu nainstalujte balíček AGIC Helm:

  1. application-gateway-kubernetes-ingress Přidání úložiště Helm a provedení aktualizace helmu

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. Stáhněte si helm-config.yaml, který konfiguruje AGIC:

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

    Nebo zkopírujte následující soubor YAML:

    # 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. Upravte helm-config.yaml a vyplňte hodnoty pro appgw a armAuth.

    Poznámka:

    Jedná se <identity-client-id> o vlastnost ID úloh Microsoft Entra, kterou jste nastavili v předchozí části. Tyto informace můžete načíst spuštěním následujícího příkazu: az identity show -g <resourcegroup> -n <identity-name>, kde <resourcegroup> je skupina prostředků hostující prostředky infrastruktury související s clusterem AKS, službou Application Gateway a spravovanou identitou.

  4. Instalace chartu application-gateway-kubernetes-ingresshelm-config.yaml Helm s konfigurací z předchozího kroku

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

    Případně můžete příkaz helm-config.yaml Helm zkombinovat v jednom kroku:

    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. Zkontrolujte protokol nově vytvořeného podu a ověřte, jestli se správně spustil.

V tomto průvodci návodem se dozvíte, jak můžete službu AKS zveřejnit prostřednictvím protokolu HTTP nebo HTTPS na internetu pomocí brány Aplikace Azure.

Sdílená služba Application Gateway

Ve výchozím nastavení AGIC předpokládá úplné vlastnictví služby Application Gateway, se kterou je propojená. AGIC verze 0.8.0 a novější můžou sdílet jednu službu Application Gateway s dalšími komponentami Azure. Mohli bychom například použít stejnou službu Application Gateway pro aplikaci hostované ve škálovací sadě virtuálních počítačů a clusteru AKS.

Před povolením tohoto nastavení zálohujte konfiguraci služby Application Gateway:

  1. Na webu Azure Portal přejděte do vaší Application Gateway instance.
  2. V části Automatizace vyberte Exportovat šablonu a pak vyberte Stáhnout.

Stažený soubor ZIP obsahuje šablony JSON, Bash a powershellové skripty, které můžete použít k obnovení služby Application Gateway.

Ukázkový scénář

Podívejme se na imaginární službu Application Gateway, která spravuje provoz pro dva weby:

  • dev.contoso.com – hostované v novém clusteru AKS s využitím služby Application Gateway a AGIC
  • prod.contoso.com – hostovaná ve škálovací sadě virtuálních počítačů Azure

Ve výchozím nastavení předpokládá AGIC 100% vlastnictví služby Application Gateway, na kterou odkazuje. AGIC přepíše veškerou konfiguraci služby App Gateway. Pokud ručně vytvoříte naslouchací proces pro prod.contoso.com (ve službě Application Gateway), aniž byste ho definovali v příchozím přenosu dat Kubernetes, AGIC odstraní prod.contoso.com konfiguraci během několika sekund.

Abychom mohli nainstalovat AGIC a také obsluhovat prod.contoso.com počítače škálovací sady virtuálních počítačů, musíme AGIC omezit pouze na konfiguraci dev.contoso.com . To se usnadňuje vytvořením instance následujícího 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

Výše uvedený příkaz vytvoří AzureIngressProhibitedTarget objekt. Díky tomu může AGIC (verze 0.8.0 a novější) vědět o existenci konfigurace prod.contoso.com služby Application Gateway a explicitně ji instruuje, aby se zabránilo změně jakékoli konfigurace související s tímto názvem hostitele.

Povolení s novou instalací AGIC

Pokud chcete AGIC (verze 0.8.0 a novější) omezit na podmnožinu konfigurace služby Application Gateway, upravte helm-config.yaml šablonu. appgw: V části přidejte shared klíč a nastavte ho na true.

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

Použijte změny Helmu:

  1. Ujistěte se, že je CRD AzureIngressProhibitedTarget nainstalovaný s:

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

    helm upgrade \
        --recreate-pods \
        -f helm-config.yaml \
        ingress-azure application-gateway-kubernetes-ingress/ingress-azure
    

V důsledku toho má váš cluster AKS novou instanci AzureIngressProhibitedTarget s názvem prohibit-all-targets:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

prohibit-all-targetsObjekt , jak název napovídá, zakáže AGIC měnit konfiguraci pro libovolného hostitele a cestu. Instalace Helmu s nasazením appgw.shared=true AGIC, ale neprovádí žádné změny ve službě Application Gateway.

Rozšíření oprávnění

Vzhledem k tomu, že Helm s appgw.shared=true výchozím prohibit-all-targets nastavením blokuje použití konfigurace AGIC, rozšiřte oprávnění AGIC:

  1. Vytvořte nový soubor YAML s názvem AzureIngressProhibitedTarget s následujícím fragmentem kódu, který obsahuje vaše konkrétní nastavení:

    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. Až po vytvoření vlastního zákazu můžete výchozí zákaz odstranit, což je příliš široké:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Povolení existující instalace AGIC

Předpokládejme, že už máme funkční cluster AKS, Službu Application Gateway a nakonfigurovanou AGIC v našem clusteru. Máme příchozí přenos dat a prod.contoso.com úspěšně obsluhujeme provoz z clusteru. Chceme přidat staging.contoso.com do stávající služby Application Gateway, ale musíme ji hostovat na virtuálním počítači. Znovu použijeme stávající službu Application Gateway a ručně nakonfigurujeme naslouchací proces a back-endové fondy pro staging.contoso.com. Ruční úprava konfigurace služby Application Gateway (pomocí portálu, rozhraní API ARM nebo Terraformu) by ale byla v konfliktu s předpoklady plného vlastnictví AGIC. Krátce po použití změn je AGIC přepíše nebo odstraní.

AGIC můžeme zakázat provádění změn v podmnožině konfigurace.

  1. Vytvořte nový soubor YAML s názvem AzureIngressProhibitedTarget s následujícím fragmentem kódu:

    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. Zobrazení nově vytvořeného objektu:

    kubectl get AzureIngressProhibitedTargets
    
  3. Upravte konfiguraci služby Application Gateway z webu Azure Portal – přidejte naslouchací procesy, pravidla směrování, back-endy atd. Nový objekt, který jsme vytvořili (manually-configured-staging-environment), zakazuje AGIC přepisovat konfiguraci služby Application Gateway související s staging.contoso.com.