Die 10 besten Kubernetes-Tricks und -Tipps

Die 10 besten Kubernetes-Tricks und -Tipps

Im Internet gibt es jede Menge Referenzliteratur, aber manchmal ist der einfachste Rat der wertvollste. Team Kubernetes aaS von Mail.ru übersetzt eine Auswahl von zehn Tricks und Tipps, die der Autor des Artikels nach einem Jahr Arbeit mit Kubernetes gesammelt hat. Die Tipps sind nicht nach Wichtigkeit sortiert, aber wir denken, dass jeder etwas Nützliches für sich finden wird.

Der einfachste Befehl zum Arbeiten mit Kubernetes

Zunächst einmal die vielleicht einfachste und nützlichste Aktion bei der Arbeit mit Kubernetes. Der folgende Befehl ermöglicht die Befehlsvervollständigung kubectl in der Bash-Shell:

echo "source <(kubectl completion bash)" >> ~/.bashrc

Autocomplete kubectl wird in die .bashrc-Datei geschrieben und bei jedem Start der Shell automatisch aktiviert. Dies beschleunigt die Eingabe langer Befehle und Parameter wie z all-namespaces. Weitere Details in Kubernetes-Bash-Hilfe.

Standardspeicher- und CPU-Grenzwerte in einem Namespace

Wenn die Anwendung falsch geschrieben ist, zum Beispiel jede Sekunde eine neue Verbindung zur Datenbank öffnet, diese aber nie schließt, dann liegt im Cluster ein Speicherverlust vor. Und wenn für die Anwendung während der Bereitstellung kein Speicherlimit festgelegt ist, kann dies zu einem Knotenausfall führen.

Um dies zu verhindern, können Sie mit Kubernetes Standardeinschränkungen pro Namespace festlegen. Sie werden in die Yaml-Datei für einen bestimmten Namespace geschrieben. 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 ein solches Yaml und wenden Sie es auf einen beliebigen Namespace an. Zum Beispiel zum Namensraum limit-example. Jetzt hat jeder in diesem Namespace bereitgestellte Container ein Limit von 512Mi, es sei denn, für diesen Container wird zusätzlich ein anderes individuelles Limit festgelegt.

Garbage Collection in älteren Versionen von Kubernetes

Kubelet startet standardmäßig die Speicherbereinigung, wenn var/lib/docker belegt 90 % des verfügbaren Speicherplatzes. Das ist großartig, allerdings gab es bis Kubernetes 1.7 keine Standardbeschränkung für die Anzahl der verwendeten Inodes, die der Anzahl der Dateien im Dateisystem entsprechen.

Möglicherweise Ihr Container var/lib/docker Beansprucht möglicherweise nur 50 % des Festplattenspeichers, es sind jedoch möglicherweise keine Inodes mehr vorhanden, was zu Problemen für die Mitarbeiter führen kann.

In älteren Kubelet-Versionen von 1.4 bis 1.6 müssen Sie dieses Flag hinzufügen:

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

In 1.7 und späteren Versionen ist dieses Flag standardmäßig gesetzt. Allerdings überwachen frühere Versionen das Inode-Limit nicht.

Minikube... kleines, aber leistungsstarkes lokales Kubernetes

Minikube ist die einfachste Möglichkeit, einen lokalen Kubernetes-Cluster auszuführen. Es wird mit einem einfachen Befehl gestartet:

minikube start

Das Ausführen dieses Befehls führt dazu, dass ein echter Kubernetes-Cluster auf Ihrem Computer ausgeführt wird.

Die 10 besten Kubernetes-Tricks und -Tipps
Illustrationsquelle

Der Trick besteht darin, die Anwendung zu erstellen und lokal auf diesem Cluster auszuführen. Sofern nicht ausdrücklich angegeben, wird das Docker-Image auf Ihrem Computer und nicht auf dem Cluster erstellt.

Um Docker zu zwingen, das Image an den lokalen Kubernetes-Cluster zu übertragen, erhält die Docker-Maschine den folgenden Befehl:

eval $(minikube docker-env)

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

Gewähren Sie nicht jedem Zugriff auf kubectl

Das scheint offensichtlich, aber wenn mehrere Teams denselben Cluster für ihre Anwendungen verwenden (wofür Kubernetes erstellt wurde), sollten Sie nicht einfach jedem etwas geben kubectl. Es ist besser, die Befehle zu trennen, jedem einen eigenen Namensraum zuzuweisen und den Zugriff mithilfe von RBAC-Richtlinien einzuschränken.

Es kann zu Verwirrung kommen, wenn Sie jedem Pod Zugriffs-, Lese-, Erstellungs-, Lösch- und andere Vorgänge zuweisen. Aber das Wichtigste ist, den Zugriff auf Geheimnisse zu beschränken und ihn nur Administratoren zu erlauben. Auf diese Weise unterscheiden wir zwischen denjenigen, die den Cluster verwalten können, und denjenigen, die ihn einfach bereitstellen können.

Pod-Budgets verwalten

Wie kann sichergestellt werden, dass eine Anwendung in einem Kubernetes-Cluster nicht ausfällt? PodDisruptionBudget und noch einmal PodDisruptionBudget.

