Grundlegendes zu Kubernetes-Beispielen: Typen, Konfiguration und Best Practices



Quelle In



diesem Artikel geht es um die Konfiguration von Bereitschafts-, Integritäts- und Startsonden zum Erkennen und Arbeiten mit fehlerhaften Modulen, wie vom aaS-Team von Kubernetes übersetzt .



Warum werden Kubernetes-Validierungen benötigt?



Eine der Herausforderungen bei verteilten Systemen und der Microservices-Architektur besteht darin, fehlerhafte Anwendungen automatisch zu erkennen, Anforderungen an andere verfügbare Systeme umzuleiten und beschädigte Komponenten zu reparieren. Gesundheitschecks sind eine Möglichkeit, dieses Problem zu lösen und die Zuverlässigkeit sicherzustellen. In Kubernetes werden Integritätsprüfungen mithilfe von Sonden konfiguriert, um den Status jedes Pods zu ermitteln.



Standardmäßig überwacht Kubernetes den Lebenszyklus des Pods und leitet den Datenverkehr zum Pod weiter, wenn Container von "Ausstehend" zu "Erfolgreich" wechseln. Kubelet überwacht auch Anwendungsabstürze und startet das Modul zur Wiederherstellung neu.



Viele Entwickler glauben, dass diese Grundeinstellung ausreichend ist, insbesondere wenn die Anwendung im Modul mithilfe von Prozessmanagern wie PM2 für Node.js konfiguriert wird.



Da Kubernetes das Modul jedoch als fehlerfrei und für Anforderungen bereit ansieht, kann die Anwendung nach dem Start aller Container Datenverkehr empfangen, bevor sie tatsächlich bereit ist. Dies kann passieren, wenn die Anwendung einen Status initialisieren, eine Datenbankverbindung herstellen oder Daten laden muss, bevor die Anwendungslogik verarbeitet wird.



Diese Zeitspanne zwischen der tatsächlichen Verfügbarkeit der Anwendung und dem Zeitpunkt, an dem Kubernetes sie für bereit hält, wird zu einem Problem, wenn die Bereitstellung skaliert wird und die nicht vorbereiteten Anwendungen Datenverkehr empfangen und einen 500-Fehler zurücksenden.



Hier werden Kubernetes-Tests verwendet, um zu bestimmen, wann der Container bereit ist, Datenverkehr zu akzeptieren, und wann er neu gestartet werden sollte. Ab Kubernetes 1.16 werden drei Arten von Sonden unterstützt.



In diesem Artikel beschreibt der Autor verschiedene Arten von Tests sowie Best Practices und Tools zum Erkennen von Bereitstellungen mit potenziellen Konfigurationsproblemen.



Kubernetes-Sonden



Kubernetes unterstützt Bereitschafts- und Gesundheitssonden für Versionen ≤ 1,15. Startsonden wurden in 1.16 als Alpha-Feature hinzugefügt und in 1.18 in die Beta-Version verschoben.



WARNUNG: In Version 1.16 sind Teile der Kubernetes-API veraltet. Verwenden Sie dieses Migrationshandbuch , um die Kompatibilität zu überprüfen.



Alle Proben haben folgende Parameter:



  • initialDelaySeconds



    : ;
  • periodSeconds



    : ;
  • timeoutSeconds



    : - ( );
  • successThreshold



    : , ;
  • failureThreshold



    : . . , .




Bereitschaftssonden werden verwendet, um dem Kubelet mitzuteilen, wann die Anwendung bereit ist, neuen Datenverkehr zu akzeptieren. Wenn die Initialisierung Ihrer Anwendung nach dem Starten eines Prozesses einige Zeit in Anspruch nimmt, richten Sie einen Bereitschaftstest ein, damit Kubernetes warten kann, bevor neuer Datenverkehr gesendet wird. Der Hauptanwendungsfall für Bereitschaftsprüfungen besteht darin, den Datenverkehr zu Bereitstellungen für Dienste zu leiten.





