Personnaliser la configuration des nœuds pour les pools de nœuds Azure Kubernetes service (AKS)

La personnalisation de la configuration de votre nœud vous permet d’ajuster les paramètres du système d’exploitation (OS) ou les paramètres kubelet pour répondre aux besoins de vos charges de travail. Lorsque vous créez un cluster AKS ou ajoutez un pool de nœuds à votre cluster, vous pouvez personnaliser un sous-ensemble de paramètres de système d’exploitation et kubelet couramment utilisés. Pour configurer des paramètres au-delà de ce sous-ensemble, vous pouvez utiliser un ensemble de démons pour personnaliser vos configurations nécessaires sans perdre la prise en charge AKS de vos nœuds.

Créer un cluster AKS avec une configuration de nœud personnalisée

Création d’un fichier de configuration

Les modifications de configuration du système d’exploitation et de kubelet nécessitent que vous créiez un fichier de configuration avec les paramètres et les réglages souhaités. Si la valeur d’un paramètre n’est pas spécifiée, alors elle est définie sur la valeur par défaut.

Configuration de kubelet

Créez un fichier linuxkubeletconfig.json avec le contenu suivant :

{
 "cpuManagerPolicy": "static",
 "cpuCfsQuota": true,
 "cpuCfsQuotaPeriod": "200ms",
 "imageGcHighThreshold": 90,
 "imageGcLowThreshold": 70,
 "topologyManagerPolicy": "best-effort",
 "allowedUnsafeSysctls": [
  "kernel.msg*",
  "net.*"
],
 "failSwapOn": false
}

Configuration du système d’exploitation

Créez un fichier linuxosconfig.json avec le contenu suivant :

{
 "transparentHugePageEnabled": "madvise",
 "transparentHugePageDefrag": "defer+madvise",
 "swapFileSizeMB": 1500,
 "sysctls": {
  "netCoreSomaxconn": 163849,
  "netIpv4TcpTwReuse": true,
  "netIpv4IpLocalPortRange": "32000 60000"
 }
}

Créer un cluster à l’aide de fichiers config personnalisés

Lorsque vous créez un cluster, vous pouvez utiliser les fichiers de configuration personnalisés créés dans les étapes précédentes pour spécifier la configuration kubelet, la configuration du système d’exploitation ou les deux.

Notes

Si vous spécifiez une configuration lors de la création d’un cluster, cette configuration sera appliquée uniquement aux nœuds du pool de nœuds initial. Les paramètres qui ne sont pas configurés dans le fichier JSON conservent la valeur par défaut. CustomLinuxOsConfig n’est pas pris en charge pour le type de système d’exploitation : Windows.

Créez un cluster à l’aide des fichiers de configuration personnalisés, en utilisant la commande az aks create et en spécifiant vos fichiers de configuration. L’exemple de commande suivant crée un cluster avec les fichiers personnalisés ./linuxkubeletconfig.json et ./linuxosconfig.json :

az aks create --name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json --linux-os-config ./linuxosconfig.json

Ajouter un pool de nœuds à l’aide de fichiers config personnalisés

Lorsque vous ajoutez un pool de nœuds à un cluster, vous pouvez utiliser le fichier config personnalisé créé à l’étape précédente pour spécifier la configuration Kubelet. CustomKubeletConfig est pris en charge pour les pools de nœuds Linux et Windows.

Notes

Lorsque vous ajoutez un pool de nœuds Linux à un cluster existant, vous pouvez spécifier la configuration Kubelet, la configuration du système d’exploitation ou les deux. Lorsque vous ajoutez un pool de nœuds Windows à un cluster existant, vous pouvez spécifier uniquement la configuration Kubelet. Si vous spécifiez une configuration lors de l’ajout d’un pool de nœuds, cette configuration sera appliquée uniquement aux nœuds du nouveau pool de nœuds. Les paramètres qui ne sont pas configurés dans le fichier JSON conservent la valeur par défaut.

az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json

Autres configurations

Vous pouvez utiliser les paramètres suivants pour modifier d’autres paramètres du système d’exploitation :

Message du jour

Transmettez l’indicateur --message-of-the-day avec l’emplacement du fichier pour remplacer le message du jour sur les nœuds Linux lors de la création du cluster ou du pool de nœuds.

az aks create --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt
Création du pool de nœuds
az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt

Résolution des problèmes liés aux configurations de nœuds personnalisées

Vérification de l’application des paramètres

Après avoir appliqué une configuration de nœuds personnalisée, vous pouvez confirmer que les paramètres ont été appliqués aux nœuds. Pour cela, connectez-vous à l’hôte et vérifiez sysctl ou validez que les modifications de la configuration ont été apportées au système de fichiers.

