Instalowanie kontrolera ruchu przychodzącego usługi Application Gateway (AGIC) przy użyciu istniejącej usługi Application Gateway

Kontroler ruchu przychodzącego usługi Application Gateway (AGIC) to zasobnik w klastrze usługi Azure Kubernetes Service (AKS). Usługa AGIC monitoruje zasoby ruchu przychodzącego Kubernetes i tworzy i stosuje konfigurację usługi Application Gateway na podstawie stanu klastra Kubernetes.

Kontur

Wymagania wstępne

W tym dokumencie założono, że masz już zainstalowane następujące narzędzia i infrastrukturę:

Utwórz kopię zapasową konfiguracji usługi Application Gateway przed zainstalowaniem programu AGIC:

  1. W witrynie Azure Portal przejdź do wystąpienia usługi Application Gateway.
  2. W sekcji Automatyzacja wybierz pozycję Eksportuj szablon, a następnie wybierz pozycję Pobierz.

Pobrany plik zip zawiera szablony JSON, powłokę bash i skrypty programu PowerShell, których można użyć do przywrócenia usługi App Gateway, jeśli stanie się to konieczne

Instalowanie narzędzia Helm

Helm jest menedżerem pakietów dla platformy Kubernetes używanym do instalowania application-gateway-kubernetes-ingress pakietu.

Uwaga

Jeśli używasz usługi Cloud Shell, nie musisz instalować programu Helm. Usługa Azure Cloud Shell jest dostarczana z programem Helm w wersji 3. Pomiń pierwszy krok i po prostu dodaj repozytorium AGIC Helm.

  1. Zainstaluj program Helm i uruchom następujące polecenie, aby dodać application-gateway-kubernetes-ingress pakiet helm:

    • Klaster usługi AKS z włączoną kontrolą dostępu opartą na rolach platformy 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. Dodaj repozytorium AGIC Helm:

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

Uwierzytelnianie za pomocą usługi Azure Resource Manager

Program AGIC komunikuje się z serwerem interfejsu API Kubernetes i usługą Azure Resource Manager. Wymaga ona tożsamości, aby uzyskać dostęp do tych interfejsów API.

Konfigurowanie Tożsamość obciążeń Microsoft Entra

Tożsamość obciążeń Microsoft Entra jest tożsamością przypisywaną do obciążenia oprogramowania w celu uwierzytelniania i uzyskiwania dostępu do innych usług i zasobów. Ta tożsamość umożliwia zasobnikowi usługi AKS korzystanie z tej tożsamości i uwierzytelnianie w innych zasobach platformy Azure. W przypadku tej konfiguracji potrzebujemy autoryzacji dla zasobnika AGIC, aby wysyłać żądania HTTP do usługi ARM.

  1. Użyj polecenia az account set interfejsu wiersza polecenia platformy Azure, aby ustawić określoną subskrypcję jako bieżącą aktywną subskrypcję. Następnie użyj polecenia az identity create , aby utworzyć tożsamość zarządzaną. Tożsamość musi zostać utworzona w grupie zasobów węzła. Domyślnie grupa zasobów węzła ma przypisaną nazwę, taką jak MC_myResourceGroup_myAKSCluster_eastus.

    az account set --subscription "subscriptionID"
    
    az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. W przypadku przypisania roli uruchom następujące polecenie, aby zidentyfikować principalId dla nowo utworzonej tożsamości:

    $resourceGroup="resource-group-name"
    $identityName="identity-name"
    az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
    
  3. Udziel tożsamości współautorowi dostępu do usługi Application Gateway. Potrzebny jest identyfikator usługi Application Gateway, który wygląda następująco: /subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C. Najpierw pobierz listę identyfikatorów usługi Application Gateway w subskrypcji, uruchamiając następujące polecenie:

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

    Aby przypisać dostęp współautora tożsamości, uruchom następujące polecenie:

    $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. Udziel czytelnikowi tożsamości dostępu do grupy zasobów usługi Application Gateway. Identyfikator grupy zasobów wygląda następująco: /subscriptions/A/resourceGroups/B. Możesz pobrać wszystkie grupy zasobów za 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
    

Uwaga

