Die kleinste mögliche, gemeinsam platzierte Workload-Einheit bereitstellen.
→Eine `Pod`-Ressource definieren. Pods können einen oder mehrere Container enthalten, die Netzwerk und Speicher teilen.
Warum: Der Pod ist die atomare Planungseinheit in Kubernetes. Container werden immer innerhalb eines Pods bereitgestellt.
Referenz↗
Sicherstellen, dass der Cluster-Zustand kontinuierlich einem gewünschten Zustand entspricht.
→Sich auf den `kube-controller-manager` verlassen. Er führt Kontrollschleifen aus, die Ressourcen (z.B. ReplicaSets, Deployments) überwachen und Unterschiede abgleichen.
Warum: Dies ist der deklarative, selbstheilende Kernmechanismus. Stirbt ein von einem ReplicaSet verwalteter Pod, ersetzt der Controller diesen automatisch.
Neu erstellte Pods automatisch dem am besten geeigneten Worker-Knoten zuweisen.
→Sich auf den `kube-scheduler` verlassen. Er filtert Knoten basierend auf Pod-Anforderungen (z.B. Ressourcenanfragen) und bewertet sie, um die beste Übereinstimmung auszuwählen.
Warum: Der Scheduler trifft Platzierungsentscheidungen basierend auf Richtlinien, Affinität und Verfügbarkeit und abstrahiert die Knotenauswahl vom Benutzer.
Sicherstellen, dass in Pods spezifizierte Container auf einem bestimmten Worker-Knoten laufen und fehlerfrei sind.
→Der `kubelet`-Agent läuft auf jedem Knoten, kommuniziert mit dem API-Server und verwaltet den Container-Lebenszyklus (Start, Stopp, Gesundheitsprüfungen) über eine Container-Laufzeitumgebung.
Warum: Kubelet ist die Verbindung zwischen der Steuerungsebene und dem Worker-Knoten; es führt die Pod-Spezifikationen aus.
Den gesamten Zustand und die Konfiguration des Kubernetes-Clusters zuverlässig speichern.
→`etcd` verwenden, einen konsistenten und hochverfügbaren Schlüssel-Wert-Speicher. Er dient als einzige Quelle der Wahrheit für den Cluster.
Warum: Alle Cluster-Objekte (Pods, Services usw.) werden in etcd gespeichert. Nur der API-Server kommuniziert direkt damit.
Netzwerkregeln auf jedem Knoten implementieren, um die Kommunikation über Kubernetes Services zu ermöglichen.
→Die `kube-proxy`-Komponente auf jedem Knoten verwaltet Netzwerkregeln (z.B. iptables, IPVS), die den Traffic von einer Service-IP an die richtigen Backend-Pods weiterleiten.
Warum: Kube-proxy ist das Implementierungsdetail hinter der Service-Abstraktion, das Lastverteilung und Routing handhabt.
Einen einzelnen Kubernetes-Cluster logisch für mehrere Teams, Projekte oder Umgebungen partitionieren.
→`Namespace`-Ressourcen erstellen. Namespaces bieten einen Bereich für Namen und eine Möglichkeit, Autorisierungen und Richtlinien (z.B. ResourceQuotas) anzuhängen.
Warum: Namespaces ermöglichen Multi-Tenancy und Ressourcenorganisation ohne den Overhead mehrerer Cluster.
Einen stabilen Netzwerkendpunkt (IP und DNS) für eine Reihe von kurzlebigen Pods bereitstellen.
→Eine `Service`-Ressource definieren, die eine Gruppe von Pods mittels eines Label-Selektors anspricht.
Warum: Pods sind kurzlebig und ihre IPs ändern sich. Ein Service bietet eine dauerhafte Abstraktion, die den Traffic zu den richtigen Pods lastverteilt.
Referenz↗
Eine in Pods laufende Anwendung verschiedenen Netzwerkbereichen zugänglich machen.
→Einen Service `type` auswählen: `ClusterIP` (nur intern, Standard), `NodePort` (exponiert auf jeder Knoten-IP:Port) oder `LoadBalancer` (stellt einen Cloud-Load-Balancer bereit).
Warum: Der Service-Typ bestimmt die Zugänglichkeit der Anwendung, von rein intern bis vollständig extern.
Direkte Netzwerkerkennung einzelner Pods ermöglichen, den Service-Proxy umgehend.
→Einen `Service` mit `clusterIP: None` erstellen. Dies erstellt DNS-A-Einträge für jeden Pod, wodurch Clients direkt mit Pods verbinden können.
Warum: Unerlässlich für zustandsbehaftete Anwendungen wie Datenbanken (oft mit StatefulSets), bei denen Peer-to-Peer-Kommunikation oder eine stabile Pod-Identität erforderlich ist.
Eine Untermenge von Kubernetes-Objekten organisieren und auswählen.
→Schlüssel-Wert-`Labels` an Objekte anfügen (z.B. `app: my-api`). `Label-Selektoren` in anderen Objekten (z.B. Services, Deployments) verwenden, um sie anzusprechen.
Warum: Labels sind der zentrale Gruppierungsmechanismus in Kubernetes, der eine lose Kopplung zwischen Ressourcen ermöglicht.
Anwendungskonfiguration vom Container-Image entkoppeln.
→Nicht-sensible Konfigurationsdaten in einer `ConfigMap` speichern. Sie als Volume mounten oder Schlüssel als Umgebungsvariablen in Pods injizieren.
Warum: Dies ermöglicht die unabhängige Verwaltung der Konfiguration vom Anwendungscode, gemäß den 12-Faktor-App-Prinzipien.
Sensible Daten wie Passwörter, Token oder API-Schlüssel für die Anwendungsnutzung speichern.
→Ein `Secret`-Objekt verwenden. Als Volume mounten oder als Umgebungsvariable injizieren.
Warum: Secrets sind speziell für sensible Daten und werden sicherer behandelt als ConfigMaps (z.B. standardmäßig nicht in `kubectl describe` angezeigt, können im Ruhezustand verschlüsselt werden).
Zustandsbehafteten Anwendungen Speicher bereitstellen, der Pod-Neustarts überdauert.
→Ein Pod erstellt einen `PersistentVolumeClaim` (PVC), um Speicher anzufordern. Ein Administrator stellt ein `PersistentVolume` (PV) bereit, das die Anforderung erfüllt.
Warum: Dies entkoppelt Speichernutzung (PVC) von Speicherbereitstellung (PV) und ermöglicht portable Workload-Definitionen.
CPU- und Speicherzuweisung für Container verwalten.
→`resources.requests` für garantierte Ressourcen (für die Planung verwendet) und `resources.limits` für die maximal zulässige Nutzung (zur Laufzeit durchgesetzt) festlegen.
Warum: Requests stellen sicher, dass Pods genügend Ressourcen zum Ausführen haben; Limits verhindern, dass Pods zu viele Ressourcen verbrauchen und andere Workloads beeinträchtigen.
Aggregierte Ressourcenbeschränkungen für einen Namespace festlegen.
→Ein `ResourceQuota`-Objekt erstellen, um die Gesamtmenge an CPU, Speicher oder die Anzahl der Objekte (Pods, Services), die in einem Namespace erstellt werden können, zu begrenzen.
Warum: ResourceQuotas sind in Multi-Tenant-Umgebungen unerlässlich, um eine faire Ressourcenteilung zu gewährleisten und Überverbrauch zu verhindern.
Kubernetes-Ressourcen mit versionskontrollierten Konfigurationsdateien verwalten.
→`kubectl apply -f <filename.yaml>` verwenden. Dieser Befehl erstellt oder aktualisiert Ressourcen basierend auf dem Dateiinhalt.
Warum: `apply` ist deklarativ und somit ideal für GitOps und CI/CD. Es verfolgt Änderungen und führt einen Drei-Wege-Merge durch, was sicherer ist als das imperative `create` oder `replace`.
Diagnostizieren, warum ein Pod nicht korrekt läuft (z.B. feststeckt in Pending, ContainerCreating oder CrashLoopBackOff).
→`kubectl describe pod <pod-name>` verwenden. Den Abschnitt `Events` am Ende auf detaillierte Nachrichten vom Scheduler, Kubelet oder den Controllern überprüfen.
Warum: `describe` bietet ein chronologisches Ereignisprotokoll, das das primäre Werkzeug zur Behebung von Problemen im Ressourcenlebenszyklus ist.
Netzwerkfunktionalität für Container bereitstellen, die Pod-zu-Pod-Kommunikation über den Cluster hinweg ermöglicht.
→Ein Container Network Interface (CNI)-Plugin verwenden (z.B. Calico, Flannel, Cilium). Der Kubelet auf jedem Knoten verwendet das CNI-Plugin, um die Netzwerkverbindung für jeden Pod zu konfigurieren.
Warum: CNI bietet eine Standardschnittstelle, die es Kubernetes ermöglicht, mit verschiedenen Netzwerklösungen integriert zu werden, ohne Kernkomponenten zu modifizieren.
Zugriff auf Kubernetes API-Ressourcen für Benutzer und Anwendungen steuern.
→Rollenbasierten Zugriffskontrolle (RBAC) verwenden. Eine `Role` (namespaced) oder `ClusterRole` (cluster-weit) mit Berechtigungen definieren und diese einem Subjekt (Benutzer, Gruppe, ServiceAccount) mittels einer `RoleBinding` oder `ClusterRoleBinding` zuweisen.
Warum: RBAC ist der Standard zur Absicherung von Kubernetes und ermöglicht das Prinzip der geringsten Rechte für alle API-Interaktionen.
Referenz↗