Webinar-Reihe: Ein genauerer Blick auf Kubernetes

Einführung

Kubernetes ist ein Open-Source-Container-Orchestrierungs-Tool zum Verwalten von containerisierten Anwendungen. Im vorheriges Tutorial in dieser Reihe haben Sie Kubernetes auf DigitalOcean konfiguriert. Nachdem der Cluster nun betriebsbereit ist, können Sie Containeranwendungen darauf bereitstellen.

In diesem Lernprogramm erfahren Sie, wie diese Grundelemente zusammenarbeiten, wenn Sie einen Pod in Kubernetes bereitstellen, als Dienst verfügbar machen und ihn über einen Replikationscontroller skalieren.

Voraussetzungen

Um dieses Lernprogramm abzuschließen, müssen Sie zuerst das vorherige Lernprogramm in dieser Reihe abschließen: Getting Started with Kubernetes.

Schritt 1 - Grundlegendes zu Kubernetes

Kubernetes stellt eine API zur Verfügung, mit der Clients Anwendungen erstellen, skalieren und beenden. Jede Operation zielt auf eines oder mehrere Objekte ab, die Kubernetes verwaltet. Diese Objekte bilden die Grundbausteine ​​von Kubernetes. Sie sind die Grundelemente, über die Sie containerisierte Anwendungen verwalten.

Das Folgende ist eine Zusammenfassung der wichtigsten API-Objekte von Kubernetes:

  • * Cluster *: Pool von Rechen-, Speicher- und Netzwerkressourcen.

  • * Nodes *: Hostcomputer, die im Cluster ausgeführt werden.

  • * Namespaces *: Logische Partitionen eines Clusters.

  • * Pods *: Einheiten der Bereitstellung.

  • * Labels * und * Selectors *: Schlüssel-Wert-Paare zur Identifizierung und Serviceerkennung.

  • * Services *: Sammlung von Pods, die zur selben Anwendung gehören.

  • * Replica Set *: Gewährleistet Verfügbarkeit und Skalierbarkeit.

  • * Bereitstellung *: Verwaltet den Anwendungslebenszyklus.

Schauen wir uns diese genauer an.

Die Nodes, die einen Kubernetes-Cluster ausführen, werden ebenfalls als Objekte behandelt. Sie können wie alle anderen API-Objekte von Kubernetes verwaltet werden. Um die logische Trennung von Anwendungen zu ermöglichen, unterstützt Kubernetes die Erstellung von Namespaces. Beispielsweise kann eine Organisation einen Kubernetes-Cluster logisch partitionieren, um eine Entwicklungs-, Test-, Staging- und Produktionsumgebung auszuführen. Jede Umgebung kann in einen dedizierten Namespace gestellt werden, der unabhängig verwaltet wird. Kubernetes stellt seine API über den Master Node zur Verfügung.

Obwohl Kubernetes Docker-Container ausführt, können diese Container nicht direkt bereitgestellt werden. Stattdessen müssen die Anwendungen in einem Format gepackt werden, das Kubernetes versteht. Mit diesem Format kann Kubernetes containerisierte Anwendungen effizient verwalten. Diese Anwendungen können einen oder mehrere Container enthalten, die zusammenarbeiten müssen.

Die grundlegende Einheit für das Packen und Bereitstellen in Kubernetes heißt Pod. Jeder Pod kann einen oder mehrere Container enthalten, die zusammen verwaltet werden müssen. Beispielsweise können ein Webserver (Nginx) -Container und ein Cache (Redis) -Container zusammen als Pod gepackt werden. Kubernetes behandelt alle Container, die zu einem Pod gehören, als logische Einheit. Jedes Mal, wenn ein neuer Pod erstellt wird, werden alle in der Pod-Definition deklarierten Container erstellt. Alle Container in einem Pod haben denselben Kontext wie die IP-Adresse, den Hostnamen und den Speicher. Sie kommunizieren miteinander über IPC (Interprozesskommunikation) und nicht über Remoteaufrufe oder REST-APIs.

Sobald die Container in Kubernetes gepackt und bereitgestellt wurden, müssen sie für den internen und externen Zugriff verfügbar gemacht werden. Bestimmte Container wie Datenbanken und Caches müssen nicht der Außenwelt ausgesetzt werden. Da auf APIs und Web-Frontends direkt von anderen Verbrauchern und Endbenutzern zugegriffen werden kann, müssen sie der Öffentlichkeit zugänglich gemacht werden. In Kubernetes werden Container basierend auf einer Richtlinie intern oder extern verfügbar gemacht. Durch diesen Mechanismus wird das Risiko verringert, dass sensible Arbeitslasten wie Datenbanken der Öffentlichkeit zugänglich gemacht werden.