Paramètres pris en charge par la configuration de nœud personnalisée

Configuration personnalisée kubelet

La configuration personnalisée Kubelet est prise en charge pour les pools de nœuds Linux et Windows. Les paramètres pris en charge diffèrent et sont documentés ci-dessous.

Configuration personnalisée Kubelet Linux

Paramètre Valeurs autorisées/intervalle Default Description
cpuManagerPolicy none, static aucun La stratégie statique permet aux conteneurs se trouvant dans des pods garantis avec des requêtes d’UC entières d’accéder aux UC exclusives sur le nœud.
cpuCfsQuota true, false true Active/désactive la mise en application du quota CFS de l’UC pour les conteneurs qui spécifient des limites d’UC.
cpuCfsQuotaPeriod intervalle en millisecondes (ms) 100ms Définit la valeur de la période du quota CFS de l’UC.
imageGcHighThreshold 0-100 85 % Pourcentage d’utilisation du disque après lequel le nettoyage de la mémoire d’images est toujours exécuté. Utilisation minimale du disque qui déclenchera le nettoyage de la mémoire. Pour désactiver le nettoyage de la mémoire d’images, définissez sur 100.
imageGcLowThreshold 0 à 100, pas plus que imageGcHighThreshold 80 Pourcentage d’utilisation du disque avant lequel le nettoyage de la mémoire d’images n’est jamais exécuté. Utilisation minimale du disque qui peut déclencher le nettoyage de la mémoire.
topologyManagerPolicy none, best-effort, restricted, single-numa-node aucun Optimisez l’alignement des nœuds NUMA. En savoir plus ici.
allowedUnsafeSysctls kernel.shm*, kernel.msg*, kernel.sem, fs.mqueue.*, net.* Aucun Liste autorisée de modèles sysctls ou sysctl non sécurisés.
containerLogMaxSizeMB Taille en mégaoctets (Mo) 50 Taille maximale (10 Mo, par exemple) d’un fichier journal de conteneur avant sa rotation.
containerLogMaxFiles ≥ 2 5 Nombre maximal de fichiers journaux de conteneur pouvant être présents pour un conteneur.
podMaxPids De -1 à la limite PID du noyau -1 (∞) Quantité maximale d’ID de processus pouvant s’exécuter dans un pod
seccompDefault Unconfined, RuntimeDefault Unconfined Définit le profil seccomp par défaut pour toutes les charges de travail. RuntimeDefault utilise le profil seccomp de containerD par défaut, qui restreint certains appels système afin d’améliorer la sécurité. Les syscalls restreints échoueront. Unconfined n’impose aucune restriction sur les syscalls, et tous les appels système sont autorisés, ce qui réduit la sécurité. Pour plus de détails, consultez le profil seccomp de containerD default. Ce paramètre est toujours en préversion. Inscrivez l’indicateur de fonctionnalité « KubeletDefaultSeccompProfilePreview » à l’aide de la commande az feature register avec --namespace « Microsoft.ContainerService ».

Configuration personnalisée de Windows Kubelet

Paramètre Valeurs autorisées/intervalle Default Description
imageGcHighThreshold 0-100 85 % Pourcentage d’utilisation du disque après lequel le nettoyage de la mémoire d’images est toujours exécuté. Utilisation minimale du disque qui déclenchera le nettoyage de la mémoire. Pour désactiver le nettoyage de la mémoire d’images, définissez sur 100.
imageGcLowThreshold 0 à 100, pas plus que imageGcHighThreshold 80 Pourcentage d’utilisation du disque avant lequel le nettoyage de la mémoire d’images n’est jamais exécuté. Utilisation minimale du disque qui peut déclencher le nettoyage de la mémoire.
containerLogMaxSizeMB Taille en mégaoctets (Mo) 10 Taille maximale (10 Mo, par exemple) d’un fichier journal de conteneur avant sa rotation.
containerLogMaxFiles ≥ 2 5 Nombre maximal de fichiers journaux de conteneur pouvant être présents pour un conteneur.

Paramètres de configuration du système d’exploitation personnalisé Linux

Important

Pour faciliter la recherche et la lisibilité, les paramètres du système d’exploitation s’affichent dans cet article par leur nom, mais doivent être ajoutés au fichier configuration JSON ou à l’API AKS en utilisant la convention de mise en majuscules camelCase.

Par exemple, si vous modifiez le paramètre « vm.max_map_count », vous devez reformater en « vmMaxMapCount » dans le fichier JSON de configuration.

Limites de traitement des fichiers

