Auf einen Blick: Kubernetes-Pods sind die kleinsten bereitstellbaren Einheiten und kapseln einen oder mehrere Container, die Ressourcen teilen. Dieser Leitfaden behandelt Pod-Typen, Lebenszyklusphasen und Bereitstellung mit YAML-Manifestbeispielen für Einzel- und Mehrcontainer-Pods.
- Kubernetes-Pods verwalten containerisierte Anwendungen effektiv.
- Pods können mehrere eng gekoppelte Container enthalten, die Netzwerk- und Speicherressourcen teilen.
In diesem Artikel werde ich Kubernetes-Pods, Anwendungsfälle und Lebenszyklus erklären sowie erklären, wie man Pods zur Bereitstellung einer Anwendung verwendet.
Dieser Beitrag setzt voraus, dass du den Zweck von Kubernetes verstehst und minikube und kubectl installiert hast.
Was ist ein K8s-Pod?
Von den Objektmodellen in Kubernetes ist der Pod der kleinste Baustein. Innerhalb eines Clusters repräsentiert ein Pod einen laufenden Prozess. Das Innere eines Pods kann einen oder mehrere Container enthalten. Diejenigen innerhalb eines einzelnen Pods teilen sich:
- Eine eindeutige Netzwerk-IP
- Netzwerk
- Lagerung
- Gibt es weitere Spezifikationen, die du dem Pod aufgetragen hast
Eine andere Möglichkeit, sich einen Pod vorzustellen – einen "logischen Host", der spezifisch für Ihre Anwendung ist und einen oder mehrere eng gekoppelte Container enthält. Zum Beispiel nehmen wir an, wir haben einen App-Container und einen Logging-Container in einem Pod. Die einzige Aufgabe des Logging-Containers ist es, Logs aus dem App-Container zu ziehen. Das Platzieren Ihrer Container in einem Pod eliminiert zusätzliche Kommunikationsaufstellungen, da sie co-located sind, sodass alles lokal ist und sie alle Ressourcen teilen. Das ist dasselbe wie die Ausführung auf demselben physischen Server in einer Welt vor dem Container.
Natürlich gibt es noch andere Dinge mit Pods. Vielleicht hast du einen Init-Container , der einen zweiten Container initialisiert. Sobald der zweite Container bereit ist und serviert wird, hört der erste auf – seine Aufgabe ist erledigt.
Pod-Modelltypen
Es gibt zwei Modelltypen von Pods, die du erstellen kannst:
- Ein Container pro Pod. Dieses Modell ist das beliebteste. Der Post ist der "Wrapper" für einen einzelnen Container. Da der Pod das kleinste Objekt ist, das K8S erkennt, verwaltet er die Pods, anstatt die Container direkt zu verwalten.
- Multi-Container-Pod. In diesem Modell kann eine Pod mehrere ko-lokalisierte Container aufnehmen, die eng gekoppelt sind, um Ressourcen zu teilen. Diese Container funktionieren als eine einzige, zusammenhängende Serviceeinheit. Die Pod verpackt dann diese Multi-Container mit Speicherressourcen zu einer einzigen Einheit. Beispielhafte Anwendungsfälle sind Sidecars, Proxies und Logging.
Jeder Pod führt eine einzelne Instanz deiner Anwendung aus. Wenn du die App horizontal skalieren musst (zum Beispiel mehrere Repliken ausführen), kannst du pro Instanz einen Pod verwenden. Das unterscheidet sich vom Betrieb mehrerer Container derselben App innerhalb eines einzelnen Pods.
Es ist erwähnenswert, dass Pods nicht als langlebige Einheiten gedacht sind. Wenn ein Node ausfällt oder du Nodes wartest, überleben die Pods nicht. Um dieses Problem zu lösen, hat K8S Controller – typischerweise kann ein Pod mit einer bestimmten Art von Controller erstellt werden.
Pod-Lebenszyklusphasen
Ein Pod-Status zeigt uns an, wo sich der Pod im Lebenszyklus befindet. Er soll Ihnen eine Vorstellung geben, die nicht mit Sicherheit ist, daher ist es gute Praxis zu debuggen, wenn Pod nicht sauber angezeigt wird. Die fünf Phasen des Pod-Lebenszyklus sind:
- Ausstehend. Der Pod wird akzeptiert, aber mindestens ein Container-Image wurde noch nicht erstellt.
- Läuft. Der Pod ist an einen Knoten gebunden, und alle Container werden erstellt. Ein Container läuft oder ist gerade beim Start oder Neustart.
- Erfolgreich. Alle Container in der Kapsel wurden erfolgreich beendet und starten nicht mehr.
- Fehlgeschlagen. Alle Container sind beendet, wobei mindestens ein Container fehlschlägt. Der fehlgeschlagene Container verließ den Status mit nicht null.
- Unbekannt. Der Zustand der Kapsel konnte nicht ermittelt werden.
Pods in der Praxis
Wir haben darüber gesprochen, was ein Pod theoretisch ist, jetzt schauen wir mal, wie er in der Praxis aussieht. Zuerst gehen wir ein einfaches Pod-Manifest durch, dann stellen wir eine Beispiel-App bereit, die zeigt, wie man damit arbeitet.
Das Manifest (YAML)
Wir werden das Manifest in vier Teile unterteilen:
- ApiVersion – Version der Kubernetes-API, die Sie verwenden
- Art – Art von Objekt, das du erschaffen möchtest
- Metadaten – Informationen, die das Objekt eindeutig identifizieren, wie Name oder Namensraum.
- Spezifikation – Spezifizierte Konfiguration unseres Pods, zum Beispiel Bildname, Containername, Volumes usw.
ApiVersion, Typ und Metadaten sind erforderliche Felder, die für alle Kubernetes-Objekte anwendbar sind, nicht nur für Pods. Das Layout der Spezifikation, die ebenfalls erforderlich ist, variiert je nach Objekt. Das oben gezeigte Beispielmanifest zeigt, wie eine einzelne Container-Pod-Spezifikation aussieht.
Einzelbehälter-Pod
apiVersion: "api version" (1)
kind: "object to create" (2)
Metadata: (3)
Name: "Pod name"
labels:
App: "label value"
Spec: (4)
containers:
- name: "container name"
image: "image to use for container"
Okay, jetzt, wo wir verstehen, wie das Manifest aussieht, zeigen wir beide Modelle zur Erstellung eines Pods.
Unser Pod-1.yaml ist das Manifest für unsere einzelne Container-Kapsel. Sie betreibt eine Nginx-Kapsel, die für uns etwas widerhallt.
apiVersion: v1
kind: Pod
metadata:
name: firstpod
labels:
app: myapp
spec:
containers:
- name: my-first-pod
image: nginx
Als Nächstes deployen wir dieses Manifest in unseren lokalen Kubernetes-Cluster, indem wir Kubectl create -f pod-1.yaml ausführen. Dann führen wir "kubectl get pods" aus, um zu bestätigen, dass unser Pod wie erwartet läuft.
kubectl get pod
NAME READY STATUS RESTARTS AGE
firstpod 1/1 Running 0 45s
Es läuft jetzt! Um zu bestätigen, dass es tatsächlich läuft, starte kubectl exec firstpod—kubeconfig=kubeconfig — service nginx status. Dieser führt einen Befehl in unserem Pod aus, indem ein — service nginx status übermittelt wird. (Hinweis: Das ist ähnlich wie das Ausführen von docker exec.)
kubectl exec firstpod — service nginx status
nginx is running.
Jetzt räumen wir auf, indem wir kubectl delete pod Firstpod ausführen.
kubectl delete pod firstpod
pod "firstpod" deleted
Multi-Container-Manifest
In diesem Beispiel werden wir etwas Nützlicheres bereitstellen: einen Pod mit mehreren Containern, die als eine einzige Entität funktionieren. Ein Container schreibt das aktuelle Datum alle 10 Sekunden in eine Datei, während der andere Container die Logs für uns bereitstellt.
Setze das pod-2.yaml-Manifest mit kubectl create -f pod-2.yaml aus.
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod # Name of our pod
spec:
volumes:
- name: shared-date-logs # Creating a shared volume for my containers
emptyDir: {}
containers:
- name: container-writing-dates # Name of first container
image: alpine # Image to use for first container
command: ["/bin/sh"]
args: ["-c", "while true; do date >> /var/log/output.txt; sleep 10;done"] # writing date every 10secs
volumeMounts:
- name: shared-date-logs
mountPath: /var/log # Mounting log dir so app can write to it.
- name: container-serving-dates # Name of second container
image: nginx:1.7.9 # Image for second container
ports:
- containerPort: 80 # Defining what port to use.
volumeMounts:
- name: shared-date-logs
mountPath: /usr/share/nginx/html # Where nginx will serve the written file
Es lohnt sich, kurz innezuhalten, um Volumes in Pods anzusprechen. In unserem obigen Beispiel bieten Volumes eine Möglichkeit, dass die Container während der Lebensdauer des Pods kommunizieren. Wenn der Pod gelöscht und neu erstellt wird, gehen alle gespeicherten Daten im gemeinsamen Volume verloren. Das Persistent Volumes Object löst dieses Problem, sodass Ihre Daten über den Pod-Verlust hinaus existieren. Wir verwenden dieses Multi-Container-Beispiel, um nicht nur zu demonstrieren, wie man zwei Container-Pods erstellt, sondern auch, wie beide Container Ressourcen teilen.
kubectl create -f pod-2.yaml
pod "multi-container-pod" created
Dann bestätigen wir, dass es wirklich eingesetzt wurde.
kubectl get pod --kubeconfig=kubeconfig
NAME READY STATUS RESTARTS AGE
multi-container-pod 2/2 Running 0 1m
Super! Es läuft. Jetzt sollten wir sicherstellen, dass alles wie erwartet läuft. Wir müssen sicherstellen, dass unser zweiter Behälter die Datteln serviert.
Überprüfe, ob zwei Container in unserem Pod sind, indem du kubectl describe pod "Pod name" ausführst. Dieser Befehl zeigt, wie das erstellte Objekt aussieht.
Containers:
container-writing-dates:
Container ID: docker://e5274fb901cf276ed5d94b625b36f240e3ca7f1a89cbe74b3c492347e98c7a5b
Image: alpine
Image ID: docker-pullable://alpine@sha256:621c2f39f8133acb8e64023a94dbdf0d5ca81896102b9e57c0dc184cadaf5528
Port:
Host Port:
Command:
/bin/sh
Args:
-c
while true; do date >> /var/log/output.txt; sleep 10;done
State: Running
Started: Fri, 16 Nov 2018 11:31:44 -0700
Ready: True
Restart Count: 0
Environment:
Mounts:
/var/log from shared-date-logs (rw)
/var/run/secrets/Kubernetes.io/serviceaccount from default-token-8dl5j (ro)
container-serving-dates:
Container ID: docker://f9c85f3fe398c3197644fb117dc1681635268903b3bba43aa0a1d151fab6ad22
Image: nginx:1.7.9
Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Fri, 16 Nov 2018 11:31:44 -0700
Ready: True
Restart Count: 0
Environment:
Mounts:
/usr/share/nginx/html from shared-date-logs (rw)
/var/run/secrets/Kubernetes.io/serviceaccount from default-token-8dl5j (ro)
Beide Container laufen, also sollten wir sicherstellen, dass beide ihre zugewiesenen Aufgaben erfüllen.
Verbinden Sie sich mit dem Container, indem Sie kubectl exec -ti multi-container-pod -c container-serving-dates —kubeconfig=kubeconfig bash ausführen. Jetzt befinden wir uns im Container.
Schließlich führen wir Curl 'http://localhost:80/output.txt' im Container aus und es sollte unsere Datei ausliefern. (Wenn du Curl nicht im Container installiert hast, führe zuerst apt-get update & apt-get install curl aus und führe dann curl 'http://localhost:80/output.txt' erneut aus.)
curl 'http://localhost:80/app.txt'
Fri Nov 16 18:31:44 UTC 2018
Fri Nov 16 18:31:54 UTC 2018
Fri Nov 16 18:32:04 UTC 2018
Fri Nov 16 18:32:14 UTC 2018
Fri Nov 16 18:32:24 UTC 2018
Fri Nov 16 18:32:34 UTC 2018
Fri Nov 16 18:32:44 UTC 2018
Fri Nov 16 18:32:54 UTC 2018
Zusätzliche Ressourcen
Für mehr Informationen zu Kubernetes entdecken Sie diese Ressourcen:
- Kubernetes-Leitfaden mit 20+ Artikeln und Tutorials
- BMC DevOps Blog
Kubernetes-Leitfaden
- Was ist Kubernetes (K8s)? Ein Tutorial zu den Grundlagen von Kubernetes
- Kubernetes Best Practices für verbesserte Cluster-Effizienz
- Best Practices: Wie man Anwendungen für Kubernetes architekt
- Kubernetes Pods: Eine Einführung
- Kubernetes ReplicaSets: Eine kurze Einführung
- Kubernetes-Deployments vollständig erklärt
- Wie man Kubernetes DaemonSets verwendet und verwaltet
- Wie Kubernetes-Dienste funktionieren
- Verwendung von Kubernetes Port, TargetPort und NodePort
- Erstellen und verwenden von ConfigMaps in Kubernetes
- Einführung in Kubernetes-Geheimnisse
- Kubernetes-Netzwerkgrundlagen
- Kubernetes-Ingress erklärt
- Einführung in Kubernetes Helm Charts
- Was ist das Kubernetes-Operator-Muster?
- Bereitstellung von PostgreSQL als StatefulSet in Kubernetes
- Kubernetes Custom Resource Definition (CRDs) erklärt
- 3 Kubernetes-Muster für Cloud-native Anwendungen
- Kubernetes Compute-Ressourcen erklärt
- Kubernetes-Sicherheit für DevOps-Pipelines
- Verwendung von Spinnaker mit Kubernetes für Continuous Delivery
- Kubernetes-Multi-Cluster: Wie und warum man sie verwendet.
- Kubernetes-Überwachung: Ein umfassender Leitfaden
- Kubernetes vs. Docker: Ein kurzer Vergleich
- Kubernetes vs. Docker Swarm: Vergleich von Container-Orchestrierungstools
- Kubernetes vs. OpenShift: Was ist der Unterschied?
- Kubernetes-Zertifizierungen: Wie und warum man zertifiziert wird
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.