Die 10 besten Tipps und Tricks für Kubernetes

Die 10 besten Tipps und Tricks für Kubernetes

Im Internet gibt es viele Nachschlagwerke, aber manchmal sind die einfachsten Tipps die wertvollsten. Das Team Kubernetes aaS von Mail.ru hat eine Sammlung von zehn Tricks und Tipps übersetzt, die der Autor des Artikels nach einem Jahr Arbeit mit Kubernetes zusammengestellt hat. Die Tipps sind nicht nach Wichtigkeit sortiert, aber wir denken, dass jeder etwas Nützliches für sich findet.

Der einfachste Befehl zur Arbeit mit Kubernetes

Um zu beginnen, ist wahrscheinlich die einfachste und nützlichste Aktion bei der Arbeit mit Kubernetes der folgende Befehl, der die Autovervollständigung von Befehlen aktiviert kubectl in der Bash-Shell:

echo "source > ~/ .bashrc

Die Autovervollständigung kubectl wird in der .bashrc-Datei festgeschrieben und aktiviert sich automatisch jedes Mal beim Start der Shell. Dies beschleunigt das Eingeben langer Befehle und Parameter, wie beispielsweise all-namespaces. Weitere Informationen finden Sie in der Kubernetes-Hilfe zu Bash.

Standardmäßig festgelegte Einschränkungen für Speicher und CPU im Namensraum

Wenn eine Anwendung falsch programmiert ist, beispielsweise jede Sekunde eine neue Verbindung zur Datenbank öffnet, diese aber nie schließt, kann es im Cluster zu einem Speicherleck kommen. Und wenn für die Anwendung beim Deployment keine Einschränkung für den Speicher festgelegt ist, kann das zu einem Ausfall des Knotens führen.

Um dem entgegenzuwirken, ermöglicht Kubernetes das Festlegen von Standardbeschränkungen für jeden Namensraum. Diese werden in der YAML-Datei für den jeweiligen Namensraum festgehalten. Hier ist ein Beispiel für eine solche Datei:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

Erstellen Sie eine solche YAML-Datei und wenden Sie sie auf jeden Namensraum an. Zum Beispiel auf den Namensraum limit-example. Jetzt gilt für jeden Container, der in diesem Namensraum bereitgestellt wird, eine Beschränkung von 512Mi, es sei denn, für diesen Container ist eine andere individuelle Grenze festgelegt.

Müllbereinigung in alten Versionen von Kubernetes

Kubelet beginnt standardmäßig mit der Müllbereinigung, wenn /var/lib/docker 90 % des verfügbaren Speicherplatzes einnimmt. Das ist großartig, aber bis zur Version Kubernetes 1.7 gab es kein Standardlimit für die Anzahl der verwendeten Index-Deskriptoren (Inodes), die der Anzahl von Dateien im Dateisystem entsprechen.

Potentiell kann Ihr Container /var/lib/docker nur 50 % des Speicherplatzes verwenden, aber die Inodes könnten ausgehen, was zu Problemen bei den Workern führen kann.

In den alten Versionen von Kubelet von 1.4 bis 1.6 musste dieser Flag hinzugefügt werden:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

In Version 1.7 und neueren Versionen ist dieser Flag standardmäßig gesetzt. Ältere Versionen überwachen jedoch das Inoden-Limit nicht.

Minikube… klein, aber leistungsstarkes lokales Kubernetes

Minikube ist der einfachste Weg, einen lokalen Kubernetes-Cluster zu starten. Er wird mit einem einfachen Befehl gestartet:

minikube start

Nach Ausführung dieses Befehls läuft ein echter Kubernetes-Cluster auf Ihrem Computer.

Die 10 besten Tipps und Tricks für Kubernetes
Bildquelle

Der Trick besteht darin, wie man eine Anwendung erstellt und sie lokal in diesem Cluster ausführt. Wenn keine speziellen Anweisungen gegeben werden, wird das Docker-Image auf Ihrem Computer und nicht im Cluster erstellt.

Um Docker zu zwingen, das Image in den lokalen Kubernetes-Cluster zu senden, wird der Docker-Maschine folgender Befehl gegeben:

eval $(minikube docker-env)

Jetzt können wir Anwendungen im lokalen Kubernetes-Cluster erstellen.

Geben Sie nicht allen Zugriff auf kubectl

Es scheint offensichtlich zu sein, aber wenn mehrere Teams einen Cluster für ihre Anwendungen gemeinsam nutzen (wofür Kubernetes geschaffen wurde), sollte man nicht einfach allen den Zugriff gewähren. kubectlEs ist besser, die Teams zu trennen, indem man jedem ein eigenes Namensraum zuweist und den Zugriff durch RBAC-Richtlinien regelt.

Man kann es sich zur Aufgabe machen, Rechte für jeden Pod hinsichtlich Zugriff, Lesen, Erstellen, Löschen und andere Operationen festzulegen. Wichtiger ist es jedoch, den Zugang zu Geheimnissen zu beschränken, sodass nur Administratoren Zugriff haben. So trennen wir die, die den Cluster verwalten können, von denen, die einfach darin bereitgestellt werden können.

Verwalten Sie Budgets für Pods

Wie kann man sicherstellen, dass es im Kubernetes-Cluster keine Ausfallzeiten für die Anwendung gibt? PodDisruptionBudget und nochmals PodDisruptionBudget.