Lorsque le trafic est important, il est généralement dû à un grand nombre de fichiers locaux. Vous pouvez ajuster les paramètres du noyau et les limites intégrées ci-dessous pour vous permettre d’en gérer davantage, au détriment d’une partie de la mémoire système.

Paramètre Valeurs autorisées/intervalle Default Description
fs.file-max 8192 à 12000500 709620 Nombre maximal de traitements de fichiers que le noyau Linux allouera. En augmentant cette valeur, vous pouvez augmenter le nombre maximal de fichiers ouverts autorisés.
fs.inotify.max_user_watches 781250 à 2097152 1 048 576 Nombre maximal d’espions de fichiers autorisés par le système. Chaque espion fait approximativement 90 octets sur un noyau de 32 bits, et environ 160 octets sur un noyau de 64 bits.
fs.aio-max-nr 65536 à 6553500 65536 aio-nr indique le nombre actuel de requêtes io asynchrones à l’échelle du système. aio-max-nr vous permet de modifier la valeur maximale qu’aio-nr peut atteindre.
fs.nr_open 8192 à 20000500 1 048 576 Nombre maximal de traitements de fichier pouvant être alloués par un processus.

Réglage du socket et du réseau

Pour les nœuds d’agent, qui sont censés gérer un très grand nombre de sessions simultanées, vous pouvez utiliser le sous-ensemble d’options TCP et réseau ci-dessous, que vous pouvez ajuster par pool de nœuds.

Paramètre Valeurs autorisées/intervalle Default Description
net.core.somaxconn 4096 à 3240000 16384 Nombre maximal de demandes de connexion qui peuvent être mises en file d’attente pour un socket d’écoute donné. Limite supérieure pour la valeur du paramètre backlog passé à la fonction listen(2). Si l’argument du backlog est supérieur à somaxconn, il est tronqué en mode silencieux à cette limite.
net.core.netdev_max_backlog 1000 à 3240000 1 000 Nombre maximal de paquets, mis en file d’attente côté ENTRÉE, lorsque l’interface reçoit des paquets plus rapidement que le noyau ne peut les traiter.
net.core.rmem_max 212992 à 134217728 212992 Taille maximale de la mémoire tampon du socket de réception, en octets.
net.core.wmem_max 212992 à 134217728 212992 Taille maximale de la mémoire tampon du socket d’envoi, en octets.
net.core.optmem_max 20480 à 4194304 20480 Taille maximale de la mémoire tampon auxiliaire (mémoire tampon facultative) autorisée par socket. La mémoire facultative du socket est utilisée dans certains cas pour stocker des structures supplémentaires relatives à l’utilisation du socket.
net.ipv4.tcp_max_syn_backlog 128 à 3240000 16384 Nombre maximal de demandes de connexion mises en file d’attente qui n’ont toujours pas reçu d’accusé de réception de la part du client qui se connecte. Si ce nombre est dépassé, le noyau commence à annuler les demandes.
net.ipv4.tcp_max_tw_buckets 8000 à 1440000 32 768 Nombre maximal de sockets timewait détenus simultanément par le système. Si ce nombre est dépassé, le socket time-wait est immédiatement détruit et l’avertissement est imprimé.
net.ipv4.tcp_fin_timeout 5 à 120 60 Durée pendant laquelle une connexion orpheline (qui n’est plus référencée par une application) restera à l’état FIN_WAIT_2 avant d’être abandonnée à l’extrémité locale.
net.ipv4.tcp_keepalive_time 30 à 432000 7200 Fréquence à laquelle TCP envoie des messages keepalive lorsque keepalive est activée.
net.ipv4.tcp_keepalive_probes 1 à 15 9 Nombre de sondes keepalive que TCP envoie, jusqu’à ce qu’il décide que la connexion est rompue.
net.ipv4.tcp_keepalive_intvl 10 – 90 75 Fréquence à laquelle les sondes sont envoyées. Multipliée par tcp_keepalive_probes, elle constitue le temps nécessaire pour tuer une connexion qui ne répond pas, après le démarrage des sondes.
net.ipv4.tcp_tw_reuse 0 ou 1 0 Permet de réutiliser les sockets TIME-WAIT pour les nouvelles connexions lorsque cela est sûr du point de vue du protocole.
net.ipv4.ip_local_port_range Premier : 1024 – 60999 et Dernier : 32768 – 65535] Premier : 32768 et Dernier : 60999 Plage de ports locaux utilisée par le trafic TCP et UDP pour choisir le port local. Composée de deux nombres : Le premier numéro est le premier port local autorisé pour le trafic TCP et UDP sur le nœud de l’agent, le deuxième est le dernier numéro de port local.
net.ipv4.neigh.default.gc_thresh1 128 à 80000 4096 Nombre minimal d’entrées pouvant figurer dans le cache ARP. Le nettoyage de la mémoire ne sera pas déclenché si le nombre d’entrées est inférieur à ce paramètre.
net.ipv4.neigh.default.gc_thresh2 512 à 90000 8 192 Nombre maximum relatif d’entrées pouvant figurer dans le cache ARP. Ce paramètre est sans doute le plus important, car le nettoyage de la mémoire ARP sera déclenché environ cinq secondes après avoir atteint ce maximum relatif.
net.ipv4.neigh.default.gc_thresh3 1024 à 100000 16384 Nombre maximum absolu d’entrées pouvant figurer dans le cache ARP.
net.netfilter.nf_conntrack_max 131072 – 2097152 131 072 nf_conntrack est un module qui effectue le suivi des entrées de connexion pour NAT dans Linux. Le module nf_conntrack utilise une table de hachage pour enregistrer la ligne de la nf_conntrack du protocole TCP. nf_conntrack_max est le nombre maximal de nœuds dans la table de hachage, autrement dit, le nombre maximal de connexions prises en charge par le module nf_conntrack ou la taille de la table de suivi des connexions.
net.netfilter.nf_conntrack_buckets 65536 – 524288 65536 nf_conntrack est un module qui effectue le suivi des entrées de connexion pour NAT dans Linux. Le module nf_conntrack utilise une table de hachage pour enregistrer la ligne de la nf_conntrack du protocole TCP. nf_conntrack_buckets est la taille de la table de hachage.