Cluster werden regelmäßig aktualisiert und Knoten werden geleert. Nichts steht still, das ist die Realität. Jede Bereitstellung mit mehr als einer Instanz sollte ein PDB (PodDisruptionBudget) enthalten. Es wird in einer einfachen Yaml-Datei erstellt, die auf den Cluster angewendet wird. Der Abdeckungsbereich eines bestimmten PDB wird durch Etikettenselektoren bestimmt.

Hinweis: Das HVE-Budget wird nur berücksichtigt, wenn die Budgetverletzung umkehrbar ist (freiwillige Störung). In Situationen wie Hardwarefehlern funktioniert PDB nicht.

Beispiel-PDB:

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

Die beiden Hauptparameter sind matchLabels и minAvailable. Der erste Parameter gibt an, für welche Anwendungen das Budget gilt. Zum Beispiel, wenn ich Bereitstellungen mit Labels habe app: app-a и app: app-b, dann gilt diese PDB nur für die erste.

Parameter minAvailable beim Entleeren (Reinigen) des Knotens berücksichtigt. In unserem Beispiel werden beispielsweise beim Entleeren alle Instanzen geräumt app: app-a, außer zwei.

Dadurch können Sie steuern, wie viele Instanzen der Anwendung gleichzeitig ausgeführt werden sollen.

Überwachung des Anwendungszustands

Eine solche Überwachung ist auf zwei Arten möglich: mithilfe von Readiness- oder Liveness-Tests.

Die erste Sonde (Bereitschaft) bestimmt die Bereitschaft des Containers, Datenverkehr zu empfangen.

Die zweite (Liveness) zeigt an, ob der Container fehlerfrei ist oder neu gestartet werden muss.

Die relevanten Konfigurationen werden zur Bereitstellung einfach zum Yaml hinzugefügt. Dort können Sie Timeouts, Verzögerungszeiten und die Anzahl der Wiederholungsversuche festlegen. Erfahren Sie mehr über sie Kubernetes-Dokumentation.

Tags sind überall

Labels sind eines der grundlegenden Konzepte in Kubernetes. Sie ermöglichen es Objekten, frei miteinander zu kommunizieren und Abfragen basierend auf Labels zu erstellen. In Kubernetes können Sie sogar zum Client gehen und Ereignisse für bestimmte Tags beobachten.

Mit Tags kann man fast alles machen, aber ein gutes Beispiel wäre das Erstellen mehrerer Umgebungen, um Programme auf demselben Cluster auszuführen.

Nehmen wir an, Sie verwenden denselben Cluster für dev и qa. Das bedeutet, dass Sie einen Antrag stellen können app-a, gleichzeitiges Arbeiten in beiden Umgebungen qa и dev. In diesem Fall können wir durch Angabe des entsprechenden Parameters separat auf die Anwendungsinstanz in einer bestimmten Umgebung zugreifen environment. Zum Beispiel app: app-a и environment: dev für eine Umgebung und app: app-a и environment: qa für den zweiten.

Dadurch können Sie auf beide Instanzen der Anwendung zugreifen, um beispielsweise gleichzeitig Tests durchzuführen.

Organisieren Sie sich

Kubernetes ist ein sehr leistungsfähiges System, aber jedes System kann irgendwann durch zu viele Prozesse ins Stocken geraten. Das Kubelet führt alle von Ihnen angegebenen Prozesse und Prüfungen sowie seine eigenen aus.

Natürlich wird ein verwaister Dienst das System nicht verlangsamen, und Kubernetes ist von Grund auf skalierbar. Aber wenn statt eines Dienstes eine Million erscheint, beginnt das Kubelet zu ersticken.

Wenn Sie aus irgendeinem Grund eine Bereitstellung (Container, Image usw.) löschen, stellen Sie sicher, dass Sie eine vollständige Bereinigung durchführen.

Treffen Sie Go

Den Hauptratschlag haben wir uns zum Schluss aufgehoben. Lernen Sie die Programmiersprache Go.

Kubernetes wird in Go entwickelt, alle Erweiterungen sind in Go geschrieben und auch die Client-Go-Clientbibliothek wird offiziell unterstützt.

Es kann für verschiedene und interessante Dinge verwendet werden. Zum Beispiel, um das Kubernetes-System nach Ihrem Geschmack zu erweitern. Sie können also Ihre eigenen Programme verwenden, um Daten zu sammeln, Anwendungen bereitzustellen oder einfach Container zu bereinigen.

Das Erlernen der Programmiersprache Go und die Beherrschung von Client-Go ist vielleicht der wichtigste Rat, den Sie neuen Kubernetes-Benutzern geben können.

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

Was gibt es sonst noch zu lesen?:

  1. Drei Ebenen der automatischen Skalierung in Kubernetes und wie man sie effektiv nutzt.
  2. Kubernetes-Worker-Knoten: viele kleine oder wenige große?
  3. 25 nützliche Tools zum Bereitstellen und Verwalten von Kubernetes.

Source: habr.com

Kommentar hinzufügen