Upewnij się, że tożsamość używana przez program AGIC ma uprawnienie Microsoft.Network/virtualNetworks/subnets/join/action delegowane do podsieci, w której wdrożono usługę Application Gateway. Jeśli rola niestandardowa nie jest zdefiniowana z tym uprawnieniem, możesz użyć wbudowanej roli Współautor sieci, która zawiera uprawnienie Microsoft.Network/virtualNetworks/subnets/join/action .

Używanie jednostki usługi

Istnieje również możliwość zapewnienia dostępu AGIC do usługi ARM przy użyciu wpisu tajnego kubernetes.

  1. Utwórz jednostkę usługi Active Directory i zakoduj za pomocą base64. Kodowanie base64 jest wymagane, aby obiekt blob JSON został zapisany na platformie Kubernetes.

    az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
    
  2. Dodaj do pliku obiekt blob helm-config.yaml zakodowany w formacie Base64 JSON. Więcej informacji na ten helm-config.yaml temat znajduje się w następnej sekcji.

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

Wdrażanie dodatku kontrolera ruchu przychodzącego bramy aplikacja systemu Azure

Tworzenie manifestu wdrożenia kontrolera ruchu przychodzącego

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

Wdrażanie kontrolera ruchu przychodzącego

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

Instalowanie kontrolera ruchu przychodzącego jako wykresu helm

W kilku pierwszych krokach zainstalujemy narzędzie Helm Tiller w klastrze Kubernetes. Zainstaluj pakiet AGIC Helm za pomocą usługi Cloud Shell :

  1. application-gateway-kubernetes-ingress Dodawanie repozytorium helm i przeprowadzanie aktualizacji narzędzia Helm

    helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
    helm repo update
    
  2. Pobierz plik helm-config.yaml, który konfiguruje program AGIC:

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

    Możesz też skopiować następujący plik 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. Edytuj plik helm-config.yaml i wypełnij wartości dla appgw i armAuth.

    Uwaga

    Jest <identity-client-id> to właściwość Tożsamość obciążeń Microsoft Entra skonfigurowana w poprzedniej sekcji. Te informacje można pobrać, uruchamiając następujące polecenie: az identity show -g <resourcegroup> -n <identity-name>, gdzie <resourcegroup> jest grupą zasobów hostująca zasoby infrastruktury związane z klastrem AKS, usługą Application Gateway i tożsamością zarządzaną.

  4. Instalowanie pakietu Helm przy application-gateway-kubernetes-ingress użyciu helm-config.yaml konfiguracji z poprzedniego kroku

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

    Alternatywnie możesz połączyć helm-config.yaml polecenie i Helm w jednym 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. Sprawdź dziennik nowo utworzonego zasobnika, aby sprawdzić, czy został prawidłowo uruchomiony

Zapoznaj się z tym przewodnikiem z instrukcjami, aby dowiedzieć się, jak uwidaczniać usługę AKS za pośrednictwem protokołu HTTP lub HTTPS w Internecie przy użyciu bramy aplikacja systemu Azure Gateway.

Usługa Application Gateway udostępniona

Domyślnie usługa AGIC zakłada pełną własność usługi Application Gateway, z którą jest połączona. Program AGIC w wersji 0.8.0 lub nowszej może współużytkować pojedynczą usługę Application Gateway z innymi składnikami platformy Azure. Na przykład można użyć tej samej usługi Application Gateway dla aplikacji hostowanej w zestawie skalowania maszyn wirtualnych i klastrze usługi AKS.

Utwórz kopię zapasową konfiguracji usługi Application Gateway przed włączeniem tego ustawienia:

  1. W witrynie Azure Portal przejdź do wystąpienia Application Gateway
  2. W sekcji Automatyzacja wybierz pozycję Eksportuj szablon, a następnie wybierz pozycję Pobierz.

Pobrany plik zip zawiera szablony JSON, powłokę bash i skrypty programu PowerShell, których można użyć do przywrócenia usługi Application Gateway

Przykładowy scenariusz

Przyjrzyjmy się wyimaginowanej usłudze Application Gateway, która zarządza ruchem dla dwóch witryn internetowych:

  • dev.contoso.com — hostowane w nowym klastrze usługi AKS przy użyciu usługi Application Gateway i AGIC
  • prod.contoso.com — hostowane w zestawie skalowania maszyn wirtualnych platformy Azure