Pods in Kubernetes werden durch Services angezeigt. Jeder Service wird zusammen mit den Port- und Protokollinformationen als interner oder externer Endpunkt deklariert. Interne Konsumenten einschließlich anderer Pods und externe Konsumenten wie API-Clients verlassen sich auf Kubernetes Services für die grundlegende Interaktion. Dienste unterstützen TCP- und UDP-Protokolle.

Jedes Objekt in Kubernetes, z. B. ein Pod oder ein Service, ist mit zusätzlichen Metadaten verknüpft, die als Labels und Selectors bezeichnet werden. Labels sind Schlüssel / Wert-Paare, die an ein Kubernetes-Objekt angehängt sind. Diese Bezeichnungen identifizieren ein oder mehrere API-Objekte eindeutig. Selektoren verknüpfen ein Kubernetes-Objekt mit einem anderen. Zum Beispiel hilft ein in einem Service definierter Selektor Kubernetes dabei, alle Pods mit einer Beschriftung zu finden, die dem Wert des Selektors entsprechen. Diese Zuordnung ermöglicht die dynamische Erkennung von Objekten. Neue Objekte, die zur Laufzeit mit denselben Labels erstellt werden, werden sofort erkannt und den entsprechenden Selektoren zugeordnet. Dieser Service Discovery-Mechanismus ermöglicht eine effiziente dynamische Konfiguration, z. B. Scale-In- und Scale-Out-Vorgänge.

Einer der Vorteile des Wechsels zu Containern ist die schnelle Skalierung. Da Container im Vergleich zu virtuellen Maschinen leichtgewichtig sind, können Sie sie in wenigen Sekunden skalieren. Für ein hochverfügbares und skalierbares Setup müssen Sie mehrere Instanzen Ihrer Anwendungen bereitstellen und sicherstellen, dass immer eine Mindestanzahl von Instanzen dieser Anwendungen ausgeführt wird. Um diese Konfiguration von containerisierten Anwendungen zu adressieren, führte Kubernetes das Konzept von Replica Sets ein, mit denen ein oder mehrere Pods die ganze Zeit ausgeführt werden können. Wenn mehrere Instanzen von Pods in einem Cluster ausgeführt werden müssen, werden sie als Replikatsätze gepackt. Kubernetes stellt sicher, dass die Anzahl der im Replikatsatz definierten Pods immer im aktiven Modus ist. Wenn ein Pod aufgrund eines Hardware- oder Konfigurationsproblems beendet wird, startet die Kubernetes-Steuerebene sofort einen weiteren Pod.

Ein Deployment-Objekt ist eine Kombination aus Pods und Replikatsätzen. Dieses Grundelement erweitert Kubernetes-Anwendungen um PaaS-ähnliche Funktionen. Damit können Sie ein laufendes Upgrade einer vorhandenen Bereitstellung mit minimaler Ausfallzeit durchführen. Bereitstellungen ermöglichen auch Muster wie kanarische Bereitstellungen und blaugrüne Bereitstellungen. Sie übernehmen die wesentlichen Teile des Application Lifecycle Management (ALM) von Container-Anwendungen.

Schritt 2 - Auflisten der Kubernetes-Knoten und -Namensräume

Angenommen, Sie haben die Schritte unter den Kubernetes-Cluster in DigitalOcean einrichten ausgeführt, führen Sie die folgenden Befehle aus, um alle aufzulisten Knoten und verfügbare Namespaces:

kubectl get nodes
OutputNAME                  STATUS    ROLES     AGE       VERSION
spc3c97hei-master-1   Ready     master    10m       v1.8.7
spc3c97hei-worker-1   Ready     <none>    4m        v1.8.7
spc3c97hei-worker-2   Ready     <none>    4m        v1.8.7
kubectl get namespaces
OutputNAME                STATUS    AGE
default             Active    11m
kube-public         Active    11m
kube-system         Active    11m
stackpoint-system   Active    4m

Wenn kein Namespace angegeben ist, zielt "+ kubectl +" auf den Standard-Namespace.

Jetzt starten wir eine Anwendung.

[[step-3–-creating-and-deploying-a-pod]] === Schritt 3 - Erstellen und Bereitstellen eines Pods

Kubernetes-Objekte werden in YAML-Dateien deklariert und über die CLI + kubectl + an Kubernetes gesendet. Definieren wir einen Pod und stellen ihn bereit.

Erstellen Sie eine neue YAML-Datei mit dem Namen "+ Simple-Pod.yaml +":

nano Simple-Pod.yaml

Fügen Sie den folgenden Code hinzu, der einen Pod mit einem Container basierend auf dem Nginx-Webserver definiert. Es wird über das TCP-Protokoll auf dem Port "+ 80 " angezeigt. Beachten Sie, dass die Definition die Bezeichnungen " name " und " env +" enthält. Wir verwenden diese Bezeichnungen, um bestimmte Pods zu identifizieren und zu konfigurieren.

