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.
Napiwek
Zobacz również Co to jest usługa Application Gateway dla kontenerów.
Kontur
- Wymagania wstępne
- Uwierzytelnianie za pomocą usługi Azure Resource Manager (ARM)
- Opcja 1. Konfigurowanie Tożsamość obciążeń Microsoft Entra i tworzenie tożsamości platformy Azure w usłudze ARMs
- Opcja 2. Konfigurowanie jednostki usługi
- Instalowanie kontrolera ruchu przychodzącego przy użyciu programu Helm
- Udostępniona usługa Application Gateway: zainstaluj usługę AGIC w środowisku, w którym usługa Application Gateway jest współdzielona między jednym klastrem AKS i/lub innymi składnikami platformy Azure.
Wymagania wstępne
W tym dokumencie założono, że masz już zainstalowane następujące narzędzia i infrastrukturę:
- Klaster usługi AKS z interfejsem azure Container Networking Interface (CNI)
- Usługa Application Gateway w wersji 2 w tej samej sieci wirtualnej co klaster usługi AKS
- Tożsamość obciążeń Microsoft Entra skonfigurowane dla klastra usługi AKS
- Usługa Cloud Shell to środowisko usługi Azure Shell , które ma
az
interfejs wiersza polecenia,kubectl
ihelm
jest zainstalowane. Te narzędzia są wymagane w przypadku poleceń używanych do obsługi konfigurowania tego wdrożenia.
Utwórz kopię zapasową konfiguracji usługi Application Gateway przed zainstalowaniem programu AGIC:
- W witrynie Azure Portal przejdź do wystąpienia usługi Application Gateway.
- 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.
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
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.
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"
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
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
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.
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
Dodaj do pliku obiekt blob
helm-config.yaml
zakodowany w formacie Base64 JSON. Więcej informacji na tenhelm-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 :
application-gateway-kubernetes-ingress
Dodawanie repozytorium helm i przeprowadzanie aktualizacji narzędzia Helmhelm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/ helm repo update
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>
Edytuj plik helm-config.yaml i wypełnij wartości dla
appgw
iarmAuth
.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ą.Instalowanie pakietu Helm przy
application-gateway-kubernetes-ingress
użyciuhelm-config.yaml
konfiguracji z poprzedniego krokuhelm 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
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:
- W witrynie Azure Portal przejdź do wystąpienia
Application Gateway
- 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 AGICprod.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:
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
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:
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
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.
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
Wyświetl nowo utworzony obiekt:
kubectl get AzureIngressProhibitedTargets
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 zstaging.contoso.com
programem .