Handreichungen Managed Kubernetes

API-Dokumentation

Dem Kunden wird Zugriff auf die standard Kubernetes-API gegeben. Die Dokumentation dafür kann in der offiziellen Kubernetesdokumentation unter der entsprechend installierten Version nachgelesen werden. Außerdem stehen dem Nutzer die APIs des CloudControllerManagers, des CSIs und CNIs (cillium) zur Verfügung.

Best Practices

Um verbreitete Probleme zu verhindern, die die Verfügbarkeit Ihrer Anwendung beeinträ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 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 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)

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 unter anderem für Container-Images der folgenden (öffentlichen) Image-Repositories eingerichtet:

  • docker.io
  • gcr.io
  • ghcr.io
  • k8s.gcr.io
  • nvcr.io
  • quay.io
  • registry.gitlab.com
  • registry.k8s.io
  • registry.opensource.zalan.do
  • registry.teuto.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.

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 Ressourcen der Nodes zur freien Verfügung.

Bekannte Fehlermeldungen

Quota überschritten

Disk-Quota

Ein überschrittenes Disk-Quota äußert sich in der Regel dadurch, dass ein PersistentVolumeClaim im Status Pending hängen bleibt und gleichzeitig bei einem describe auf das PersistentVolumeClaim den Hinweis auf einen ExceedsAvailableQuota enthält.

$ kubectl get pvc
NAME                 STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS     AGE
disk-quota-example   Pending                                      teutostack-hdd   25s

$ kubectl describe pvc disk-quota-example 
Name:          disk-quota-example
Namespace:     default
StorageClass:  teutostack-hdd
Status:        Pending
...
Events:
  Type     Reason                Age                 From                                                                                                                 Message
  ----     ------                ----                ----                                                                                                                 -------
  Warning  ProvisioningFailed    70s (x6 over 102s)  cinder.csi.openstack.org_openstack-cinder-csi-controllerplugin-dbc57c7b9-mtczf_ca72589f-2cce-4f2d-b7b2-fc556d0b740e  failed to provision volume with StorageClass "teutostack-hdd": rpc error: code = Internal desc = CreateVolume failed with error Expected HTTP response code [202] when accessing [POST https://api.ffm3.teutostack.de:8776/v3/613bec9239ad4973accbfb252cb53725/volumes], but got 413 instead
{"overLimit": {"code": 413, "message": "VolumeSizeExceedsAvailableQuota: Requested volume or snapshot exceeds allowed gigabytes_Ceph-HDD quota. Requested 500G, quota is 1000G and 1000G has been consumed.", "retryAfter": "0"}}

Sollten Sie an ein Quota Limit stoßen, wenden Sie sich bitte an uns, wir helfen Ihnen gerne.