Transformation digitale
Stabilité dans le pool de nœuds Kubernetes : Le défi avec les Cronjobs
Les tâches cron dans Kubernetes peuvent déstabiliser les pools de nœuds. Des stratégies d'optimisation sont appliquées, mais des problèmes ouverts persistent. Comment gère-t-on cela ?
11 mai 2023
Optimisation 1: Pool de nœuds dédié aux tâches cron
Nous avons donc attribué un pool de nœuds dédié aux tâches cron, les séparant ainsi de toutes les autres applications. Nous avons fait cela avec NodeSelectors. Les NodeSelectors veillent à ce que les conteneurs ne soient déployés que là où ils sont autorisés. Ils réagissent aux étiquettes des pools de nœuds. Nous avons donc défini une étiquette “Cronjob: autorisé” sur un nouveau pool de nœuds. Et les tâches cron ont reçu le NodeSelector suivant.
Ainsi, les cronjobs ne sont créés que sur les nœuds ayant l'étiquette « cronjob: allowed ». Sinon, rien ne s'y passe. Pourquoi? Parce que nous avons tous nos applications avec des NodeSelectors et les forçons à s'exécuter sur leurs pools de nœuds assignés. Un pool de nœuds pour les cronjobs, un pool de nœuds pour les clients et un pool de nœuds pour les applications nécessitant tous les mêmes ressources, telles que l'IAM, etc.
Cela a été utile et a apaisé la conscience. Mais rapidement, il a été clair que cela n'avait pas vraiment aidé. Les nœuds dans le pool de nœuds pour les cronjobs avaient toujours les mêmes problèmes et devenaient instables. La seule solution a été de nettoyer ces nœuds, de les supprimer et de permettre au pool de nœuds de générer automatiquement de nouveaux nœuds.
Pour éviter un travail manuel, nous devions penser à autre chose. La solution était évidente : nous devons abolir ces cronjobs !
Optimisation 2 : Plus de cronjobs !
Ne plus avoir de cronjobs serait agréable. Malheureusement, nous n'avons pas trouvé de solution pour supprimer les cronjobs. J'aurais aimé vous dire qu'un cronjob ” ” “ ” “ ” n'est plus nécessaire. Mais pour nous, il l'est toujours. Nous avons trouvé une solution pour que les cronjobs ne soient plus gérés par le cluster, ce qui élimine ainsi toute instabilité.
Nous avons une application centrale qui connaît tous les espaces de travail. Dès le début, nous avons eu cette gestion centrale. Maintenant, nous permettons à tous les espaces de travail de notifier qu'un cronjob doit être exécuté. Chaque espace de travail a une API qui lance le cronjob mentionné dans le shell. Cela augmente la charge sur l'espace de travail, mais la plupart du temps il ne se passe rien car il n'y a rien à faire.
Nous obtenons ainsi le même effet que avec des déploiements de cronjobs séparés. Cela permet d'éviter une charge excessive sur notre cluster due au démarrage fréquent de cronjobs.
Encore plus de potentiel d'optimisation
Malheureusement, cette solution a un inconvénient. Elle ne fonctionne que tant que nous avons moins de 300 clients : Une requête vers un espace de travail pour démarrer un cronjob prend environ 200ms. Dans une minute, nous pouvons donc démarrer jusqu'à 300 cronjobs. Ensuite, l'action de démarrer tous les cronjobs prend plus d'une minute et nous avons un décalage, un cronjob ne s'exécute plus toutes les minutes, mais un peu moins souvent.
Mais on peut aussi gérer cela… on peut exécuter les requêtes vers les espaces de travail dans des processus parallèles. Mais nous en parlerons une autre fois.
Sommes-nous les seuls à avoir des nœuds instables en raison des cronjobs ?
Comment gérez-vous les cronjobs lorsque de nombreuses applications veulent lancer un cronjob en même temps ?
Derniers articles
Ici, vous trouverez une liste des tous nos derniers articles. Découvrez les dernières nouvelles et mises à jour.
Rester en contact