Simple-Pod.yaml

apiVersion: "v1"
kind: Pod
metadata:
 name: web-pod
 labels:
   name: web
   env: dev
spec:
 containers:
   - name: myweb
     image: nginx
     ports:
       - containerPort: 80
         name: http
         protocol: TCP

Führen Sie den folgenden Befehl aus, um einen Pod zu erstellen.

kubectl create -f Simple-Pod.yaml
Outputpod "web-pod" created

Lassen Sie uns die Erstellung des Pods überprüfen.

kubectl get pods
OutputNAME      READY     STATUS    RESTARTS   AGE
web-pod   1/1       Running   0          2m

Im nächsten Schritt werden wir diesen Pod für das öffentliche Internet zugänglich machen.

Schritt 4 - Pods über einen Dienst freigeben

Dienste machen eine Reihe von Pods entweder intern oder extern verfügbar. Definieren wir einen Service, der den Nginx-Pod öffentlich verfügbar macht. Wir werden Nginx über einen NodePort verfügbar machen, ein Schema, das den Pod über einen beliebigen Port zugänglich macht, der auf jedem Knoten des Clusters geöffnet ist.

Erstellen Sie eine neue Datei mit dem Namen "+ Simple-Service.yaml +", die diesen Code enthält, der den Dienst für Nginx definiert:

Simple-Service.yaml

apiVersion: v1
kind: Service
metadata:
 name: web-svc
 labels:
   name: web
   env: dev
spec:
 selector:
   name: web
 type: NodePort
 ports:
   - port: 80
     name: http
     targetPort: 80
     protocol: TCP

Der Service erkennt alle Pods im selben Namespace, die mit dem Label mit dem Buchstaben "+ name: web +" übereinstimmen. Der Selektorabschnitt der YAML-Datei definiert diese Zuordnung explizit.

Wir geben an, dass der Service vom Typ NodePort ist, und zwar durch die Deklaration NodePort.

Verwenden Sie dann, um es an den Cluster zu senden.

kubectl create -f Simple-Service.yml

Diese Ausgabe zeigt an, dass der Service erfolgreich erstellt wurde:

Outputservice "web-svc" created

Lassen Sie uns den Port ermitteln, an dem der Pod verfügbar ist.

kubectl get services
OutputNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.3.0.1     <none>        443/TCP        28m
     NodePort    10.3.0.143   <none>        80:32097/TCP   38s

Anhand dieser Ausgabe sehen wir, dass der Service auf Port + 32097 + verfügbar ist. Versuchen wir, eine Verbindung zu einem der Arbeitsknoten herzustellen.

Verwenden Sie die DigitalOcean-Konsole, um die IP-Adresse eines der Arbeitsknoten abzurufen.

image: https://assets.digitalocean.com/articles/webinar_4_kubernetes_closer_look/kB9HmSK.png [Die Tröpfchen in der DigitalOcean-Konsole, die Ihrem Kubernetes-Cluster zugeordnet sind.]

Verwenden Sie den Befehl "+ curl ", um eine HTTP-Anforderung an einen der Knoten an Port " 31930 +" zu senden.

curl http://:32097

Die Antwort mit der Nginx-Standardhomepage wird angezeigt:

Output<!DOCTYPE html>
<html>
 <head>
   <title>Welcome to nginx!</title>
...
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
   <p><em>Thank you for using nginx.</em></p>
 </body>
</html>

Sie haben einen Pod und einen Service definiert. Betrachten wir nun die Skalierung mit Replikatsätzen.

Schritt 5 - Skalieren von Pods durch das Replikatset

Ein Replikatsatz stellt sicher, dass mindestens eine Mindestanzahl von Pods im Cluster ausgeführt wird. Löschen Sie den aktuellen Pod und erstellen Sie drei Pods über das Replikatset neu.

Löschen Sie zunächst den vorhandenen Pod.

kubectl delete pod web-pod
Outputpod "web-pod" deleted

Erstellen Sie nun eine neue Replikatsatzdeklaration. Die Definition des Replikatsatzes ist identisch mit einem Pod. Der Hauptunterschied besteht darin, dass es das Replikatelement enthält, das die Anzahl der auszuführenden Pods definiert. Wie ein Pod enthält er auch Labels als Metadaten, die bei der Serviceerkennung hilfreich sind.

Erstellen Sie die Datei "+ Simple-RS.yml +" und fügen Sie den folgenden Code zur Datei hinzu:

Simple-RS.yml

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
 name: web-rs
 labels:
   name: web
   env: dev
