Kubernetes

Bereitstellen von Apps in Kubernetes-Clustern

Bereitstellen von Apps in Kubernetes-Clustern

In einem früheren Artikel haben wir einen Kubernetes-Cluster mit einem Master- und einem Worker-Knoten bereitgestellt. Bei Kubernetes-Clustern geht es hauptsächlich um zwei Dinge; Knoten und Pods. Pods sind die containerisierten Anwendungen, die Sie auf dem Cluster bereitstellen möchten, und Knoten sind die einzelnen Rechenserver, die entweder für die Verwaltung des Clusters oder die Ausführung der Apps verantwortlich sind. Zur Vereinfachung beginnen wir mit einer zustandslosen Anwendung und führen verschiedene Konzepte wie Labels und Selektoren ein, die verwendet werden, um Pods miteinander zu binden.

Es gibt andere wichtige Konzepte wie Replikatsätze, Dienste und Bereitstellungen, die wir alle in diesem Artikel kennenlernen werden.


Herkömmliche App-Bereitstellung

Wenn Sie sich den traditionellen Ansatz zur Bereitstellung einer Web-App ansehen, müssen Sie die Skalierbarkeit vor dem Start berücksichtigen. Wenn Sie eine von Ihrem Web-Frontend getrennte Datenbank benötigen, tun Sie dies besser jetzt als später. Planen Sie, mehr als eine Web-App auszuführen?? Konfigurieren Sie besser vorher einen Reverse-Proxy-Server.

Mit Kubernetes hat sich der Ansatz geändert. Die Bereitstellung kann unter Berücksichtigung der aktuellen Anforderungen erfolgen und kann später mit dem Wachstum Ihres Unternehmens skaliert werden. Die Containerisierung ermöglicht es Ihnen, wesentliche Komponenten Ihrer Webdienste zu trennen, selbst wenn diese auf einem einzigen Knoten ausgeführt werden. Wenn Sie später horizontal skalieren (was bedeutet, dass Sie Ihrer Umgebung mehr Server hinzufügen), müssen Sie einfach mehr Container einrichten, und Kubernetes wird dies auf den entsprechenden Knoten für Sie planen.  Reverse-Proxy? Kubernetes-Dienste würden dieses Problem lösen.


Pods

Lassen Sie uns als ersten Schritt eine Kapsel hochfahren. Dazu benötigen wir eine YAML-Datei, die verschiedene Attribute des Pods definiert.

apiVersion: v1
Art: Pod
Metadaten:
Name: nginx
spezifikation:
Behälter:
- Name: nginx
Bild: nginx:1.7.9
Häfen:
- ContainerPort: 80

Fügen Sie den Inhalt oben in a . hinzu pod.yaml Datei und speichern Sie es. Wenn Sie sich den obigen Text ansehen, können Sie sehen, dass die nett der Ressource, die wir schaffen, ist a pod. Wir haben es genannt nginx, und das bild ist nginx:1.7.9 was standardmäßig bedeutet, dass Kubernetes das entsprechende nginx-Image aus den öffentlich verfügbaren Images des Docker-Hubs abruft.

In großen Organisationen ist K8 oft so konfiguriert, dass es auf eine private Registrierung verweist, aus der es die entsprechenden Container-Images abrufen kann.

Starten Sie nun den Pod-Lauf:

$kubectl create -f pod.yaml

Sie können von außerhalb des Clusters nicht auf den Pod zugreifen. Es ist noch nicht exponiert, und es existiert nur als einsame Schote. Um sicherzustellen, dass es tatsächlich bereitgestellt wird, führen Sie Folgendes aus:

$kubectl Pods abrufen

Um den Pod namens . loszuwerden nginx, führe den Befehl aus:

$kubectl Pod nginx löschen

Bereitstellungen

Es ist nicht der Sinn von Kubernetes, nur einen funktionierenden Pod zu bekommen, was wir idealerweise wollen, sind mehrere Repliken eines Pods, die oft auf verschiedenen Knoten geplant sind. Wenn also ein oder mehrere Knoten ausfallen, sind die restlichen Pods immer noch vorhanden den zusätzlichen Arbeitsaufwand erhöhen.

Darüber hinaus müssten wir aus entwicklungspolitischer Sicht eine Möglichkeit haben, Pods mit einer neueren Version der Software auszurollen und die älteren Pods inaktiv zu machen. Falls es ein Problem mit dem neueren Pod gibt, können wir ein Rollback durchführen, indem wir ältere Pods zurückbringen und die fehlgeschlagene Version löschen. Deployments ermöglichen uns das.

Folgendes ist eine sehr gängige Methode zum Definieren einer Bereitstellung:

