13 Kubernetes Pod: Eine grundlegende Einheit

Ein Pod in Kubernetes repräsentiert die kleinste “deployable” Einheit innerhalb eines Clusters und ist ein zentraler Baustein, um Anwendungen auf der Plattform zu betreiben. Jeder Pod kann einen oder mehrere Container hosten, die zusammen als eine Einheit orchestriert werden. Hier sind die Kernkonzepte und Funktionen von Pods in Kubernetes:

Lifecycle

13.0.1 Beispiel

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-storage
      mountPath: /usr/share/nginx/html
  volumes:
  - name: nginx-storage
    persistentVolumeClaim:
      claimName: nginx-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

In diesem Beispiel-Manifest wird ein Pod erstellt, der einen Container hostet, welcher das neueste nginx-Image verwendet. Der Container öffnet Port 80 und montiert ein Persistent Volume an /usr/share/nginx/html. Ein PersistentVolumeClaim namens nginx-pvc wird ebenfalls erstellt, um eine dauerhafte Speicheranforderung von 1 GiB zu stellen.

13.0.2 Anmerkung

Ein gründliches Verständnis von Pods und ihrer Funktionsweise ist entscheidend für die effektive Nutzung von Kubernetes für die Orchestrierung von Container-basierten Anwendungen. Pods bilden die Grundlage für die Erstellung, Verwaltung und Skalierung von Anwendungen in einer Kubernetes-Umgebung.

13.1 kubectl Befehle für Pod-Management in Kubernetes

Pod Aktionen und entsprechende kubectl Befehle:

Aktion Kommando Beispiel
Pod erstellen kubectl apply -f pod.yaml kubectl apply -f pod.yaml
Pod auflisten kubectl get pods kubectl get pods
Pod-Details kubectl describe pod <pod-name> kubectl describe pod mypod
Pod löschen kubectl delete pod <pod-name> kubectl delete pod mypod
Pod-Logs anzeigen kubectl logs <pod-name> kubectl logs mypod
Pods in Namespace kubectl get pods --namespace=<name> kubectl get pods --namespace=development
Interaktive Shell kubectl exec -it <pod-name> -- /bin/sh kubectl exec -it mypod -- /bin/sh
Label hinzufügen kubectl label pods <pod-name> key=value kubectl label pods mypod environment=production

Erweiterte Pod-Management Befehle:

Aktion Kommando
Pod mit run kubectl run <pod-name> --image=<image>
Pod-Informationen kubectl get pods <pod-name> -o wide
Pod bearbeiten kubectl edit pods <pod-name>
Pod löschen (Datei) kubectl delete -f [fileName].yaml
Ressourcenverbrauch kubectl top pods --sort-by cpu

13.2 command

In einer Kubernetes-Pod-Spezifikation werden ENTRYPOINT und CMD aus einem Dockerfile

# Verwenden eines Basisimages
FROM ubuntu:latest

# Setzen des Arbeitsverzeichnisses im Container
WORKDIR /app

# Kopieren des Start-Skripts in das Arbeitsverzeichnis
COPY start.sh /app/start.sh

# Bereitstellen des Start-Skripts als ausführbare Datei
RUN chmod +x /app/start.sh

# Setzen des ENTRYPOINT auf das Start-Skript
ENTRYPOINT ["/app/start.sh"]

# Definieren des default CMD
CMD ["-a", "option1"]

wie folgt übersetzt

13.3 ENTRYPOINT

ENTRYPOINT wird durch das Feld command in der Pod-Spezifikation ersetzt.

Beispiel in Kubernetes YAML:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    command: ["/app/start.sh"]

13.4 CMD

CMD wird durch das Feld args in der Pod-Spezifikation ersetzt.

Beispiel in Kubernetes YAML:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    args: ["-a", "option1"]

13.5 Kombination von command und args

Wenn sowohl command als auch args in der Kubernetes-Pod-Spezifikation definiert sind, werden sie zusammen verwendet, ähnlich wie ENTRYPOINT und CMD in einem Dockerfile.

Beispiel in Kubernetes YAML:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    command: ["/app/start.sh"]
    args: ["-a", "option1"]

In diesem Fall wird der Container mit dem Befehl /app/start.sh -a option1 gestartet.

args kann in der Kubernetes-Pod-Spezifikation als Liste von Strings definiert werden. Jeder String in der Liste wird als separates Argument an den Befehl übergeben, der im command-Feld definiert ist.

Beispiel in Kubernetes YAML:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    command: ["/app/start.sh"]
    args:
    - "-a"
    - "option1"
    - "--flag"
    - "value"

In diesem Fall wird der Container mit dem Befehl /app/start.sh -a option1 --flag value gestartet.