spec:
 replicas: 3
 selector:
   matchLabels:
     name: web
 template:
   metadata:
     labels:
       name: web
       env: dev
   spec:
     containers:
     - name: myweb
       image: nginx
         ports:
           - containerPort: 80
             name: http
             protocol: TCP

Speichern und schließen Sie die Datei.

Erstellen Sie nun das Replikatset:

kubectl create -f Simple-RS.yml
Outputreplicaset "web-rs" created

Dann überprüfen Sie die Anzahl der Pods:

kubectl get pods
OutputNAME           READY     STATUS    RESTARTS   AGE
web-rs-htb58   1/1       Running   0          38s
web-rs-khtld   1/1       Running   0          38s
web-rs-p5lzg   1/1       Running   0          38s

Wenn wir über den NodePort auf den Service zugreifen, wird die Anfrage an einen der vom Replikatsatz verwalteten Pods gesendet.

Testen Sie die Funktionalität eines Replikatsets, indem Sie einen der Pods löschen und sehen, was passiert:

kubectl delete pod web-rs-p5lzg
Outputpod "web-rs-p5lzg" deleted

Schauen Sie sich die Schoten noch einmal an:

kubectl get pods
OutputNAME           READY     STATUS              RESTARTS   AGE
web-rs-htb58   1/1       Running             0          2m
web-rs-khtld   1/1       Running             0          2m

web-rs-p5lzg   1/1       Running             0          2m
web-rs-p5lzg   0/1       Terminating         0          2m

Sobald der Pod gelöscht wird, hat Kubernetes einen neuen erstellt, um sicherzustellen, dass die gewünschte Anzahl beibehalten wird.

Schauen wir uns nun Bereitstellungen an.

Schritt 6 - Umgang mit Bereitstellungen

Obwohl Sie Container als Pods und Replikatsätze bereitstellen können, erleichtern Bereitstellungen das Aktualisieren und Patchen Ihrer Anwendung. Sie können einen Pod mithilfe einer Bereitstellung direkt aktualisieren, was mit einem Replikatsatz nicht möglich ist. Dadurch ist es möglich, eine neue Version einer Anwendung mit minimalen Ausfallzeiten bereitzustellen. Sie bieten PaaS-ähnliche Funktionen für das Anwendungsmanagement.

Löschen Sie den vorhandenen Replikatsatz, bevor Sie eine Bereitstellung erstellen. Dadurch werden auch die zugehörigen Pods gelöscht:

kubectl delete rs web-rs
Outputreplicaset "web-rs" deleted

Definieren Sie nun eine neue Bereitstellung. Erstellen Sie die Datei "+ Simple-Deployment.yaml +" und fügen Sie den folgenden Code hinzu:

Simple-Deployment.yaml

apiVersion: apps/v1beta2
kind: Deployment
metadata:
 name: web-dep
 labels:
   name: web
   env: dev
spec:
 replicas: 3
 selector:
   matchLabels:
     name: web
 template:
   metadata:
     labels:
       name: web
   spec:
     containers:
     - name: myweb
       image: nginx
       ports:
       - containerPort: 80

Erstellen Sie eine Bereitstellung und überprüfen Sie die Erstellung.

kubectl create -f Simple-Deployment.yml
Outputdeployment "web-dep" created

Anzeigen der Bereitstellungen:

kubectl get deployments
OutputNAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
web-dep   3         3         3            3           1m

Da die Bereitstellung zur Erstellung von Pods führt, werden gemäß der Replikatdeklaration in der YAML-Datei drei Pods ausgeführt.

kubectl get pods
OutputNAME                       READY     STATUS    RESTARTS   AGE
web-dep-8594f5c765-5wmrb   1/1       Running   0          2m
web-dep-8594f5c765-6cbsr   1/1       Running   0          2m
web-dep-8594f5c765-sczf8   1/1       Running   0          2m

Der zuvor erstellte Service leitet die Anforderungen weiterhin an die vom Deployment erstellten Pods weiter. Dies liegt an den Beschriftungen, die dieselben Werte wie die ursprüngliche Pod-Definition enthalten.

Bereinigen Sie die Ressourcen, indem Sie Deployment and Service löschen.

kubectl delete deployment web-dep
Outputdeployment "web-dep" deleted
kubectl delete service web-svc
Outputservice "web-svc" deleted

Weitere Informationen zu Bereitstellungen finden Sie in der Kubernetes documentation.

Fazit

In diesem Lernprogramm haben Sie die Grundbausteine ​​von Kubernetes beim Bereitstellen eines Nginx-Webservers mit einem Pod, einem Service, einem Replikatsatz und einer Bereitstellung erläutert.

Im nächsten Teil dieser Serie erfahren Sie, wie Sie eine Multi-Container-Anwendung packen, bereitstellen, skalieren und verwalten.