1 votes

Kubelet virtuel : sélection des nœuds en mode scale-out et scale-in

Nous avons un cluster Kubernetes simple à 3 nœuds sur Azure Kubernetes Service (AKS). La plupart du temps, cette infrastructure est plus que suffisante, mais il arrive que nous devions être en mesure de passer à 50 instances d'un service pendant quelques heures, puis de revenir en arrière.

Combiner AKS avec Azure Container Instances (ACI) via le Virtual Kubelet semble être une solution idéale pour ce scénario.

Du point de vue de la gestion des coûts, nous préférerions que les choses fonctionnent sur notre VMs s'il y a de la capacité disponible. Nous les payons déjà, il est donc inutile de payer aussi des instances ACI.

Question 1

Si nous effectuons une mise à l'échelle via le Kubelet virtuel en utilisant ACI, comment Kubernetes choisit-il les pods à mettre à l'échelle ? arrière plus tard ? Son approche est-elle cohérente avec notre exigence de gestion des coûts - c'est-à-dire que les nœuds "authentiques" sont préférés - ou pourrait-on la rendre cohérente ?

Question 2

Scénario : nous exécutons deux applications - "App1" et "App2" - dans Kubernetes. App1 est celle qui entraîne le besoin de passer à 50 instances via ACI ; App2 s'exécute sur les noeuds "authentiques".

Disons que nous utilisons ensuite Helm pour mettre à jour App2 . Quand il redémarre, je suppose que Kubernetes podría le placer sur une instance ACI puisque nous sommes à l'échelle à ce stade.

Par la suite, le besoin des 50 instances de App1 s'en va et on réduit à nouveau.

App2 s'exécuteraient encore sur des instances ACI alors que nous préférerions qu'elles soient à nouveau sur des nœuds authentiques à ce stade.

Kubernetes pourrait-il gérer cela conformément à nos exigences en matière de gestion des coûts, ou un encadrement supplémentaire est-il nécessaire ?

2voto

Chris Wood Points 31

Répondre à ma propre question - un PreferNoSchedule sur le Kubelet virtuel empêchera les pods d'être programmés sur les ressources les plus coûteuses lors de la mise à l'échelle. arriba mais le planificateur n'est pas impliqué dans la mise à l'échelle. en bas .

La "victime" est choisie à l'issue des tests suivants :

  1. Pod non assigné vs assigné
  2. Statut du pod
  3. Préparation du pod
  4. Récence de la préparation de la nacelle
  5. Comptes de redémarrage des pods
  6. Temps de création du pod

Siehe:

https://github.com/kubernetes/kubernetes/blob/886e04f1fffbb04faf8a9f9ee141143b2684ae68/pkg/controller/controller_utils.go#L726

En bref, il n'y a pas de véritable moyen de contrôler les victimes dans un scénario de réduction d'échelle sans recourir à des approches fantaisistes et à des conditions de course.

Au final, nous avons pris un chemin différent : avoir deux déploiements différents de la même application et une tare sur le Kubelet virtuel :

  1. Un déploiement qui n'a pas de tolérance pour l'altération de Virtual Kubelet - répliques min. de 1 et répliques max. de 5.

  2. Un autre déploiement qui a une tolérance pour la tare de Virtual Kubelet et aussi un nodeSelector pour elle. Le nombre de répliques par défaut est de 0 mais nous pouvons évidemment le faire évoluer si nécessaire.

En dehors de cela, nous avons notre propre microservice en cours d'exécution qui surveille la longueur d'une file d'attente Azure Service Bus et prend des décisions de mise à l'échelle pour les deux déploiements.

Ce n'est pas aussi élégant que nous le souhaitions, mais cela nous donne un contrôle total sur ce qui vit où dans notre cluster.

J'espère que cela aidera quelqu'un !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X