Udostępnij za pośrednictwem


Instalowanie programu AGIC przy użyciu istniejącego wdrożenia 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. Tworzy i stosuje konfigurację aplikacja systemu Azure Gateway na podstawie stanu klastra Kubernetes.

Napiwek

Rozważ użycie usługi Application Gateway dla kontenerów dla rozwiązania ruchu przychodzącego Kubernetes. Aby uzyskać więcej informacji, zobacz Szybki start: wdrażanie usługi Application Gateway dla kontenerów kontrolera ALB.

Wymagania wstępne

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

Dodawanie repozytorium Helm

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

Jeśli używasz usługi Cloud Shell, nie musisz instalować programu Helm. Usługa Cloud Shell jest dostarczana z programem Helm w wersji 3. Uruchom następujące polecenia, aby dodać repozytorium AGIC Helm dla klastra usługi AKS, który jest włączony za pomocą kontroli dostępu opartej na rolach (RBAC) 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

Tworzenie kopii zapasowej wdrożenia usługi Application Gateway

Przed zainstalowaniem programu AGIC utwórz kopię zapasową konfiguracji wdrożenia usługi Application Gateway:

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

Pobrany plik .zip zawiera szablony JSON, skrypty powłoki Bash i skrypty programu PowerShell, których można użyć do przywrócenia usługi Application Gateway, jeśli przywrócenie stanie się konieczne.

Konfigurowanie tożsamości na potrzeby uwierzytelniania przy użyciu usługi 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. Możesz użyć Tożsamość obciążeń Microsoft Entra lub jednostki usługi.

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

Tożsamość obciążeń Microsoft Entra to tożsamość przypisana do obciążenia oprogramowania. Ta tożsamość umożliwia zasobnikowi usługi AKS uwierzytelnianie za pomocą innych zasobów platformy Azure.

W przypadku tej konfiguracji potrzebujesz autoryzacji dla zasobnika AGIC, aby wysyłać żądania HTTP do usługi Azure Resource Manager.

  1. Użyj polecenia az account set interfejsu wiersza polecenia platformy Azure, aby ustawić określoną subskrypcję jako bieżącą aktywną subskrypcję:

    az account set --subscription "subscriptionID"
    

    Następnie użyj polecenia az identity create , aby utworzyć tożsamość zarządzaną. Należy utworzyć tożsamość 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 identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
    
  2. W przypadku przypisania roli uruchom następujące polecenie, aby zidentyfikować principalId wartość 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 wdrożenia usługi Application Gateway. Potrzebny jest identyfikator wdrożenia 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, uruchamiając polecenie 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 usługę AGIC ma uprawnienie Microsoft.Network/virtualNetworks/subnets/join/action delegowane do podsieci, w której wdrożono usługę Application Gateway. Jeśli nie zdefiniowano roli niestandardowej, która ma to uprawnienie, możesz użyć wbudowanej roli Współautor sieci.

Konfigurowanie jednostki usługi

Istnieje również możliwość zapewnienia dostępu AGIC do usługi Azure Resource Manager przy użyciu wpisu tajnego platformy Kubernetes:

  1. Utwórz jednostkę usługi Active Directory i zakoduj ją przy użyciu usługi 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 JSON zakodowany w formacie Base64. Plik helm-config.yaml konfiguruje AGIC.

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

Wdrażanie dodatku AGIC

Tworzenie manifestu wdrożenia dla kontrolera ruchu przychodzącego

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

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 programu Helm

Zainstaluj pakiet AGIC Helm za pomocą usługi Cloud Shell :

  1. Wykonaj aktualizację programu Helm:

    helm repo update
    
  2. Pobierz helm-config.yamlplik :

    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 helm-config.yaml i wypełnij wartości dla appgw i armAuth.

    Uwaga

    <identity-client-id>jest właściwością Tożsamość obciążeń Microsoft Entra wartości skonfigurowanej w poprzedniej sekcji. Te informacje można pobrać, uruchamiając następujące polecenie: az identity show -g <resourcegroup> -n <identity-name>. W tym poleceniu <resourcegroup> jest grupa zasobów, która hostuje zasoby infrastruktury związane z klastrem usługi AKS, usługą Application Gateway i tożsamością zarządzaną.

  4. Zainstaluj pakiet Helm przy użyciu helm-config.yaml konfiguracji z poprzedniego kroku:

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

    Alternatywnie możesz połączyć polecenie helm-config.yaml Helm w jednym kroku:

    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. Sprawdź dziennik nowo utworzonego zasobnika, aby sprawdzić, czy został uruchomiony prawidłowo.