Quelle



Es ist wichtig zu bedenken, dass Bereitschaftssonden während der gesamten Lebensdauer eines Moduls funktionieren. Dies bedeutet, dass sie nicht nur beim Start, sondern auch während der gesamten Betriebszeit des Moduls erneut gestartet werden.



Dies ist in Situationen erforderlich, in denen die Anwendung vorübergehend nicht verfügbar ist, z. B. beim Laden von Big Data oder beim Warten auf externe Verbindungen. In diesem Fall möchten wir die Anwendung nicht beenden, sondern warten, bis sie wiederhergestellt ist. Bereitschaftssonden werden verwendet, um dieses Szenario zu erkennen und senden keinen Datenverkehr an diese Module, bis sie die Bereitschaftsprüfung erneut bestehen.



Leistungstests



Gesundheitssonden werden verwendet, um ungesunde Container neu zu starten. Das Kubelet ruft regelmäßig einen Gesundheitstest auf, erkennt den Zustand des Pods und tötet ihn, wenn er einen Gesundheitscheck nicht besteht.



Eine Testversion kann dazu beitragen, dass eine Anwendung aus einem Deadlock ausbricht. Ohne Integritätsprüfungen betrachtet Kubernetes die Einstellung als fehlerfrei, da der Hauptprozess aus Sicht von Kubernetes weiterhin ausgeführt wird. Durch das Einrichten einer Integritätssonde kann kubelet erkennen, dass sich die Anwendung in einem fehlerhaften Zustand befindet, und den Pod neu starten, um die Verfügbarkeit wiederherzustellen.





Quelle



Starten Sie Samples



Starttests ähneln Bereitschaftstests, werden jedoch nur beim Start durchgeführt. Sie sind für den langsamen Start von Containern oder Anwendungen mit unvorhersehbaren Initialisierungsprozessen optimiert. Mit Bereitschaftssonden können wir optimieren initialDelaySeconds



, um zu bestimmen, wie lange gewartet werden muss, bevor die Bereitschaft überprüft wird.



Stellen Sie sich nun eine Anwendung vor, die manchmal große Datenmengen laden oder zu Beginn des Prozesses einen ressourcenintensiven Vorgang ausführen muss. Da es sich initialDelaySeconds



um eine statische Zahl handelt, müssen wir immer das Worst-Case-Szenario verwenden (oder den Wert erhöhen failureThreshold



, was sich auf das weitere Verhalten auswirken kann) und lange warten, auch wenn diese Anwendung keine lange Initialisierung durchführen muss.



Stattdessen können wir mithilfe von Startsonden konfigurierenfailureThreshold



und periodSeconds



um diese Unsicherheit besser zu bewältigen. Eine Einstellung failureThreshold



von 15 und periodSeconds



5 bedeutet beispielsweise, dass die Anwendung 15 x 5 = 75 Sekunden Zeit hat, um zu starten, bevor ein Fehler diagnostiziert wird.



Beispiel-Setup



Nachdem wir die verschiedenen Arten von Stichproben verstanden haben, können wir drei verschiedene Möglichkeiten untersuchen, um jede Stichprobe anzupassen.



HTTP



Kubelet sendet eine HTTP-GET-Anforderung an die angegebene URL und sucht nach einer 2xx- oder 3xx-Antwort. Sie können einen vorhandenen HTTP-Endpunkt verwenden oder einen kompakten HTTP-Server zum Testen konfigurieren (z. B. einen Express-Server mit einem Endpunkt /healthz



).



HTTP-Sonden akzeptieren zusätzliche Parameter:



  • host



    : Hostname für die Verbindung (standardmäßig ist dies die IP-Adresse des Moduls);
  • scheme



    : Standard HTTP oder HTTPS;
  • path



    : Pfad auf dem HTTP / S-Server;
  • httpHeaders



    : Benutzerdefinierte Header, wenn Sie Header-Werte für die Authentifizierung, CORS-Einstellungen usw. benötigen.
  • port



    : Name oder Portnummer für den Zugriff auf den Server.


