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ę:
- 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 Azure Cloud Shell jako środowisko usługi Azure Shell , które ma
az
(interfejs wiersza polecenia platformy Azure),kubectl
ihelm
jest zainstalowane. Te narzędzia są wymagane w przypadku poleceń obsługujących konfigurowanie tego wdrożenia.
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:
- W witrynie Azure Portal przejdź do wdrożenia usługi Application Gateway.
- 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.
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"
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
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
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 polecenieaz 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:
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
Dodaj do pliku obiekt blob
helm-config.yaml
JSON zakodowany w formacie Base64. Plikhelm-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 :
Wykonaj aktualizację programu Helm:
helm repo update
Pobierz
helm-config.yaml
plik :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
helm-config.yaml
i wypełnij wartości dlaappgw
iarmAuth
.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ą.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
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:
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
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:
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
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:
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
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 zstaging.contoso.com
programem .