Top 10 Kubernetes Tipps und Tricks



Es gibt viel Referenzliteratur im Internet, aber manchmal werden die einfachsten Tipps die wertvollsten. Das Mail.ru Kubernetes aaS- Team hat eine Auswahl von zehn Tipps und Tricks übersetzt , die der Autor des Artikels nach einem Jahr Zusammenarbeit mit Kubernetes gesammelt hat. Tipps sind nicht nach Wichtigkeit sortiert, aber wir glauben, dass jeder etwas Nützliches für sich finden wird.

Das einfachste Team, um mit Kubernetes zu arbeiten


Zunächst vielleicht die einfachste und nützlichste Aktion bei der Arbeit mit Kubernetes. Der folgende Befehl aktiviert die automatische Vervollständigung von Befehlen kubectlin der Bash-Shell:

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

Die kubectlautomatische Vervollständigung wird in die .bashrc-Datei geschrieben und bei jedem Start der Shell automatisch aktiviert. Dies beschleunigt eine Reihe langer Befehle und Parameter, z all-namespaces. Weitere Informationen finden Sie in der Kubernetes-Bash-Hilfe .

Standardbeschränkungen für Speicher und CPU im Namespace


Wenn die Anwendung beispielsweise nicht korrekt geschrieben ist und jede Sekunde eine neue Datenbankverbindung öffnet, diese jedoch nie schließt, tritt im Cluster ein Speicherverlust auf. Wenn während der Bereitstellung kein Speicherlimit für die Anwendung vorhanden ist, kann dies zu einem Knotenausfall führen.

Um dies zu verhindern, können Sie mit Kubernetes Standardeinschränkungen für jeden 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 zu einem Namespace limit-example. Für jeden in diesem Namespace bereitgestellten Container gilt nun das 512Mi-Limit, es sei denn, für diesen Container wird zusätzlich ein anderes individuelles Limit festgelegt.

Speicherbereinigung in älteren Versionen von Kubernetes


Kubelet startet standardmäßig die Speicherbereinigung, wenn var / lib / docker 90% des verfügbaren Speicherplatzes belegt. Dies ist in Ordnung. Vor Kubernetes 1.7 gab es jedoch keine Standardbeschränkung für die Anzahl der verwendeten Inodes (Inodes), die der Anzahl der Dateien im Dateisystem entsprechen.

Möglicherweise kann Ihr var / lib / docker- Container nur 50% des Speicherplatzes belegen, aber Inodes können ausgehen, was den Arbeitern Probleme bereiten wird.

In älteren Versionen von kubelet von 1.4 bis 1.6 müssen Sie das folgende Flag hinzufügen:

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

In Version 1.7 und neueren Versionen ist dieses Flag standardmäßig gesetzt. Frühere Versionen folgen jedoch nicht der Grenze der Inodes.

Minikube ... ein kleines aber feines lokales Kubernetes


Minikube ist der einfachste Weg, um einen lokalen Kubernetes-Cluster zu starten. Es beginnt mit einem einfachen Befehl:

minikube start

Als Ergebnis dieses Befehls wird auf Ihrem Computer ein echter Kubernetes-Cluster ausgeführt.


Quelle der Abbildung Der

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

Um Docker zu zwingen, das Image an den lokalen Kubernetes-Cluster zu senden, erhält der Docker-Computer den folgenden Befehl:

eval $(minikube docker-env)

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

Geben Sie kubectl nicht jedem Zugriff


Dies scheint offensichtlich, aber wenn mehrere Teams denselben Cluster für ihre Anwendungen verwenden (für die Kubernetes erstellt wurde), sollten Sie ihn nicht einfach allen geben kubectl. Es ist besser, die Teams zu trennen, indem Sie jedem von ihnen einen eigenen Namespace zuweisen und den Zugriff durch RBAC-Richtlinien einschränken.

Sie können verwirrt sein, wenn Sie für jeden Pod die Rechte zum Zugreifen, Lesen, Erstellen, Löschen und für andere Vorgänge registrieren. Die Hauptsache ist jedoch, den Zugriff auf Geheimnisse zu beschränken und nur Administratoren zuzulassen. Wir unterscheiden also zwischen denen, die den Cluster verwalten können, und denen, die ihn einfach bereitstellen können.

Verwalten Sie Herdbudgets


