Installera en Application Gateway-ingresskontrollant (AGIC) med hjälp av en befintlig Application Gateway
Application Gateway Ingress Controller (AGIC) är en podd i ditt AKS-kluster (Azure Kubernetes Service). AGIC övervakar Kubernetes ingressresurser och skapar och tillämpar Application Gateway-konfiguration baserat på status för Kubernetes-klustret.
Disposition
- Krav
- Azure Resource Manager-autentisering
- Alternativ 1: Konfigurera Microsoft Entra-arbetsbelastnings-ID och skapa Azure-identitet på lokala datorer
- Alternativ 2: Konfigurera ett huvudnamn för tjänsten
- Installera ingresskontrollant med Helm
- Delad Application Gateway: Installera AGIC i en miljö där Application Gateway delas mellan ett AKS-kluster och/eller andra Azure-komponenter.
Förutsättningar
Det här dokumentet förutsätter att du redan har följande verktyg och infrastruktur installerad:
- Ett AKS-kluster med Azure Container Networking Interface (CNI)
- Application Gateway v2 i samma virtuella nätverk som AKS-klustret
- Microsoft Entra-arbetsbelastnings-ID konfigurerat för ditt AKS-kluster
- Cloud Shell är Azure Shell-miljön som har
az
CLI,kubectl
ochhelm
installerat. Dessa verktyg krävs för kommandon som används för att konfigurera den här distributionen.
Säkerhetskopiera Application Gateway-konfigurationen innan du installerar AGIC:
- Från Azure-portalen går du till din Application Gateway-instans.
- Under avsnittet Automation väljer du Exportera mall och sedan Ladda ned.
Zip-filen som du laddade ned innehåller JSON-mallar, bash- och PowerShell-skript som du kan använda för att återställa App Gateway om det skulle bli nödvändigt
Installera Helm
Helm är en pakethanterare för Kubernetes som används för att installera application-gateway-kubernetes-ingress
paketet.
Kommentar
Om du använder Cloud Shell behöver du inte installera Helm. Azure Cloud Shell levereras med Helm version 3. Hoppa över det första steget och lägg bara till AGIC Helm-lagringsplatsen.
Installera Helm och kör följande för att lägga till
application-gateway-kubernetes-ingress
Helm-paketet:- Kubernetes RBAC-aktiverat AKS-kluster
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
Lägg till AGIC Helm-lagringsplatsen:
helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/ helm repo update
Azure Resource Manager-autentisering
AGIC kommunicerar med Kubernetes API-servern och Azure Resource Manager. Det kräver en identitet för att få åtkomst till dessa API:er.
Konfigurera Microsoft Entra-arbetsbelastnings-ID
Microsoft Entra-arbetsbelastnings-ID är en identitet som du tilldelar till en programvaruarbetsbelastning för att autentisera och komma åt andra tjänster och resurser. Med den här identiteten kan AKS-podden använda den här identiteten och autentisera med andra Azure-resurser. För den här konfigurationen behöver vi auktorisering för AGIC-podden för att göra HTTP-begäranden till ARM.
Använd kommandot Azure CLI az account set för att ange en specifik prenumeration som den aktuella aktiva prenumerationen. Använd sedan kommandot az identity create för att skapa en hanterad identitet. Identiteten måste skapas i nodresursgruppen. Nodresursgruppen tilldelas som standard ett namn, till exempel MC_myResourceGroup_myAKSCluster_eastus.
az account set --subscription "subscriptionID"
az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
För rolltilldelningen kör du följande kommando för att identifiera för den nyligen skapade identiteten
principalId
:$resourceGroup="resource-group-name" $identityName="identity-name" az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
Ge identitetsdeltagaren åtkomst till din Application Gateway. Du behöver ID:t för Application Gateway, som ser ut så här:
/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C
. Hämta först listan över Application Gateway-ID:t i din prenumeration genom att köra följande kommando:az network application-gateway list --query '[].id'
Om du vill tilldela åtkomst till identitetsdeltagare kör du följande kommando:
$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
Ge identitetsläsaren åtkomst till resursgruppen Application Gateway. Resursgrupps-ID:t ser ut så här:
/subscriptions/A/resourceGroups/B
. Du kan hämta alla resursgrupper med: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
Kommentar
Kontrollera att den identitet som används av AGIC har behörigheten Microsoft.Network/virtualNetworks/subnets/join/action delegerad till undernätet där Application Gateway distribueras. Om en anpassad roll inte har definierats med den här behörigheten kan du använda den inbyggda rollen Nätverksdeltagare , som innehåller behörigheten Microsoft.Network/virtualNetworks/subnets/join/action .
Använda tjänstens huvudnamn
Det är också möjligt att ge AGIC-åtkomst till ARM med hjälp av en Kubernetes-hemlighet.
Skapa ett Huvudnamn för Active Directory-tjänsten och koda med base64. Base64-kodningen krävs för att JSON-bloben ska sparas i Kubernetes.
az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
Lägg till den base64-kodade JSON-bloben i
helm-config.yaml
filen. Mer information finnshelm-config.yaml
i nästa avsnitt.armAuth: type: servicePrincipal secretJSON: <Base64-Encoded-Credentials>
Distribuera Azure Application Gateway-tillägget för ingresskontrollant
Skapa ett distributionsmanifest för ingresskontrollant
---
# 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
Distribuera ingresskontrollant
$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace
Installera ingresskontrollant som ett Helm-diagram
I de första stegen installerar vi Helm's Tiller i ditt Kubernetes-kluster. Använd Cloud Shell för att installera AGIC Helm-paketet:
Lägg till helm-lagringsplatsen
application-gateway-kubernetes-ingress
och utför en helm-uppdateringhelm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/ helm repo update
Ladda ned helm-config.yaml, som konfigurerar AGIC:
wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
Eller kopiera följande YAML-fil:
# 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>
Redigera helm-config.yaml och fyll i värdena för
appgw
ocharmAuth
.Kommentar
<identity-client-id>
är en egenskap för det Microsoft Entra-arbetsbelastnings-ID som du konfigurerade i föregående avsnitt. Du kan hämta den här informationen genom att köra följande kommando:az identity show -g <resourcegroup> -n <identity-name>
, där är resursgruppen som<resourcegroup>
är värd för de infrastrukturresurser som är relaterade till AKS-klustret, Application Gateway och hanterad identitet.Installera Helm-diagrammet
application-gateway-kubernetes-ingress
med konfigurationenhelm-config.yaml
från föregående steghelm install -f <helm-config.yaml> application-gateway-kubernetes-ingress/ingress-azure
Du kan också kombinera
helm-config.yaml
helm-kommandot och i ett steg: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
Kontrollera loggen för den nyligen skapade podden för att kontrollera om den startade korrekt
Se den här guiden för att förstå hur du kan exponera en AKS-tjänst via HTTP eller HTTPS på Internet med hjälp av en Azure Application Gateway.
Delad programgateway
Agic förutsätter som standard fullständigt ägarskap för den Application Gateway som den är länkad till. AGIC version 0.8.0 och senare kan dela en enda Application Gateway med andra Azure-komponenter. Vi kan till exempel använda samma Application Gateway för en app som finns på VM-skalningsuppsättningen och ett AKS-kluster.
Säkerhetskopiera Application Gateway-konfigurationen innan du aktiverar den här inställningen:
- Från Azure-portalen går du till din
Application Gateway
instans - Under avsnittet Automation väljer du Exportera mall och sedan Ladda ned.
Zip-filen som du laddade ned innehåller JSON-mallar, bash- och PowerShell-skript som du kan använda för att återställa Application Gateway
Exempel på ett scenario
Nu ska vi titta på en imaginär Application Gateway som hanterar trafik för två webbplatser:
dev.contoso.com
– finns i ett nytt AKS-kluster med Application Gateway och AGICprod.contoso.com
– värdhanterad på en Skalningsuppsättning för virtuella Azure-datorer
Med standardinställningar förutsätter AGIC 100 % ägarskap för den Application Gateway som den pekar på. AGIC skriver över alla App Gateway-konfigurationer. Om du manuellt skapar en lyssnare för prod.contoso.com
(på Application Gateway) utan att definiera den i Kubernetes-ingressen tar AGIC bort konfigurationen prod.contoso.com
inom några sekunder.
För att installera AGIC och även fungera prod.contoso.com
från våra vm-skalningsuppsättningsdatorer måste vi begränsa AGIC till att endast konfigurera dev.contoso.com
. Detta underlättas genom instansiering av följande 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
Kommandot ovan skapar ett AzureIngressProhibitedTarget
objekt. Detta gör AGIC (version 0.8.0 och senare) medveten om förekomsten av Application Gateway-konfiguration för prod.contoso.com
och instruerar uttryckligen den att undvika att ändra någon konfiguration som är relaterad till värdnamnet.
Aktivera med ny AGIC-installation
Om du vill begränsa AGIC (version 0.8.0 och senare) till en delmängd av Application Gateway-konfigurationen ändrar du mallen helm-config.yaml
.
Under avsnittet appgw:
lägger du till shared
nyckeln och ställer in den på true
.
appgw:
subscriptionId: <subscriptionId> # existing field
resourceGroup: <resourceGroupName> # existing field
name: <applicationGatewayName> # existing field
shared: true # <<<<< Add this field to enable shared Application Gateway >>>>>
Tillämpa Helm-ändringarna:
AzureIngressProhibitedTarget
Kontrollera att CRD:en är installerad med:kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
Uppdatera Helm:
helm upgrade \ --recreate-pods \ -f helm-config.yaml \ ingress-azure application-gateway-kubernetes-ingress/ingress-azure
Därför har AKS-klustret en ny instans med AzureIngressProhibitedTarget
namnet prohibit-all-targets
:
kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml
Objektet prohibit-all-targets
, som namnet antyder, förbjuder AGIC från att ändra konfiguration för alla värdar och sökvägar.
Helm installerar med appgw.shared=true
distribuerar AGIC, men gör inga ändringar i Application Gateway.
Utöka behörigheter
Eftersom Helm med appgw.shared=true
och standard prohibit-all-targets
blockerar AGIC från att tillämpa en konfiguration, breddar du AGIC-behörigheter:
Skapa en ny YAML-fil med namnet
AzureIngressProhibitedTarget
med följande kodfragment som innehåller din specifika konfiguration: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
Först när du har skapat ett eget anpassat förbud kan du ta bort standardförbudet, som är för brett:
kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
Aktivera för en befintlig AGIC-installation
Anta att vi redan har ett fungerande AKS-kluster, Application Gateway och konfigurerat AGIC i klustret. Vi har en ingress för prod.contoso.com
och hanterar trafik för den från klustret. Vi vill lägga staging.contoso.com
till vår befintliga Application Gateway, men måste vara värd för den på en virtuell dator. Vi ska återanvända den befintliga Application Gateway och manuellt konfigurera en lyssnare och serverdelspooler för staging.contoso.com
. Men att manuellt justera Application Gateway-konfigurationen (med hjälp av portalen, ARM-API:er eller Terraform) skulle strida mot AGIC:s antaganden om fullständigt ägande. Kort efter att vi har tillämpat ändringar skriver AGIC över eller tar bort dem.
Vi kan hindra AGIC från att göra ändringar i en delmängd av konfigurationen.
Skapa en ny YAML-fil med namnet
AzureIngressProhibitedTarget
med följande kodfragment: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
Visa det nyligen skapade objektet:
kubectl get AzureIngressProhibitedTargets
Ändra Application Gateway-konfigurationen från Azure-portalen – lägg till lyssnare, routningsregler, serverdelar osv. Det nya objektet som vi skapade (
manually-configured-staging-environment
) förbjuder AGIC från att skriva över Application Gateway-konfigurationen som är relaterad tillstaging.contoso.com
.
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för