apiVersion: apps/v1beta1
Art: Bereitstellung
Metadaten:
Name: nginx-Bereitstellung
spezifikation:
Repliken: 2
Vorlage:
Metadaten:
Etiketten:
App: nginx
spezifikation:
Behälter:
- Name: nginx
Bild: nginx:1.7.9
Häfen:
- ContainerPort: 80

Sie werden unter anderem ein Schlüssel-Wert-Paar bemerken, das ist:

Etiketten:
App:
nginx

Labels sind wichtig für das Cluster-Management, da sie dabei helfen, eine große Anzahl von Pods mit derselben Aufgabe zu verfolgen. Pods werden auf Befehl des Master-Knotens erstellt und kommunizieren mit dem Master-Knoten. Wir brauchen jedoch noch einen effektiven Weg, um miteinander zu sprechen und als Team zusammenzuarbeiten.


Dienstleistungen

Jeder Pod hat seine eigene interne IP-Adresse und eine Kommunikationsschicht wie Flannel hilft den Pods, miteinander zu kommunizieren. Diese IP-Adresse ändert sich jedoch ziemlich und schließlich besteht der Sinn vieler Pods darin, sie wegwerfbar zu machen. Pods werden oft getötet und wiederbelebt.

Die Frage, die sich jetzt stellt, ist diese: Wie werden die Front-End-Pods mit den Back-End-Pods kommunizieren, wenn die Dinge im Cluster so dynamisch sind??

Services kommen ins Spiel, um diese Komplexität zu lösen. Ein Dienst ist ein weiterer Pod, der wie ein Load Balancer zwischen einer Teilmenge von Pods und dem Rest des Kubernetes-Clusters agiert. Es bindet sich an alle Pods, denen ein bestimmtes Label zugeordnet ist, z. B. Datenbank, und macht sie dann für den Rest des Clusters verfügbar.

Wenn wir beispielsweise einen Datenbankdienst mit 10 Datenbank-Pods haben, können einige der Datenbank-Pods auftauchen oder beendet werden, aber der Dienst würde sicherstellen, dass der Rest des Clusters den 'Dienst' erhält, der eine Datenbank ist. Dienste können auch verwendet werden, um das Front-End dem Rest des Internets zugänglich zu machen.

Hier ist eine typische Definition eines Dienstes.

apiVersion: v1
Art: Service
Metadaten:
Name: wordpress-mysql
Etiketten:
App: WordPress
spezifikation:
Häfen:
- Hafen: 3306
Wähler:
App: WordPress
Stufe: mysql
ClusterIP: Keine

Die Pods mit der Bezeichnung WordPress mit der angegebenen mysql-Stufe werden von diesem Dienst abgeholt und den Webserver-Pods für ein typisches WordPress-Setup auf Kubernetes angezeigt.


Wort der Vorsicht

Bei der Bereitstellung einer riesigen Multi-Tier-App, die sich an eine große Verbraucherbasis richtet, ist es sehr verlockend, viele Dienste (oder Microservices, wie sie im Volksmund genannt werden) zu schreiben. Obwohl dies für die meisten Anwendungsfälle eine elegante Lösung ist, können die Dinge schnell aus dem Ruder laufen.

Dienste wie Pods sind fehleranfällig. Der einzige Unterschied besteht darin, dass beim Ausfall eines Dienstes viele Pods, die perfekt funktionieren, unbrauchbar werden. Wenn Sie also eine große Verbindung von Diensten (sowohl intern als auch extern) haben und etwas ausfällt, ist es unmöglich, den Fehlerpunkt herauszufinden.

Als Faustregel gilt: Wenn Sie eine grobe Visualisierung des Clusters haben oder eine Software wie cockpit verwenden können, um sich den Cluster anzusehen und ihn zu verstehen, ist Ihr Setup in Ordnung. Kubernetes soll Komplexität reduzieren, nicht verbessern.

Kostenlose und Open-Source-Spiele-Engines für die Entwicklung von Linux-Spielen
Dieser Artikel behandelt eine Liste von kostenlosen und Open-Source-Spiele-Engines, die für die Entwicklung von 2D- und 3D-Spielen unter Linux verwend...
Shadow of the Tomb Raider für Linux Tutorial
Shadow of the Tomb Raider ist die zwölfte Erweiterung der Tomb Raider-Reihe – ein Action-Adventure-Franchise von Eidos Montrealdos. Das Spiel wurde vo...
So steigern Sie die FPS unter Linux?
FPS steht für Bilder pro Sekunde. Die Aufgabe von FPS besteht darin, die Bildrate bei Videowiedergaben oder Spielleistungen zu messen. In einfachen Wo...