Wie kann eine Ausfallzeit für eine Anwendung in einem Kubernetes-Cluster garantiert werden? PodDisruptionBudget und wieder PodDisruptionBudget.

Cluster werden regelmäßig aktualisiert und Knoten werden geleert. Nichts steht still, so ist die Realität. In jeder Bereitstellung mit mehr als einer Instanz sollten Sie auf jeden Fall einen PDB (PodDisruptionBudget) einschließen. Es wird in einer einfachen Yaml-Datei erstellt, die für den Cluster gilt. Der Abdeckungsbereich eines bestimmten PDB wird durch Etikettenselektoren bestimmt.

Hinweis: Das PDB-Budget wird nur im Falle einer freiwilligen Störung berücksichtigt . In Situationen wie Hardwarefehlern funktioniert der PDB nicht.

PDB-Beispiel:

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

Zwei Hauptparameter sind matchLabelsund minAvailable. Der erste Parameter gibt an, welche Anwendungen ein Budget haben. Wenn ich beispielsweise Bereitstellungen mit app: app-aund Tags habe app: app-b, gilt dieser PDB nur für den ersten.

Der Parameter wird minAvailablebeim Entleeren (Reinigen) des Geräts berücksichtigt. In unserem Beispiel werden beispielsweise alle app: app-abis auf zwei Instanzen während der Verwüstung ersetzt .

Auf diese Weise 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: unter Verwendung von Bereitschafts- oder Lebendigkeitsproben.

Der erste Bereitschaftstest ermittelt, ob der Container für den Empfang von Datenverkehr bereit ist.

Die zweite (Lebendigkeit) zeigt an, ob der Container funktioniert oder neu gestartet werden muss.

Geeignete Konfigurationen werden einfach zur Bereitstellung zu yaml hinzugefügt. Dort können Sie Timeouts, Verzögerungszeiten und die Anzahl der Wiederholungsversuche festlegen. Weitere Informationen finden Sie in der Kubernetes-Dokumentation .

Tags überall


Tags sind eines der grundlegenden Konzepte in Kubernetes. Sie ermöglichen es Objekten, frei miteinander zu kommunizieren und Abfragen basierend auf Beschriftungen zu erstellen. In Kubernetes können Sie sogar zum Client gehen und Ereignisse anhand bestimmter Tags anzeigen.

Mit Hilfe von Labels können Sie fast alles tun. Ein gutes Beispiel wäre jedoch, mehrere Umgebungen zum Ausführen von Programmen in einem Cluster zu erstellen.

Angenommen, Sie verwenden denselben Cluster für devund qa. Dies bedeutet, dass möglicherweise eine Anwendung app-agleichzeitig in beiden Umgebungen qaund ausgeführt wird dev. In diesem Fall können wir in einer bestimmten Umgebung separat auf die Anwendungsinstanz zugreifen, indem wir den entsprechenden Parameter angeben environment. Zum Beispiel app: app-aund environment: devfür eine einzelne Umgebung und app: app-aundenvironment: qafür den zweiten.

Auf diese Weise können Sie auf beide Instanzen der Anwendung zugreifen, um beispielsweise gleichzeitig zu testen.

In Ordnung bringen


Kubernetes ist ein sehr leistungsfähiges System, aber jedes System kann in einer Vielzahl von Prozessen stecken bleiben. Kubelet startet alle von Ihnen angegebenen Prozesse und Prüfungen sowie Ihre eigenen.

Natürlich wird ein verwaister Dienst das System nicht verlangsamen, und Kubernetes wurde ursprünglich für die Skalierung entwickelt. Aber wenn eine Million anstelle eines Dienstes erscheint, beginnt das Kubelet zu ersticken.

Wenn Sie aus irgendeinem Grund die Bereitstellung löschen (Container, Image usw.), müssen Sie sie nur vollständig löschen.

Lernen Sie kennen gehen


Wir haben am Ende den Hauptratschlag gespeichert. Lernen Sie die Programmiersprache Go.

Kubernetes wurde auf Go entwickelt, alle Erweiterungen sind auf Go geschrieben und die Client-Go-Client-Bibliothek wird ebenfalls 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 das Beherrschen von Client-Go ist möglicherweise der wichtigste Tipp, den Sie unerfahrenen Kubernetes-Benutzern geben können.

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


All Articles