Handreichungen Managed Kubernetes
Best Practices
Um verbreitete Probleme zu verhindern, die die Verfügbarkeit Ihrer Anwendung beinträchtigen, haben wir hier eine Liste an “Best Practices” erstellt, die Sie für Ihre Anwendungen umsetzen sollten.
Replicas anstatt einfacher Pods benutzen
Um sicherzustellen, dass Pods an anderer Stelle neugestartet werden, sollten keine Pod
Ressourcen direkt erstellt werden. Stattdessen sollten Deployments
, StatefulSets
oder andere Workload Ressourcen verwendet werden.
Aufgrund der Flüchtigkeit einzelner Nodes ist es wichtig, dass Ihre Anwendungen resilient gegenüber diesem Verhalten sind. teuto.net empfiehlt dafür, die Best Practices zu befolgen.
Bitte prüfen Sie dies besonders vor den Updates, um einen reibungslosen Ablauf zu ermöglichen.
Ressourcen Requests und Limits
Damit der Kubernetes Scheduler abschätzen kann, ob ein Pod auf einen Node passt, vergleicht er die Ressourcen Requests und Limits mit den anderen Pods auf dem Node, sowie mit den verfügbaren Ressourcen des Nodes.
Um sicherzustellen, dass alle Anwendungen wie erwartet laufen, sollten die Requests und Limits für jede Workload Resource konfiguriert sein. Mehr Details gibt es in der Kubernetes Dokumentation “Managing Resources for Containers”.
PodDisruptionBudget
Mit Hilfe von PodDisruptionBudgets
kann für eine Anwendung konfiguriert werden, wie viele Replicas zu jedem Zeitpunkt mindestens verfügbar sein müssen. Damit wird sichergestellt, dass z.B. während eines Kubernetes Upgrades, wenn alle Nodes einmal ausgetauscht werden, dauerhaft genügend Instanzen der Anwendung laufen.
Falls es nicht möglich ist, ein PodDisruptionBudget
sinnvoll zu erfüllen, zum Beispiel wenn im PodDisruptionBudget
maxUnavailable: 0
angegeben ist, wird die betreffende Anwendung nach einem Timeout trotzdem gestoppt. Dies kann zu Ausfällen führen.
Provider-Details
Cloud Integration
teuto.net verwendet OpenStack als Cloud-Basis für Managed Kubernetes Cluster. Dies erlaubt die Integration und einfache Nutzung einiger Funktionen, welche Ihnen in Ihrem Kubernetes-Cluster zur Verfügung stehen.
Netzwerk
Die Cluster werden von uns mit funktionierendem Networking (CNI) und DNS per CoreDNS ausgestattet. So können Ihre Anwendungen mühelos nach außen, sowie innerhalb des Clusters kommunizieren..
Loadbalancer
Wir installieren den openstack-cloud-controller-manager
der auf Wunsch Services mit type: Loadbalancer
mit einem Octavia Loadbalancer ausstattet. Diese LoadBalancer bekommen automatisch jeweils eine dedizierte, extern erreichbare Floating-IP zugewiesen.
Volumes
Wir installieren das cinder-csi-plugin
und erstellen folgende passende StorageClasses
:
teutostack-ssd
(default)teutostack-hdd
Damit ist es möglich, PersistentVolumes
über die Verwendung von PersistentVolumeClaims
anzulegen und zu nutzen.
Nähere Informationen zur Verwendung von PersistentVolumeClaims
entnehmen sie bitte der offiziellen Dokumentation.
Proxy-Cache
Um den Netzwerk-Traffic zu oft verwendeten Container-Registries zu reduzieren, setzt teuto.net einen Proxy-Cache ein. Dies hilft auch, um ein Rate-Limiting durch die einzelnen Registries zu vermeiden. Dieser Proxy-Cache wird automatisch konfiguriert und funktioniert völlig transparent. Es brauchen keine Image-URLs angepasst werden.
Es wird ein Proxy-Cache für Container-Images der folgenden (öffentlichen) Image-Repositories eingerichtet:
docker.io
gcr.io
ghcr.io
hub.docker.com
index.docker.io
k8s.gcr.io
quay.io
registry.gitlab.com
registry.opensource.zalan.do
registry.teuto.io
registry.k8s.io
Flüchtigkeit einzelner Nodes
Einzelne Nodes (Control- und Computeplane) können jederzeit durch uns ausgetauscht werden. Dies passiert zum Beispiel, um Updates des Betriebssystems oder der verwendeten Kubernetes Software einzuspielen, oder damit wir Wartungsarbeiten an der unterliegenden Cloud-Infrastruktur (Hypervisor) durchführen können.
Wir verwenden dabei den normalen Node drain Prozess, welcher darauf achtet, dass die Pods wie konfiguriert gestoppt werden, und alle PodDisruptionBudgets
weiterhin beachtet werden. Dieser Prozess ist mit einem Timeout versehen, welcher verhindern soll, dass ein Rotieren der Nodes auf Grund von fehlerhaften PodDisruptionBudgets
in eine unendliche Warteschleife gerät.
MachineHealthChecks
Um die Verfügbarkeit des Clusters und Ihrer Anwendungen sicher zu stellen, verwendet teuto.net sogenannte MachineHealthChecks
. Diese überprüfen kontinuierlich die Verfügbarkeit und Funktion der Nodes eines Clusters. Sollte ein Node ausfallen und sich nicht binnen eines gewissen Zeitrahmens wieder selbst erholen, wird das Management-System den fehlerhaften Node automatisch durch einen neuen ersetzen.
Update-Verfahren
teuto.net installiert regelmäßig Updates auf den Managed Kubernetes-Clustern. Für das Update auf den neuste Minor-Release warten wir mindestens den zweiten Patch-Release der neuesten Minor-Release ab.
Während der Updates werden die Nodes der Reihe nach ausgetauscht. Dazu wird immer erst ein neuer Node zum Cluster hinzugefügt, bevor einer der bestehenden Nodes ausgetauscht wird. Auf diese Weise stehen Ihnen stets die vollen Ressourcen zur Verfügung. teuto.net verwendet dabei den normalen Node drain Prozess.
Um die Updates reibungslos durchführen zu können, sollten unsere Best Practices, insbesondere die Konfiguration von PodDisruptionBudgets
, eingehalten werden. Andernfalls kann es zu Ausfällen bzw. zu einem Non-Graceful Shutdown der betreffenden Anwendung kommen.
Die Kommunikation zu den Updates findet über tickets.teuto.net unter dem Label kubernetes-update
statt. Dieses muss vom Kunden abonniert werden, damit die entsprechenden Informationen zugestellt werden können.
Dazu gehen Sie in Ihrem Projekt bitte auf das Feld Project information
und wählen in dem Menü Labels
aus. Es öffnet sich eine Seite, in der alle Labels aus dem Projekt aufgelistet sind. Dort suchen Sie nun das Label kubernetes-update
. Rechts davon befindet sich der Button Subscribe
. Wenn Sie diesen anklicken, sind Sie auf dem Projekt Level auf das Label subscribed. Sollte sich ein Menü öffnen, in welchem Sie wählen können ob Sie das Issue auf Group oder Project Level subscriben wollen, wählen Sie project level
.
Limitierung
Reservierte Resourcen
Für den stabilen Betrieb des Kubernetes Clusters ist es nötig, dass teuto.net auf jedem Node weitere Software laufen lässt, zum Beispiel um Storage-Volumes anbinden zu können (siehe Volumes). Für diese Zwecke steht nur ein Teil der Resourcen der Nodes zur freien Verfügung.