Die besten 10 Tipps und Tricks für Kubernetes

Die besten 10 Tipps und Tricks für Kubernetes

Im Internet gibt es viele Nachschlagewerke, aber manchmal sind die einfachsten Ratschläge die wertvollsten. Das Team Kubernetes aaS von Mail.ru hat eine Auswahl aus zehn Tricks und Tipps übersetzt,die der Autor des Artikels nach einem Jahr Arbeit mit Kubernetes gesammelt hat. Die Tipps sind nicht nach Wichtigkeit sortiert, aber wir glauben, dass jeder etwas Nützliches für sich finden wird.

Der einfachste Befehl bei der Arbeit mit Kubernetes

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

echo "source > ~/.bashrc

Die Autovervollständigung kubectl wird in der .bashrc-Datei gespeichert und wird automatisch bei jedem Start der Shell aktiviert. Das beschleunigt die Eingabe langer Befehle und Parameter wie all-namespacesAdministratorenhandbuch. in der Kubernetes-Hilfe für Bash..

Standardmäßige Speicher- und CPU-Grenzen im Namespace

Wenn eine Anwendung falsch programmiert ist, zum Beispiel jede Sekunde eine neue Verbindung zur Datenbank öffnet, diese aber niemals schließt, tritt im Cluster ein Speicherauslauf auf. Und wenn der Anwendung beim Deployment keine Speichergrenze gesetzt wird, kann das zu einem Knotenfehler führen.

Um dies zu verhindern, ermöglicht Kubernetes die Festlegung von Standardgrenzen für jeden Namensraum. Diese werden in einer YAML-Datei für den jeweiligen Namensraum definiert. 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 Grenze von 512Mi, es sei denn, für diesen Container wird ein anderer individueller Grenzwert festgelegt.

Garbage Collection in älteren Versionen von Kubernetes

Kubelet beginnt standardmäßig mit der Bereinigung, wenn var/lib/docker 90 % des verfügbaren Speicherplatzes belegt sind. Das ist großartig, jedoch gab es bis zur Kubernetes-Version 1.7 keine standardmäßige Grenze für die Anzahl der verwendeten Inode-Descriptoren (Inodes), die der Anzahl der Dateien im Dateisystem entsprechen.

Potentiell kann Ihr Container var/lib/docker nur 50 % des Speicherplatzes verwenden, aber die Inodes könnten erschöpft sein, was Probleme bei der Ausführung von Workern verursachen kann.

In älteren Versionen von kubelet, von 1.4 bis 1.6, müssen Sie folgendes 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. Ältere Versionen überwachen jedoch das Limit der Inodes nicht.

Minikube… klein, aber leistungsstarkes lokales Kubernetes

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

minikube start

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

Die besten 10 Tipps und Tricks für Kubernetes
Bildquelle

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

Um Docker dazu zu bringen, das Image an den lokalen Kubernetes-Cluster zu senden, geben Sie der docker-machine den folgenden Befehl:

eval $(minikube docker-env)

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

Geben Sie kubectl nicht einfach so allen Benutzern

Das mag offensichtlich erscheinen, aber wenn mehrere Teams einen Cluster für ihre Anwendungen nutzen (was der Zweck von Kubernetes ist), sollten Sie nicht einfach allen Benutzern Zugriff gewähren. kubectl. Es ist besser, Teams zu trennen, indem man ihnen ihre eigenen Namensräume zuweist und den Zugang durch RBAC-Richtlinien regelt.

Man kann sich die Mühe machen, für jedes Pod Zugriffsrechte für Lesen, Erstellen, Löschen und andere Operationen festzulegen. Aber das Wichtigste ist, den Zugang zu Geheimnissen einzuschränken und nur Administratoren zu erlauben, darauf zuzugreifen. So trennen wir die, die den Cluster verwalten können, von denen, die ihn nur nutzen können.

Verwalten Sie die Budgets der Pods

Wie garantieren Sie, dass es keine Ausfallzeiten für Anwendungen im Kubernetes-Cluster gibt? PodDisruptionBudget und noch einmal PodDisruptionBudget.

Cluster werden regelmäßig aktualisiert, und Knoten werden geleert. Nichts bleibt stehen, so ist die Realität. In jedes Deployment mit mehr als einer Instanz sollte unbedingt ein PDB (PodDisruptionBudget) integriert werden. Es wird in einer einfachen YAML-Datei erstellt, die auf den Cluster angewendet wird. Der Geltungsbereich eines bestimmten PDB wird durch Labels-Selektoren definiert.

Hinweis: Das Budget des PDB wird nur bei umkehrbarem Budgetübertritt berücksichtigt (freiwillige Störung). In Situationen wie Hardware-Ausfällen funktioniert das PDB nicht.

Beispiel für PDB:

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

Die beiden Hauptparameter 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, dann wird dieses PDB nur auf das erste angewendet.

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

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

Die Überwachung der Anwendungsintegrität

kann auf zwei Arten erfolgen: durch Readiness- oder Liveness-Probes.

Die erste Probe (readiness) bestimmt, ob der Container bereit ist, Traffic zu empfangen.

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

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

Labels überall

Labels sind ein zentrales Konzept in Kubernetes. Sie ermöglichen es Objekten, sich frei miteinander zu verknüpfen und Anfragen basierend auf diesen Labels zu erstellen. In Kubernetes können Sie sogar einen Client ansprechen und Ereignisse für bestimmte Labels überwachen.

Mit Labels können Sie fast alles realisieren, aber ein gutes Beispiel ist die Erstellung mehrerer Umgebungen zur Ausführung von Programmen innerhalb eines Clusters.

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

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

Ordnung schaffen

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

Natürlich wird ein verwaister Dienst das System nicht bremsen, und Kubernetes ist von Grund auf auf Skalierbarkeit ausgelegt. Wenn jedoch anstelle eines Dienstes eine Million hinzukommen, gerät kubelet ins Stocken.

Wenn Sie aus irgendeinem Grund ein Deployment (Container, Image, was auch immer) löschen, stellen Sie sicher, dass alles vollständig entfernt wird.

Lernen Sie Go kennen

Den besten Rat haben wir uns bis zum Schluss aufgehoben. Lernen Sie die Programmiersprache Go.

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

Sie kann für verschiedene spannende Dinge verwendet werden. Zum Beispiel, um das Kubernetes-System nach Ihren Vorstellungen zu erweitern. So können Sie eigene Programme zur Datenerfassung, zum Deployment von Anwendungen oder zur einfachen Bereinigung von Containern nutzen.

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

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

Was gibt es noch zu lesen:

  1. Drei Ebenen des automatischen Skalierens in Kubernetes und wie man sie effektiv nutzt.
  2. Kubernetes-Knoten: viele kleine oder wenige große?
  3. 25 nützliche Werkzeuge zum Deployment und Management von Kubernetes.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster