Configurer l’Application Gateway pour un cluster Kubernetes sous Azure

Application Gateway Ingress Controller

L'Application Gateway Ingress Controller (AGIC) permet d’utiliser une Azure Application Gateway comme contrôleur d’entrée d’un Azure Kubernetes Service. Il applique automatiquement les configurations des ressources d’entrées (Ingress ressource) du cluster Kubernetes en règles dans l’Application Gateway. Cette dernière prend la responsabilité du contrôle d’accès au service du Kubernetes ainsi que l’équilibre des charges entre les pods du Kubernetes.

Le schéma ci-dessous décrit les échanges entre l’Application Gateway et le cluster Kubernetes :

Configurer l’Application Gateway Ingress Controller pour un cluster Kubernetes sous Azure

Prérequis au tutoriel

Afin de pouvoir scripter et automatiser les déploiements, l’ensemble des configurations dans ce tutoriel sera en lignes de commande sous un shell linux.

Les prés-requis pour suivre ce tutoriel sont :

  • Azure CLI installé
  • Azure CLI connecté à votre souscription Azure (avec la commande azure login)
  • Kubectl d’installation

La fonctionnalité IngressApplicationGateway doit être activée via la commande suivante :

az feature register \
--name AKS-IngressApplicationGatewayAddon \
--namespace Microsoft.ContainerService

L’activation peut prendre plusieurs minutes. La commande suivante permet de suivre le statut de l’activation :

az feature list \
-o table \
--query "[?contains(name, 'Microsoft.ContainerService/AKS-IngressApplicationGatewayAddon')].{Name:name,State:properties.state}"

La fonctionnalité doit être en statut “Registered” :

Configurer l’Application Gateway Ingress Controller pour un cluster Kubernetes sous Azure

Une fois la fonctionnalité de l’Ingress Application Gateway enregistrée, rafraîchir l'enregistrement du fournisseur de ressource Microsoft.Container Service avec la commande suivante :

az provider register --namespace Microsoft.ContainerService

Installation et configuration de l'application Gateway et du kubernetes

Paramétrage des ressources Azure

L’ensemble des paramètres utilisés pour configurer les ressources azure sont variabilités afin de pouvoir s’adapter au contexte. Initialiser les valeurs des paramètres avec la commande suivante (en les adaptant au contexte) :

# Localisation de toutes les ressources
LOCALISATION_CODE='francecentral'

# Groupe de ressources pour le cluster kubernetes
AKS_RESSOURCE_GROUP_NAME=RG_KUBERNETES_CLUSTER

# Groupe de ressources pour les noeuds du cluster kubernetes (ne doit pas être créé manuellement)
AKS_NODE_RESSOURCE_GROUP_NAME='RG_KUBERNETES_CLUSTER_NODE'

# Groupe de ressources pour l'application gateway
APP_GATEWAY_RESSOURCE_GROUP_NAME=RG_APP_GATEWAY

# Nom de l’Ip public de l'application gateway
APP_GATEWAY_PUBLIC_ID_NAME='appgtw-ip'

# Nom du VNet et subnet de l'application gateway
APP_GATEWAY_VNET_NAME='vnet_appgtw'
APP_GATEWAY_SUBNET_NAME='vnet_appgtw_subnet'

# Nom du VNet et subnet du cluster kubernetes
KUB_CLUSTER_VNET_NAME='vnet_aks'
KUB_CLUSTER_SUBNET_NAME='vnet_aks_subnet'

# Nom de l'app gateway
APP_GATEWAY_NAME='APPGTW'

# Nom du cluster kubernetes
AKS_NAME='aks'

# Type de VM pour le noeud Kubernetes
AKS_NODE_VM_SIZE='Standard_DS2_v2'

# Taille disque pour le noeud Kubernetes (entre 30Gb et 2048GB)
AKS_NODE_OSDISK_SIZE='64'

# Nombre de noeud sur le cluster kubernetes
AKS_NODE_COUNT='1'