Cluster werden regelmäßig aktualisiert und Knoten werden leergeräumt. Nichts bleibt stehen, das ist die Realität. Bei jedem Deployment mit mehr als einer Instanz sollte unbedingt ein PDB (PodDisruptionBudget) einbezogen werden. Es wird in einer einfachen YAML-Datei erstellt, die auf den Cluster angewendet wird. Der Geltungsbereich eines bestimmten PDB wird durch Label-Selektoren definiert.

Hinweis: Das PDB-Budget wird nur bei einer umkehrbaren Budgetverletzung berücksichtigt (freiwillige Störung). In Situationen wie Hardwareausfällen wird das PDB nicht wirksam.

Beispiel für ein PDB:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

Die zwei wesentlichen Parameter sind matchLabels und minAvailable. Im ersten Parameter wird angegeben, für welche Anwendungen das Budget gilt. Zum Beispiel, wenn ich Deployments mit den Labels app: app-a und app: app-b, wird dieses PDB nur auf das erste angewendet.

Parameter minAvailable wird bei der Leerung (Reinigung) eines Knotens berücksichtigt. Zum Beispiel, in unserem Beispiel werden während der Leerung alle Instanzen app: app-a, außer zwei, verdrängt.

Dies ermöglicht die Kontrolle darüber, wie viele Instanzen der Anwendung zu jedem Zeitpunkt ausgeführt werden sollen.

Monitoring der Anwendungsintegrität

Ein solches Monitoring ist auf zwei Arten möglich: durch Readiness- oder Liveness-Proben.

Die erste Probe (Readiness) bestimmt die Bereitschaft des Containers, Traffic zu empfangen.

Die zweite (Liveness) zeigt, ob der Container funktionsfähig ist oder ob er neu gestartet werden muss.

Die entsprechenden Konfigurationen werden einfach in die YAML-Datei für das Deployment hinzugefügt. Dort können Zeitüberschreitungen, Verzögerungszeiten und die Anzahl der Wiederholungsversuche angegeben werden. Weitere Informationen finden Sie in der Kubernetes-Dokumentation.

Labels überall

Labels sind eines der grundlegenden Konzepte in Kubernetes. Sie ermöglichen es Objekten, frei miteinander zu interagieren, sowie Anfragen basierend auf diesen Labels zu erstellen. In Kubernetes kann man sogar zum Client wechseln und die Ereignisse basierend auf bestimmten Labels beobachten.

Mit Labels kann man fast alles machen, aber ein gutes Beispiel wäre, mehrere Umgebungen zur Ausführung von Programmen in einem Cluster zu schaffen.

Angenommen, Sie verwenden denselben Cluster für dev und qa. Das bedeutet, dass Sie möglicherweise eine Anwendung app-a, die gleichzeitig in beiden Umgebungen ausgeführt wird, haben. qa und devIn diesem Fall können wir getrennt auf die Instanz der Anwendung in einer bestimmten Umgebung zugreifen, indem wir den entsprechenden Parameter angeben Umgebung. Zum Beispiel, app: app-a und environment: dev für die eine Umgebung und app: app-a und environment: qa für die zweite.

Dies ermöglicht den Zugriff auf beide Instanzen der Anwendung, um beispielsweise gleichzeitig Tests durchzuführen.

Ordnung schaffen

Kubernetes ist ein sehr leistungsfähiges System, aber jedes System kann letztendlich in einer großen Anzahl von Prozessen stecken bleiben. Kubelet startet alle von Ihnen angegebenen Prozesse und Überprüfungen sowie seine eigenen.

Natürlich wird ein herrenloser Dienst das System nicht verlangsamen, und Kubernetes ist von Grund auf für die Skalierung ausgelegt. Aber wenn anstelle eines Dienstes eine Million auftauchen, beginnt kubelet zu kämpfen.

Falls Sie aus irgendeinem Grund eine Bereitstellung (Container, Image, was auch immer) löschen, stellen Sie einfach sicher, dass alles vollständig bereinigt wird.

Lernen Sie Go kennen

Den besten Rat haben wir uns für den Schluss aufgehoben. Lernen Sie die Programmiersprache Go.

Kubernetes ist in Go entwickelt, alle Erweiterungen sind in Go geschrieben und die offizielle Client-Bibliothek client-go wird ebenfalls unterstützt.

Es kann für verschiedene interessante Dinge verwendet werden. Zum Beispiel, um das Kubernetes-System nach Ihren Wünschen zu erweitern. So können Sie eigene Programme zur Datensammlung, Bereitstellung von Anwendungen oder einfachen Bereinigung von Containern verwenden.

Die Programmiersprache Go zu lernen und client-go zu meistern, ist wohl der wichtigste Rat, den man neuen Kubernetes-Nutzern geben kann.

Übersetzt mit Unterstützung von Mail.ru Cloud Solutions

Was Sie sonst noch lesen sollten:

  1. Drei Ebenen der automatischen Skalierung in Kubernetes und wie man sie effektiv nutzt.
  2. Kubernetes-Knoten: viele kleine oder wenige große?
  3. 25 nützliche Tools für die Bereitstellung und Verwaltung von Kubernetes.

Quelle: habr.com

60GB SSD 8Gb DDR4