Static Pods
Ziel
In diesem Hands-On lernen Sie, wie die zentralen Komponenten von Kubernetes funktionieren und wie sich deren Verhalten bei Ausfällen oder Änderungen verhält. Sie werden:
- den kube-apiserver umkonfigurieren und Audit Logging aktivieren
- den kube-scheduler gezielt stoppen und starten
- den kubelet deaktivieren und die Auswirkungen analysieren
Vorbereitung
- Verbinden Sie sich auf die Controlplane-Node:
ssh controlplane-0
- Setzen Sie die kubeconfig:
export KUBECONFIG=/etc/kubernetes/admin.conf
- Überprüfen Sie den Clusterzustand:
kubectl get nodes
kubectl get pods -n kube-system
Aufgabe 1 - kube-apiserver umkonfigurieren (Audit Logging)
Der kube-apiserver läuft als Static Pod auf der Controlplane-Node.
1.1: Audit Policy erstellen
- Erstellen Sie die Datei
/etc/kubernetes/audit-policy.yamlmit folgendem Inhalt:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
Diese Audit Policy konfiguriert den kube-apiserver so, dass er Metadaten aller API-Requests protokolliert. Wir müssen nun den kube-apiserver so konfigurieren, dass er diese Audit Policy verwendet und die Logs in einem Verzeichnis auf der Node speichert.
1.2: Audit Logging aktivieren
- Öffnen Sie das Manifest des kube-apiservers
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
cd /etc/kubernetes/manifests
ls
nano kube-apiserver.yaml
- Fügen Sie folgende Parameter unter
command:hinzu:
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
- --audit-log-path=/var/log/kubernetes/audit/audit.log
- Mounten Sie die Audit Policy Datei und das Log-Verzeichnis in den Container, indem Sie folgende
volumeMountshinzufügen:
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
- Konfigurieren Sie die
hostPathVolumes:
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
1.3: Verhalten beobachten
- Lassen Sie sich die laufenden Pods anzeigen und beobachten Sie anschließend die Logs des kube-apiservers:
kubectl get pods -n kube-system
cat /var/log/kubernetes/audit/audit.log | grep kubernetes-admin
Aufgabe 2 - kube-scheduler stoppen und starten
2.1: Scheduler stoppen
- Stoppen Sie den kube-scheduler
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
mv /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/manifests/.kube-scheduler.yaml
Lassen Sie sich den Status des kube-schedulers anzeigen:
kubectl get pods -n kube-system
2.2: Pod erstellen
Erstellen Sie einen neuen Pod:
kubectl run nginx-test --image=nginx
Beobachten Sie den Status des Pods:
kubectl get pods
👉 Beobachtung: Pod bleibt im Status Pending
2.3: Scheduler wieder starten
- Starten Sie den kube-scheduler wieder
- Beobachten Sie den Status des Pods
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
mv /etc/kubernetes/manifests/.kube-scheduler.yaml /etc/kubernetes/manifests/kube-scheduler.yaml
kubectl get pods -w
👉 Beobachtung: Pod wird geplant und startet
Aufgabe 3 - kubelet stoppen
3.1: kubelet stoppen
- Loggen Sie sich von der Controlplane-Node ab:
exit
- Finden Sie heraus, auf welcher Worker-Node der vorher erstellte Pod
nginx-testläuft:
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get pods -o wide
- Stoppen Sie den kubelet Dienst auf der Worker-Node auf der der vorher erstellte Pod
nginx-testläuft
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
ssh <worker-node>
systemctl stop kubelet
3.2: Verhalten beobachten
- Loggen Sie sich aus der Worker-Node wieder aus:
exit
- Beobachten Sie den Status der Node:
kubectl get nodes
👉 Beobachtung: Node wird NotReady (Es kann etwas Zeit dauern, bis der Status aktualisiert wird)
3.3: Logs prüfen
- Lassen Sie sich die Logs des Pods anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl logs <pod-name>
👉 Beobachtung: Logs nicht verfügbar
3.4: kubelet wieder starten
- Starten Sie den kubelet Dienst wieder
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
ssh <worker-node>
systemctl start kubelet
exit
- Beobachten Sie den Status der Node und des Pods und lassen Sie sich die Logs des Pods anzeigen
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl get nodes
kubectl get pods
kubectl logs <pod-name>
👉 Beobachtung: Node wird wieder Ready, Logs sind wieder erreichbar
Zusammenfassung
- kube-apiserver: zentrale API, konfigurierbar über Static Pods
- kube-scheduler: entscheidet über Pod-Platzierung
- kubelet: steuert Pods auf Nodes