Installera AGIC med hjälp av en befintlig Application Gateway-distribution
Application Gateway Ingress Controller (AGIC) är en podd i ditt AKS-kluster (Azure Kubernetes Service). AGIC övervakar Kubernetes inkommande resurser. Den skapar och tillämpar en Azure Application Gateway-konfiguration baserat på status för Kubernetes-klustret.
Dricks
Överväg Application Gateway för containrar för din Kubernetes-ingresslösning. Mer information finns i Snabbstart: Distribuera Application Gateway för containrar ALB-styrenhet.
Förutsättningar
Den här artikeln förutsätter att du redan har installerat följande verktyg och infrastruktur:
- Ett AKS-kluster med Azure Container Networking Interface (CNI).
- Application Gateway v2 i samma virtuella nätverk som AKS-klustret.
- Microsoft Entra Workload ID konfigurerat för ditt AKS-kluster.
- Azure Cloud Shell som Azure Shell-miljö, som har
az
(Azure CLI),kubectl
ochhelm
installerat. Dessa verktyg krävs för kommandon som stöder konfiguration av den här distributionen.
Lägg till Helm-lagringsplatsen
Helm är pakethanterare för Kubernetes. Du använder det för att installera application-gateway-kubernetes-ingress
paketet.
Om du använder Cloud Shell behöver du inte installera Helm. Cloud Shell levereras med Helm version 3. Kör följande kommandon för att lägga till AGIC Helm-lagringsplatsen för ett AKS-kluster som är aktiverat med Rollbaserad åtkomstkontroll för Kubernetes (RBAC):
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
Säkerhetskopiera Application Gateway-distributionen
Innan du installerar AGIC säkerhetskopierar du konfigurationen av Application Gateway-distributionen:
- I Azure Portal går du till distributionen av Application Gateway.
- I avsnittet Automation väljer du Exportera mall och sedan Ladda ned.
Den nedladdade .zip-filen innehåller JSON-mallar, Bash-skript och PowerShell-skript som du kan använda för att återställa Application Gateway om en återställning blir nödvändig.
Konfigurera en identitet för 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. Du kan använda antingen Microsoft Entra-arbetsbelastnings-ID eller ett huvudnamn för tjänsten.
Konfigurera Microsoft Entra-arbetsbelastnings-ID
Microsoft Entra-arbetsbelastnings-ID är en identitet som du tilldelar till en programvaruarbetsbelastning. Med den här identiteten kan AKS-podden autentisera med andra Azure-resurser.
För den här konfigurationen behöver du auktorisering för AGIC-podden för att göra HTTP-begäranden till Azure Resource Manager.
Använd kommandot Azure CLI az account set för att ange att en specifik prenumeration ska vara den aktuella aktiva prenumerationen:
az account set --subscription "subscriptionID"
Använd sedan kommandot az identity create för att skapa en hanterad identitet. Du måste skapa identiteten i nodresursgruppen. Nodresursgruppen tilldelas som standard ett namn, till exempel
MC_myResourceGroup_myAKSCluster_eastus
.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
principalId
värdet för den nyligen skapade identiteten:$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-distribution. Du behöver ID:t för Application Gateway-distributionen, som ser ut som
/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 som
/subscriptions/A/resourceGroups/B
. Du kan hämta alla resursgrupper genom att köraaz 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 AGIC använder har behörigheten Microsoft.Network/virtualNetworks/subnets/join/action delegerad till undernätet där Application Gateway distribueras. Om du inte har definierat en anpassad roll som har den här behörigheten kan du använda den inbyggda rollen Nätverksdeltagare .
Konfigurera ett huvudnamn för tjänsten
Det är också möjligt att ge AGIC-åtkomst till Azure Resource Manager med hjälp av en Kubernetes-hemlighet:
Skapa ett Huvudnamn för Active Directory-tjänsten och koda det 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. Filenhelm-config.yaml
konfigurerar AGIC.armAuth: type: servicePrincipal secretJSON: <Base64-Encoded-Credentials>
Distribuera AGIC-tillägget
Skapa ett distributionsmanifest för ingresskontrollanten
---
# 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 ingresskontrollanten
$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace
Installera ingresskontrollanten som ett Helm-diagram
Använd Cloud Shell för att installera AGIC Helm-paketet:
Utför en Helm-uppdatering:
helm repo update
Ladda ned
helm-config.yaml
: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örappgw
ocharmAuth
.Kommentar
<identity-client-id>
är en egenskap för det Microsoft Entra-arbetsbelastnings-ID-värde 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>
. I det kommandot<resourcegroup>
är resursgruppen som är värd för de infrastrukturresurser som är relaterade till AKS-klustret, Application Gateway och den hanterade identiteten.Installera Helm-diagrammet med konfigurationen
helm-config.yaml
från föregående steg:helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
Du kan också kombinera
helm-config.yaml
och Helm-kommandot i ett steg: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
Kontrollera loggen för den nyligen skapade podden för att kontrollera att den startade korrekt.
Information om hur du kan exponera en AKS-tjänst för Internet via HTTP eller HTTPS med hjälp av en Azure Application Gateway-distribution finns i den här guiden.
Konfigurera en delad Application Gateway-distribution
Som standard förutsätter AGIC fullständigt ägarskap för Application Gateway-distributionen som den är länkad till. AGIC version 0.8.0 och senare kan dela en enda Application Gateway-distribution med andra Azure-komponenter. Du kan till exempel använda samma Application Gateway-distribution för en app som finns på en skalningsuppsättning för virtuella Azure-datorer och ett AKS-kluster.
Exempelscenario
Nu ska vi titta på en imaginär Application Gateway-distribution som hanterar trafik för två webbplatser:
dev.contoso.com
: Finns i ett nytt AKS-kluster med hjälp av Application Gateway och AGIC.prod.contoso.com
: Finns på en VM-skalningsuppsättning.
Med standardinställningar förutsätter AGIC 100 % ägarskap för Application Gateway-distributionen som den pekas på. AGIC skriver över all App Gateway-konfiguration. 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.
Om du vill installera AGIC och även hantera prod.contoso.com
från datorerna som använder vm-skalningsuppsättningen måste du begränsa AGIC till att endast konfigurera dev.contoso.com
. Du underlättar den här begränsningen genom att instansiera följande anpassade resursdefinition (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
Föregående kommando skapar ett AzureIngressProhibitedTarget
objekt. Det här objektet gör AGIC (version 0.8.0 och senare) medveten om förekomsten av Application Gateway-konfigurationen för prod.contoso.com
. Det här objektet instruerar också uttryckligen AGIC att undvika att ändra någon konfiguration som är relaterad till värdnamnet.
Aktivera en delad Application Gateway-distribution med hjälp av en 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
.
I avsnittet appgw:
lägger du till en shared
nyckel 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:
Kontrollera att CRD:en
AzureIngressProhibitedTarget
är installerad: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 \ agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/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
förbjuder AGIC från att ändra konfigurationen för alla värdar och sökvägar. Helm installerat med appgw.shared=true
distribuerar AGIC, men det 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 måste du bredda AGIC-behörigheterna:
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
Nu 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 en delad Application Gateway-distribution för en befintlig AGIC-installation
Anta att du redan har ett fungerande AKS-kluster och en Application Gateway-distribution och att du har konfigurerat AGIC i klustret. Du har en ingress för prod.contoso.com
och hanterar trafik för den från klustret.
Du vill lägga staging.contoso.com
till i din befintliga Application Gateway-distribution, men du måste vara värd för den på en virtuell dator. Du ska återanvända den befintliga Application Gateway-distributionen och manuellt konfigurera en lyssnare och serverdelspooler för staging.contoso.com
. Men att manuellt justera Application Gateway-konfigurationen (med hjälp av Azure Portal, Resource Manager-API:er eller Terraform) skulle strida mot AGIC:s antaganden om fullständigt ägande. Kort efter att du har tillämpat ändringar skriver AGIC över eller tar bort dem.
Du kan förhindra att AGIC gör ändringar i en delmängd av konfigurationen:
Skapa en ny YAML-fil med namnet
AzureIngressProhibitedTarget
med hjälp av 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 Portal. Du kan till exempel lägga till lyssnare, routningsregler och serverdelar. Det nya objektet som du skapade (
manually-configured-staging-environment
) förbjuder AGIC från att skriva över Application Gateway-konfigurationen som är relaterad tillstaging.contoso.com
.