# Adresse Prefix du VNet de l'app gateway
# les vnet de l’app gateway et du cluster kubernetes ne doivent pas se chevaucher
APP_GATEWAY_VNET_ADDRESS_PREFIX='10.254.0.0/16'

# Adresse Prefix du sous réseau de l'app gateway
APP_GATEWAY_SUNET_ADDRESS_PREFIX='10.254.3.0/24'

# Adresse Prefix du VNet du cluster kubernetes
AKS_VNET_ADDRESS_PREFIX='11.0.0.0/8'

# Adresse Prefix du sous réseau du cluster kubernetes
AKS_SUNET_ADDRESS_PREFIX='11.240.0.0/16'

Créer les groupes de ressources s'ils n'existent pas avec la commande suivante :

az group create --location $LOCALISATION_CODE --name $AKS_RESSOURCE_GROUP_NAME
az group create --location $LOCALISATION_CODE --name $APP_GATEWAY_RESSOURCE_GROUP_NAME

NB : Le groupe de ressource des nœuds du Kubernetes ne doit pas être existant !

Création du réseau et sous-réseau pour l'Application Gateway

Créer l’IP public qui sera rattaché à l’Application Gateway via la commande suivante :

az network public-ip create \
-n $APP_GATEWAY_PUBLIC_ID_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--allocation-method Static \
--sku Standard

Créer le VNet pour l’Application Gateway via la commande suivante :

az network vnet subnet create \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--vnet-name $APP_GATEWAY_VNET_NAME \
--name $APP_GATEWAY_SUBNET_NAME \
--address-prefixes $APP_GATEWAY_SUNET_ADDRESS_PREFIX

Créer le subnet de l’Application Gateway via la commande suivante :

az network vnet subnet create \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--vnet-name $APP_GATEWAY_VNET_NAME \
--name $APP_GATEWAY_SUBNET_NAME \
--address-prefixes $APP_GATEWAY_SUNET_ADDRESS_PREFIX

NB : Seule l'app Gateway peut être rattachée à ce sous-réseau.

Création du réseau / sous-réseau pour le service Kubernetes (AKS)

Créer du VNet pour le cluster Kubernetes via la commande suivante :

az network vnet create \
-n $KUB_CLUSTER_VNET_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--address-prefix $AKS_VNET_ADDRESS_PREFIX

Créer le subnet pour le cluster kubernetes via la commande suivante :

az network vnet subnet create \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--vnet-name $KUB_CLUSTER_VNET_NAME \
--name $KUB_CLUSTER_SUBNET_NAME \
--address-prefixes $AKS_SUNET_ADDRESS_PREFIX

NB : Seul le cluster Kubernetes peut être rattaché à ce sous-réseau.

Création de l'application Gateway

L’application gateway doit être de type Standard V2 afin de pouvoir y activer l’AGIC.
La commande suivante crée l’application gateway rattachée au sous-réseau précédemment créé :

az network application-gateway create \
-n $APP_GATEWAY_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
-l $LOCALISATION_CODE \
--sku Standard_v2 \
--public-ip-address $APP_GATEWAY_PUBLIC_ID_NAME \
--vnet-name $APP_GATEWAY_VNET_NAME \
--subnet $APP_GATEWAY_SUBNET_NAME

Création du service Kubernetes (AKS)

Lors de la création du cluster Kubernetes sous Azure, son rattachement à un sous-réseau s'effectue via l4ID de celui-ci.

La commande suivante récupère l’ID du sous-réseau créé précédemment destiné au cluster Kubernetes :

KUB_CLUSTER_SUBNET_ID=$(\
az network vnet subnet show \
--resource-group $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--vnet-name $KUB_CLUSTER_VNET_NAME \
--name $KUB_CLUSTER_SUBNET_NAME \
--query "id" \
--output tsv \
)

La création d'un cluster Kubernetes est faite via la commande suivante :