W przypadku ustawień domyślnych program AGIC zakłada, że 100% własności usługi Application Gateway wskazuje na to. AGIC zastępuje całą konfigurację usługi App Gateway. Jeśli ręcznie utworzysz odbiornik ( prod.contoso.com w usłudze Application Gateway) bez definiowania go w ruchu przychodzącym Kubernetes, program AGIC usunie konfigurację prod.contoso.com w ciągu kilku sekund.

Aby zainstalować program AGIC, a także obsługiwać prod.contoso.com maszyny z zestawu skalowania maszyn wirtualnych, musimy ograniczyć program AGIC do konfigurowania dev.contoso.com tylko. Jest to obsługiwane przez utworzenie wystąpienia następującego 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

Powyższe polecenie tworzy AzureIngressProhibitedTarget obiekt. Dzięki temu usługa AGIC (wersja 0.8.0 lub nowsza) wie o istnieniu konfiguracji prod.contoso.com usługi Application Gateway i jawnie nakazuje jej uniknięcie zmiany konfiguracji powiązanej z tą nazwą hosta.

Włącz przy użyciu nowej instalacji AGIC

Aby ograniczyć program AGIC (wersja 0.8.0 lub nowsza) do podzestawu konfiguracji usługi Application Gateway, zmodyfikuj helm-config.yaml szablon. appgw: W sekcji dodaj shared klucz i ustaw go 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 >>>>>

Zastosuj zmiany programu Helm:

  1. Upewnij się, AzureIngressProhibitedTarget że funkcja CRD jest zainstalowana przy użyciu następujących funkcji:

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

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

W związku z tym klaster usługi AKS ma nowe wystąpienie AzureIngressProhibitedTarget o nazwie prohibit-all-targets:

kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml

Obiekt prohibit-all-targets, jak wskazuje nazwa, uniemożliwia AGIC zmianę konfiguracji dla dowolnego hosta i ścieżki. Instalacja programu Helm z wdrożeniem appgw.shared=true programu AGIC, ale nie wprowadza żadnych zmian w usłudze Application Gateway.

Uprawnienia rozszerzające

Ponieważ program Helm z elementem appgw.shared=true i ustawieniem domyślnym prohibit-all-targets blokuje stosowanie konfiguracji, poszerzaj uprawnienia AGIC:

  1. Utwórz nowy plik YAML o nazwie AzureIngressProhibitedTarget z następującym fragmentem kodu zawierającym konkretną konfigurację:

    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. Dopiero po utworzeniu własnego niestandardowego zakazu można usunąć domyślny, który jest zbyt szeroki:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Włącz dla istniejącej instalacji AGIC

Załóżmy, że mamy już działający klaster usługi AKS, usługę Application Gateway i skonfigurowaną usługę AGIC w naszym klastrze. Mamy ruch przychodzący i prod.contoso.com pomyślnie obsługujemy ruch z klastra. Chcemy dodać staging.contoso.com usługę Application Gateway do istniejącej usługi Application Gateway, ale musimy ją hostować na maszynie wirtualnej. Użyjemy ponownie istniejącej usługi Application Gateway i ręcznie skonfigurujemy odbiornik i pule zaplecza dla usługi staging.contoso.com. Jednak ręczne dostosowywanie konfiguracji usługi Application Gateway (przy użyciu portalu, interfejsów API usługi ARM lub narzędzia Terraform) spowodowałoby konflikt z założeniami AGIC o pełnej własności. Wkrótce po zastosowaniu zmian program AGIC zastępuje je lub usuwa.

Możemy uniemożliwić AGIC wprowadzanie zmian w podzestawie konfiguracji.

  1. Utwórz nowy plik YAML o nazwie AzureIngressProhibitedTarget przy użyciu następującego fragmentu kodu:

    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. Wyświetl nowo utworzony obiekt:

    kubectl get AzureIngressProhibitedTargets
    
  3. Modyfikowanie konfiguracji usługi Application Gateway w witrynie Azure Portal — dodawanie odbiorników, reguł routingu, zapleczy itp. Nowo utworzony obiekt (manually-configured-staging-environment) uniemożliwia usłudze AGIC zastępowanie konfiguracji usługi Application Gateway powiązanej z staging.contoso.comprogramem .