Avem un cluster Kubernetes cu 6 noduri care rulează aproximativ 20 de încărcături de lucru mari de set de replică (servicii Java). Fiecare pod de sarcină de lucru (1 pod per sarcină de lucru) durează în medie aproximativ 30 de secunde pentru a porni și a utiliza o mulțime de CPU. Acest lucru face ca pornirea mai multor pod-uri/încărcări de lucru în același timp să fie o problemă - până la punctul în care, atunci când 2 sau 3 pornesc în același timp pe același nod, durează câteva minute pentru a porni și în cele din urmă sunt uciși de sonda de pregătire. Sonda de pregătire este destul de relaxată, dar prelungirea timpului de grație la infinit nu pare a fi o practică bună.
După cum se poate imagina, acest lucru face problematică cordonarea și drenarea unui nod - dacă drenăm un nod, toate podurile repornesc în același timp în altă parte și îl putem supraîncărca un lucrător (sau îl pot opri, provocând reporniri multiple, care în cele din urmă duc la blocarea bazei de date ).
Pentru a ocoli acest lucru, am scris un script shell care folosește kubectl pentru a lista pod-urile, reporniți fiecare (prin corecția metadatelor), așteptați ca starea să devină disponibilă și treceți la următorul.
Scripturile funcționează bine pentru corecțiile serverului sau pentru upgrade-urile sarcinii de lucru, dar nu rezolvă problema unei întreruperi de nod - totul rulează în AWS și când un nod eșuează, se creează unul nou prin autoscaling, dar înseamnă că 4 poduri încearcă și repornesc în același timp ora (de obicei duminica dimineata la 3 dimineata desigur).
O idee ar fi să existe un container init care să fie conștient de celelalte încărcături de lucru de pornire - dacă nicio altă încărcătură de lucru nu pornește în prezent pe același nod, atunci containerul init se iese permițând containerului principal să pornească. Acest lucru ar necesita un cont de serviciu și permisiuni, dar ar putea fi o soluție, dar mă întrebam dacă există o modalitate mai standard de a face acest lucru prin configurare (reguli de afinitate etc.)?