az aks create \
-n $AKS_NAME \
-g $AKS_RESSOURCE_GROUP_NAME \
--network-plugin azure \
--vnet-subnet-id $KUB_CLUSTER_SUBNET_ID \
--node-count $AKS_NODE_COUNT \
--node-resource-group $AKS_NODE_RESSOURCE_GROUP_NAME \
--node-osdisk-size $AKS_NODE_OSDISK_SIZE \
--node-vm-size $AKS_NODE_VM_SIZE \
--enable-managed-identity \
--generate-ssh-keys

Activation de l'extension AGIC entre le service Kubenetes et l'application Gateway

L’activation de l’AGIC est effectuée via la commande suivante :

# Récupération de l'ID de l'application gateway
APP_GATEWAY_ID=$(az network application-gateway show -n $APP_GATEWAY_NAME -g $APP_GATEWAY_RESSOURCE_GROUP_NAME -o tsv --query "id")
az aks enable-addons \
-n $AKS_NAME \
-g $AKS_RESSOURCE_GROUP_NAME \
-a ingress-appgw \
--appgw-id $APP_GATEWAY_ID

Lier le réseau de l'application Gateway à celui du service Kubernetes

Comme dit précédemment, l’Application Gateway et le cluster Kubernetes doivent avoir leur propre réseau. Cependant, afin que les configurations et les flux entrants et sortants puissent passer entre eux, leurs réseaux doivent pouvoir communiquer ensemble.

La commande suivante lie les deux réseaux :

APP_GW_ToAKS_PEERING_NAME='AppGWtoAKSVnetPeering'
AKS_TO_APP_GW_PEERING_NAME='AksToAppGWVnetPeering'

AKS_VNET_ID=$( \
az network vnet show \
-n $KUB_CLUSTER_VNET_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
-o tsv \
--query "id"\
)

APP_GATEWAY_VNET_ID=$(\
az network vnet show \
-n $APP_GATEWAY_VNET_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \_
-o tsv \
--query "id"\
)

# lier le vnet de l'app gateway vers le vnet du cluster kubernetes
az network vnet peering create \
-n $APP_GW_ToAKS_PEERING_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--vnet-name $APP_GATEWAY_VNET_NAME \
--remote-vnet $AKS_VNET_ID \
--allow-vnet-access

# lier le vnet du cluster kubernetes vers le vnet de l'app gateway
az network vnet peering create \
-n $AKS_TO_APP_GW_PEERING_NAME \
-g $APP_GATEWAY_RESSOURCE_GROUP_NAME \
--vnet-name $KUB_CLUSTER_VNET_NAME \
--remote-vnet $APP_GATEWAY_VNET_ID \
--allow-vnet-access

Test final de la communication entre l'Application Gateway et le Kubernetes

Déploiement d'une application simple de test

Pour tester la communication entre l'Application Ggateway et le cluster Kubernetes, cette partie permet de déployer une application en utilisant l'AGIC.

Avant de pouvoir lancer une application sur le cluster Kubernetes, il faut récupérer les crédentiels de celui-ci via la commande suivante :

az aks get-credentials -n $AKS_NAME -g $AKS_RESSOURCE_GROUP_NAME

La commande suivante permet de déployer une application simple pour tester l’infrastructure :

kubectl apply -f https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml

Test d'accès à l'application web

Afin de pouvoir naviguer vers l’application précédemment déployée, la commande permettant de récupérer l’IP d’accès à l’application via l’Application Gateway est celle-ci :

kubectl get ingress

Le résultat de la commande est la suivante :

Configurer l’Application Gateway Ingress Controller pour un cluster Kubernetes sous Azure

Afin d’accéder à l’application, naviguer sur l’IP présent dans la colonne ADRESSE. Le résultat est le suivant :

Configurer l’Application Gateway Ingress Controller pour un cluster Kubernetes sous Azure

Un projet Business Apps ? Nos développeurs Business Apps sont à votre écoute ! Contactez-nous !