Limites du rôle de travail

Tout comme les limites de descripteurs de fichiers, le nombre de rôles de travail ou de threads qu’un processus peut créer est limité à la fois par un paramètre de noyau et par des limites utilisateur. La limite utilisateur sur AKS est illimitée.

Paramètre Valeurs autorisées/intervalle Default Description
kernel.threads-max 20 à 513785 55601 Les processus peuvent faire tourner des threads de travail. Le nombre maximal de tous les threads pouvant être créés est défini avec le paramètre de noyau kernel.threads-max.

Mémoire virtuelle

Les paramètres ci-dessous peuvent être utilisés pour régler le fonctionnement du sous-système de mémoire virtuelle du noyau Linux et le writeout de données incorrectes sur le disque.

Paramètre Valeurs autorisées/intervalle Default Description
vm.max_map_count 65530 à 262144 65530 Ce fichier contient le nombre maximal de zones de carte mémoire qu’un processus peut avoir. Les zones de carte mémoire sont utilisées comme un effet secondaire de l’appel de malloc, directement par mmap, mprotect et madvise, ainsi que lors du chargement de bibliothèques partagées.
vm.vfs_cache_pressure 1 - 100 100 Cette valeur de pourcentage contrôle la tendance du noyau à récupérer la mémoire, qui est utilisée pour la mise en cache des objets inodes et du répertoire.
vm.swappiness 0 - 100 60 Ce contrôle permet de définir l’agressivité du noyau pour l’échange des pages de mémoire. Des valeurs plus élevées augmentent l’agressivité, des valeurs plus faibles diminuent la quantité d’échange. La valeur 0 indique au noyau de ne pas lancer l’échange tant que le nombre de pages libres et sauvegardées est inférieur à la limite supérieure d’une zone.
swapFileSizeMB 1 Mo : taille du disque temporaire (/dev/sdb) Aucun SwapFileSizeMB spécifie la taille en Mo d’un fichier d’échange qui sera créé sur les nœuds d’agent à partir de ce pool de nœuds.
transparentHugePageEnabled always, madvise, never always Transparent Hugepages est une fonctionnalité du noyau Linux destinée à améliorer les performances en optimisant l’utilisation du matériel de cartographie de la mémoire de votre processeur. Lorsque cette option est activée, le noyau tente d’allouer des hugepages chaque fois que cela est possible, et tout processus Linux reçoit des pages de 2 Mo si la région mmap est naturellement alignée sur 2 Mo. Dans certains cas, lorsque les hugepages sont activées pour l’ensemble du système, les applications peuvent finir par allouer plus de ressources mémoire. Une application peut mmap une grande région, mais ne toucher qu’un octet de celle-ci. Dans ce cas, une page de 2 Mo peut être allouée à la place d’une page de 4 ko sans raison valable. C’est pourquoi il est possible de désactiver les hugepages à l’échelle du système ou de ne les avoir qu’à l’intérieur des régions MADV_HUGEPAGE madvise.
transparentHugePageDefrag always, defer, defer+madvise, madvise, never madvise Cette valeur détermine si le noyau doit utiliser de manière intensive la compression de la mémoire pour rendre plus de hugepages disponibles.

Étapes suivantes