livenessProbe:
  httpGet:
    path: /healthz
    port: 8080

      
      





TCP



Wenn Sie nur prüfen müssen, ob eine TCP-Verbindung hergestellt werden kann, verwenden Sie einen TCP-Test. Ein Modul wird als fehlerfrei markiert, wenn es eine TCP-Verbindung herstellen kann. Die Verwendung von TCP-Tests kann für gRPC- oder FTP-Server nützlich sein, bei denen HTTP-Aufrufe nicht geeignet sind.



readinessProbe:
  tcpSocket:
    port: 21

      
      





Befehl



Sie können den Test auch so konfigurieren, dass ein Shell-Befehl ausgeführt wird. Die Prüfung besteht, wenn der Befehl mit einem Exit-Code von 0 zurückgegeben wird. Andernfalls wird das Modul als fehlerhaft markiert.



Diese Art der Validierung kann nützlich sein, wenn Sie keinen HTTP-Server / Port öffnen möchten oder wenn es einfacher ist, Initialisierungsschritte mithilfe von Befehlen zu validieren. Überprüfen Sie beispielsweise, ob eine Konfigurationsdatei erstellt wurde, oder führen Sie einen CLI-Befehl aus.



readinessProbe:
  exec:
    command: ["/bin/sh", "-ec", "vault status -tls-skip-verify"]

      
      





Best Practices für die Auswahl von Kubernetes



Die genauen Beispielparameter hängen von Ihrer Anwendung ab. Im Folgenden finden Sie einige allgemeine Richtlinien für den Einstieg:



  1. Verwenden Sie für ältere (≤ 1,15) Kubernetes-Cluster einen anfänglichen Lag-Ready-Test, um die Container-Startphase zu handhaben. Verwenden Sie dazu die 99% -Perzentilzeit. Machen Sie diese Überprüfung jedoch einfach, da der Bereitschaftstest während der gesamten Lebensdauer des Moduls ausgeführt wird. Wir möchten nicht, dass die Sonde eine Zeitüberschreitung aufweist, da die Überprüfung der Bereitschaft lange dauert.
  2. (≥ 1.16) Kubernetes . (, /healthz



    ), . failureThreshold



    , , . .
  3. , . , , , . .
  4. , . , , , . , .


Kurz gesagt, genau definierte Sonden erhöhen normalerweise die Stabilität und Verfügbarkeit. Überwachen Sie unbedingt die Startzeiten und das Systemverhalten, um Ihre Beispieleinstellungen anzupassen, wenn sich Anwendungen ändern.



Werkzeuge



Angesichts der Bedeutung von Kubernetes-Sonden können Sie mithilfe von Kubernetes-Ressourcenanalysetools fehlende Sonden finden. Diese Tools können auf vorhandenen Clustern ausgeführt oder in einen CI / CD-Prozess eingebettet werden, sodass die Bereitstellung von Workloads ohne ordnungsgemäß konfigurierte Ressourcen automatisch fehlschlägt:



  • polaris ist ein Dienstprogramm zur Ressourcenanalyse mit einer schönen Symbolleiste, die auch als Validierungs-Webhook oder Befehlszeilen-Tool verwendet werden kann.
  • kube-score ist ein statisches Code-Analyse-Tool, das mit Helm-, Kustomize- und Standard-YAML-Dateien arbeitet.
  • popeye ist ein schreibgeschütztes Dienstprogramm, das Kubernetes-Cluster scannt und potenzielle Konfigurationsprobleme meldet.


In diesen beiden Telegrammkanälen finden Sie Neuigkeiten aus unseren Kubernetes aaS und Ankündigungen von @ Kubernetes- Meetup-Events .



Was noch zu lesen:






All Articles