AGIC installeren met behulp van een bestaande Application Gateway-implementatie
De AGIC (Application Gateway Ingress Controller) is een pod in uw AKS-cluster (Azure Kubernetes Service). AGIC bewaakt de Kubernetes-toegangsbeheerobjectbronnen. Er wordt een Azure-toepassing Gateway-configuratie gemaakt en toegepast op basis van de status van het Kubernetes-cluster.
Tip
Overweeg Application Gateway for Containers voor uw Kubernetes-oplossing voor inkomend verkeer. Zie quickstart: Application Gateway for Containers ALB Controller implementeren voor meer informatie.
Vereisten
In dit artikel wordt ervan uitgegaan dat u de volgende hulpprogramma's en infrastructuur al hebt geïnstalleerd:
- Een AKS-cluster met Azure Container Networking Interface (CNI).
- Application Gateway v2 in hetzelfde virtuele netwerk als het AKS-cluster.
- Microsoft Entra Workload-ID geconfigureerd voor uw AKS-cluster.
- Azure Cloud Shell als de Azure Shell-omgeving, die (Azure CLI)
kubectl
heeftaz
enhelm
is geïnstalleerd. Deze hulpprogramma's zijn vereist voor opdrachten die ondersteuning bieden voor het configureren van deze implementatie.
De Helm-opslagplaats toevoegen
Helm is een pakketbeheerder voor Kubernetes. U gebruikt het om het application-gateway-kubernetes-ingress
pakket te installeren.
Als u Cloud Shell gebruikt, hoeft u Helm niet te installeren. Cloud Shell wordt geleverd met Helm versie 3. Voer de volgende opdrachten uit om de AGIC Helm-opslagplaats toe te voegen voor een AKS-cluster dat is ingeschakeld met op rollen gebaseerd toegangsbeheer (RBAC) van 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
Een back-up maken van de implementatie van Application Gateway
Maak een back-up van de configuratie van uw Application Gateway-implementatie voordat u AGIC installeert:
- Ga in Azure Portal naar uw Application Gateway-implementatie.
- Selecteer in de sectie Automation de optie Sjabloon Exporteren en selecteer vervolgens Downloaden.
Het gedownloade bestand .zip bevat JSON-sjablonen, Bash-scripts en PowerShell-scripts die u kunt gebruiken om Application Gateway te herstellen als een herstel nodig is.
Een identiteit instellen voor Resource Manager-verificatie
AGIC communiceert met de Kubernetes API-server en Azure Resource Manager. Er is een identiteit vereist voor toegang tot deze API's. U kunt Microsoft Entra Workload-ID of een service-principal gebruiken.
Microsoft Entra Workload-ID instellen
Microsoft Entra Workload-ID is een identiteit die u toewijst aan een softwareworkload. Met deze identiteit kan uw AKS-pod worden geverifieerd met andere Azure-resources.
Voor deze configuratie hebt u autorisatie nodig voor de AGIC-pod om HTTP-aanvragen te kunnen indienen bij Azure Resource Manager.
Gebruik de azure CLI az account set command om een specifiek abonnement in te stellen op het huidige actieve abonnement:
az account set --subscription "subscriptionID"
Gebruik vervolgens de opdracht az identity create om een beheerde identiteit te maken. U moet de identiteit maken in de resourcegroep van het knooppunt. De knooppuntresourcegroep krijgt standaard een naam, zoals
MC_myResourceGroup_myAKSCluster_eastus
.az identity create --name "userAssignedIdentityName" --resource-group "resourceGroupName" --location "location" --subscription "subscriptionID"
Voer voor de roltoewijzing de volgende opdracht uit om de waarde voor de
principalId
zojuist gemaakte identiteit te identificeren:$resourceGroup="resource-group-name" $identityName="identity-name" az identity list -g $resourceGroup --query "[?name == '$identityName'].principalId | [0]" -o tsv
Verdeel de inzender van de identiteit toegang tot uw Application Gateway-implementatie. U hebt de id van de Application Gateway-implementatie nodig, die er als
/subscriptions/A/resourceGroups/B/providers/Microsoft.Network/applicationGateways/C
volgt uitziet.Haal eerst de lijst met Application Gateway-id's op in uw abonnement door de volgende opdracht uit te voeren:
az network application-gateway list --query '[].id'
Voer de volgende opdracht uit om de toegang tot inzender voor identiteiten toe te wijzen:
$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
Verdeel de identiteitslezer toegang tot de Application Gateway-resourcegroep. De resourcegroep-id ziet er als volgt
/subscriptions/A/resourceGroups/B
uit. U kunt alle resourcegroepen ophalen door uit te voerenaz 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
Notitie
Zorg ervoor dat voor de identiteit die AGIC gebruikt de machtiging Microsoft.Network/virtualNetworks/subnets/join/action is gedelegeerd aan het subnet waarin Application Gateway is geïmplementeerd. Als u geen aangepaste rol met deze machtiging hebt gedefinieerd, kunt u de ingebouwde rol Inzender voor netwerken gebruiken.
Een service-principal instellen
Het is ook mogelijk om AGIC-toegang te bieden tot Azure Resource Manager met behulp van een Kubernetes-geheim:
Maak een Active Directory-service-principal en codeer deze met Base64. De Base64-codering is vereist om de JSON-blob op te slaan in Kubernetes.
az ad sp create-for-rbac --role Contributor --sdk-auth | base64 -w0
Voeg de met Base64 gecodeerde JSON-blob toe aan het
helm-config.yaml
bestand. Hethelm-config.yaml
bestand configureert AGIC.armAuth: type: servicePrincipal secretJSON: <Base64-Encoded-Credentials>
De AGIC-invoegtoepassing implementeren
Een implementatiemanifest maken voor de ingangscontroller
---
# 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
De ingangscontroller implementeren
$namespace="namespace"
$file="pet-supplies-ingress.yaml"
kubectl apply -f $file -n $namespace
De ingangscontroller installeren als een Helm-grafiek
Cloud Shell gebruiken om het AGIC Helm-pakket te installeren:
Een Helm-update uitvoeren:
helm repo update
Downloaden
helm-config.yaml
:wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
Of kopieer het volgende YAML-bestand:
# 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>
Bewerk
helm-config.yaml
en vul de waarden voorappgw
enarmAuth
in.Notitie
<identity-client-id>
is een eigenschap van de Microsoft Entra Workload-ID waarde die u in de vorige sectie hebt ingesteld. U kunt deze informatie ophalen door de volgende opdracht uit te voeren:az identity show -g <resourcegroup> -n <identity-name>
. In deze opdracht<resourcegroup>
is de resourcegroep die als host fungeert voor de infrastructuurresources die betrekking hebben op het AKS-cluster, Application Gateway en de beheerde identiteit.Installeer de Helm-grafiek met de
helm-config.yaml
configuratie uit de vorige stap:helm install agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure --version 1.7.5 -f helm-config.yaml
U kunt de Helm-opdracht ook in één stap combineren
helm-config.yaml
en gebruiken: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
Controleer het logboek van de zojuist gemaakte pod om te controleren of deze correct is gestart.
Als u wilt weten hoe u een AKS-service beschikbaar kunt maken voor internet via HTTP of HTTPS met behulp van een Azure-toepassing Gateway-implementatie, raadpleegt u deze handleiding.
Een gedeelde Implementatie van Application Gateway instellen
AGIC gaat standaard uit van volledig eigendom van de Application Gateway-implementatie waaraan deze is gekoppeld. AGIC versie 0.8.0 en hoger kan één Application Gateway-implementatie delen met andere Azure-onderdelen. U kunt bijvoorbeeld dezelfde Application Gateway-implementatie gebruiken voor een app die wordt gehost op een virtuele-machineschaalset van Azure en een AKS-cluster.
Voorbeeldscenario
Laten we eens kijken naar een imaginaire Application Gateway-implementatie waarmee verkeer voor twee websites wordt beheerd:
dev.contoso.com
: gehost op een nieuw AKS-cluster met behulp van Application Gateway en AGIC.prod.contoso.com
: Gehost op een virtuele-machineschaalset.
Met de standaardinstellingen gaat AGIC ervan uit dat 100% eigendom is van de Application Gateway-implementatie waarnaar wordt verwezen. AGIC overschrijft alle App Gateway-configuraties. Als u handmatig een listener voor prod.contoso.com
Application Gateway maakt zonder deze te definiëren in het Kubernetes-toegangsbeheerobject, verwijdert AGIC de prod.contoso.com
configuratie binnen enkele seconden.
Als u AGIC wilt installeren en ook wilt fungeren prod.contoso.com
vanaf de machines die gebruikmaken van de virtuele-machineschaalset, moet u AGIC beperken tot alleen configureren dev.contoso.com
. U kunt deze beperking vergemakkelijken door de volgende aangepaste resourcedefinitie (CRD) te instantiëren:
cat <<EOF | kubectl apply -f -
apiVersion: "appgw.ingress.k8s.io/v1"
kind: AzureIngressProhibitedTarget
metadata:
name: prod-contoso-com
spec:
hostname: prod.contoso.com
EOF
Met de voorgaande opdracht maakt u een AzureIngressProhibitedTarget
object. Dit object maakt AGIC (versie 0.8.0 en hoger) op de hoogte van het bestaan van de Application Gateway-configuratie voor prod.contoso.com
. Met dit object wordt AGIC ook expliciet geïnstrueerd om te voorkomen dat configuraties met betrekking tot die hostnaam worden gewijzigd.
Een gedeelde Application Gateway-implementatie inschakelen met behulp van een nieuwe AGIC-installatie
Wijzig de helm-config.yaml
sjabloon om AGIC (versie 0.8.0 en hoger) te beperken tot een subset van de Application Gateway-configuratie.
Voeg in de appgw:
sectie een shared
sleutel toe en stel deze in op true
:
appgw:
subscriptionId: <subscriptionId> # existing field
resourceGroup: <resourceGroupName> # existing field
name: <applicationGatewayName> # existing field
shared: true # Add this field to enable shared Application Gateway
Pas de Helm-wijzigingen toe:
Zorg ervoor dat de
AzureIngressProhibitedTarget
CRD is geïnstalleerd:kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/7b55ad194e7582c47589eb9e78615042e00babf3/crds/AzureIngressProhibitedTarget-v1-CRD-v1.yaml
Helm bijwerken:
helm upgrade \ --recreate-pods \ -f helm-config.yaml \ agic-controller oci://mcr.microsoft.com/azure-application-gateway/charts/ingress-azure
Als gevolg hiervan heeft uw AKS-cluster een nieuw exemplaar van AzureIngressProhibitedTarget
de aangeroepen prohibit-all-targets
:
kubectl get AzureIngressProhibitedTargets prohibit-all-targets -o yaml
Het prohibit-all-targets
object verbiedt AGIC om de configuratie voor een host en pad te wijzigen. Helm is geïnstalleerd met appgw.shared=true
AGIC, maar er worden geen wijzigingen aangebracht in Application Gateway.
Machtigingen uitbreiden
Omdat Helm met appgw.shared=true
en de standaardinstelling prohibit-all-targets
blokkeert dat AGIC een configuratie toepast, moet u AGIC-machtigingen uitbreiden:
Maak een nieuw YAML-bestand met de naam
AzureIngressProhibitedTarget
met het volgende fragment dat uw specifieke installatie bevat: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 u uw eigen aangepaste verbod hebt gemaakt, kunt u de standaardinstelling verwijderen. Dit is te breed:
kubectl delete AzureIngressProhibitedTarget prohibit-all-targets
Een gedeelde Application Gateway-implementatie inschakelen voor een bestaande AGIC-installatie
Stel dat u al een werkend AKS-cluster en een Application Gateway-implementatie hebt en dat u AGIC hebt geconfigureerd in uw cluster. U hebt toegangsbeheerobjecten waarvoor prod.contoso.com
het verkeer van het cluster is geslaagd.
U wilt toevoegen staging.contoso.com
aan uw bestaande Application Gateway-implementatie, maar u moet deze hosten op een virtuele machine. U gaat de bestaande Application Gateway-implementatie opnieuw gebruiken en handmatig een listener en back-endpools configureren voor staging.contoso.com
. Maar het handmatig aanpassen van de Application Gateway-configuratie (met behulp van Azure Portal, Resource Manager-API's of Terraform) zou conflicteren met de veronderstellingen van volledig eigendom van AGIC. Kort nadat u wijzigingen hebt toegepast, worden deze door AGIC overschreven of verwijderd.
U kunt AGIC verbieden om wijzigingen aan te brengen in een subset van de configuratie:
Maak een nieuw YAML-bestand met de naam
AzureIngressProhibitedTarget
met behulp van het volgende fragment: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
Het zojuist gemaakte object weergeven:
kubectl get AzureIngressProhibitedTargets
Wijzig de Application Gateway-configuratie vanuit Azure Portal. Voeg bijvoorbeeld listeners, routeringsregels en back-ends toe. Het nieuwe object dat u hebt gemaakt (
manually-configured-staging-environment
) verbiedt AGIC om de Application Gateway-configuratie met betrekking totstaging.contoso.com
.