Aby dowiedzieć się, jak można uwidocznić usługę AKS w Internecie za pośrednictwem protokołu HTTP lub HTTPS przy użyciu wdrożenia usługi aplikacja systemu Azure Gateway, zobacz ten przewodnik.

Konfigurowanie współużytkowanego wdrożenia usługi Application Gateway

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

Przykładowy scenariusz

Przyjrzyjmy się wyimaginowanej wdrożeniu usługi Application Gateway, które zarządza ruchem dla dwóch witryn internetowych:

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

W przypadku ustawień domyślnych program AGIC zakłada, że 100% własności wdrożenia usługi Application Gateway jest wskazywane. Program AGIC zastępuje całą konfigurację usługi App Gateway. Jeśli ręcznie utworzysz odbiornik dla usługi prod.contoso.com 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 korzystające z zestawu skalowania maszyn wirtualnych, należy ograniczyć program AGIC do konfigurowania dev.contoso.com tylko. To ograniczenie można ułatwić, tworząc wystąpienie następującej niestandardowej definicji zasobu (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

Poprzednie polecenie tworzy AzureIngressProhibitedTarget obiekt. Ten obiekt sprawia, że program AGIC (wersja 0.8.0 lub nowsza) rozpozna istnienie konfiguracji usługi Application Gateway dla programu prod.contoso.com. Ten obiekt jawnie instruuje również AGIC, aby uniknąć zmiany konfiguracji powiązanej z tą nazwą hosta.

Włączanie współużytkowanego wdrożenia usługi Application Gateway przy użyciu nowej instalacji programu 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ę, że AzureIngressProhibitedTarget zainstalowano crD:

    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 \
        agic-controller
        oci://mcr.microsoft.com/azure-application-gateway/charts/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 uniemożliwia AGIC zmianę konfiguracji dla dowolnego hosta i ścieżki. Program Helm zainstalowany z appgw.shared=true wdrożeniem programu AGIC, ale nie wprowadza żadnych zmian w usłudze Application Gateway.

Uprawnienia rozszerzające

Ponieważ program Helm z programem appgw.shared=true i ustawieniem domyślnym prohibit-all-targets blokuje stosowanie konfiguracji przez program AGIC, należy poszerzyć 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. Teraz, po utworzeniu własnego niestandardowego zakazu, możesz usunąć domyślny, który jest zbyt szeroki:

    kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
    

Włączanie współużytkowanego wdrożenia usługi Application Gateway dla istniejącej instalacji AGIC

Załóżmy, że masz już działający klaster usługi AKS i wdrożenie usługi Application Gateway oraz skonfigurowano usługę AGIC w klastrze. Masz ruch przychodzący dla prod.contoso.com usługi i pomyślnie obsługuje ruch z klastra.

Chcesz dodać staging.contoso.com do istniejącego wdrożenia usługi Application Gateway, ale musisz go hostować na maszynie wirtualnej. Użyjesz ponownie istniejącego wdrożenia usługi Application Gateway i ręcznie skonfigurujesz odbiornik i pule zaplecza dla programu staging.contoso.com. Jednak ręczne dostosowanie konfiguracji usługi Application Gateway (przy użyciu witryny Azure Portal, interfejsów API usługi Resource Manager lub narzędzia Terraform) spowoduje 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żesz 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. Zmodyfikuj konfigurację usługi Application Gateway w witrynie Azure Portal. Na przykład dodaj odbiorniki, reguły routingu i zaplecza. Nowo utworzony obiekt (manually-configured-staging-environment) uniemożliwia usłudze AGIC zastąpienie konfiguracji usługi Application Gateway powiązanej z staging.contoso.comprogramem .