Azure Kubernetes Service (AKS) propose une fonctionnalité très sympa : les virtual nodes. Ils permettent aux utilisateurs de mettre à l’échelle rapidement leurs applications à l’aide de conteneurs s’exécutant en mode Serverless grâce aux Azure Container Instances.
Les nœuds virtuels assurent un provisionnement rapide des pods et sont facturés à la seconde d’exécution. Ce mode de déploiement est à envisager pour l’exécution d’une application périodiquement tel qu’un traitement batch.

Mise en oeuvre
Cette fonctionnalité implique de gérer soit même la couche réseau du cluster AKS. Chose que, jusqu’à présent, nous n’avions pas faite ! Il va donc falloir créer un vnet et les subnets utilisés par le cluster et nos nodes.
Je commence par créer mon ressource group :
az group create --name rg-Aks --location westus

Je vais utiliser az network vnet create pour créer un réseau virtuel avec un premier sous réseau pour mon cluster.
az network vnet create --resource-group rg-Aks --name vnetAks --address-prefixes 10.0.0.0/8 --subnet-name AksSubnet --subnet-prefix 10.240.0.0/16

Les nœuds virtuels permettent la communication réseau entre les pods qui s’exécutent dans Azure Container Instances (ACI) et le cluster AKS. Pour cela il faut créer un sous réseau dédié au virtual node avec les droits nécessaire à la communication avec le cluster. Mettons ça en pratique !
Je créer tout d’abord un sous réseau supplémentaire pour mon nœud virtuel :
az network vnet subnet create --resource-group rg-Aks --vnet-name vnetAks --name vNodeSubnet --address-prefixes 10.241.0.0/16

Pour déployer mon cluster, j’ai besoin d’un service principal :
az ad sp create-for-rbac --skip-assignment

Pour permettre au cluster d’utiliser le vnet, il faut accorder au service principal utilisé par AKS les droits appropriés.
Tout d’abord, je récupère l’ID de ressource du réseau virtuel de mon cluster :
az network vnet show --resource-group rg-Aks --name AksVnet --query id -o tsv

J’associe ensuite à mon service principal le droit de manipuler ce vnet :
aaz role assignment create --assignee d5fb6d0c-aacf-4a47-9640-65dc313dbd93 --scope /subscriptions/b0863488-158d-4230-8349-af178b11e8e0/resourceGroups/rg-Aks/providers/Microsoft.Network/virtualNetworks/vnetAks
--role Contributor

Maintenant j’ai besoin de l’identifiant de mon sous réseau (automatiquement créé avec mon vnet) :
az network vnet subnet show --resource-group rg-Aks --vnet-name vnetAks --name AksSubnet --query id -o tsv
Je peux désormais créer mon cluster AKS. Le paramètre –vnet-subnet-id est à renseigner avec la valeur récupérée avec la commande juste au dessus. service-principal et –client-secret sont à renseigner avec les informations du service principal créé précédement :
az aks create --resource-group rg-Aks --name aksWithAci --node-count 1 --network-plugin azure --service-cidr 10.0.0.0/16 --dns-service-ip 10.0.0.10 --docker-bridge-address 172.17.0.1/16 --vnet-subnet-id /subs
criptions/b0863488-158d-4230-8349-af178b11e8e0/resourceGroups/rg-Aks/providers/Microsoft.Network/virtualNetworks/vnetAks/subnets/AksSubnet --service-principal d5fb6d0c-aacf-4a47-9640-65dc313dbd93 --client-secret a9984c63-e7aa-4167-afba-c
b76c3ffe96d

Je vais maintenant activer les nœuds virtuels en renseignant le sous-réseau créé tout à l’heure :
az aks enable-addons --resource-group rg-Aks --name aksWithAci --addons virtual-node --subnet-name vNodeSubnet

Je peux maintenant me connecter à mon cluster avec un :
az aks get-credentials --resource-group rg-aks --name aksWithAci
Un kubectl get nodes montrent bien que nous avons deux nodes de provisionné. Le noeud virtuel se nomme “virtual-node-aci-linux”.
Je vais à présent pouvoir y déployer l’application hébergée ici avec le yaml stocké au même endroit !

La partie importante du yaml est celle-ci :

Je cible mon virtual node grâce au mécanisme des tolerations présenté dans cet article et en précisant un nodeselector de type virtual-kubelet.
Si j’accède à l’URL récupéré ci-dessus avec un kubectl get services je constate que tout fonctionne comme dans un “vrai” node AKS !

Mon application est bien opérationnelle 🙂
A très vite
Thomas