# Kubernetes Pods

Pods sind in Kubernetes die Umgebung in der ein oder mehrere Container gestartet werden können. Container können nicht ohne einen umgebenden Pod laufen.

Alle Container innerhalb eines Pods teilen sich die Namespaces des Pods und können nur parallel auf der gleichen Node laufen. Wir einer der Container eines Pods beendet, dann werden alle Container im gleichen Pod gestoppt.

## Evicted Pods

Pods können durch Signale zu Evicted Pods werden. Die Signale können z.B. durch zu wenig Speicher, Festplattenplatz, fehlende INodes oder Prozess IDs gesetzt werden. Meist starten in dem Fall neue Pods, sobald der entsprechende Engpass behoben ist.

Die verbleibenden - Evicted - Pods können dann entfernt werden.

Eine Liste der Evicted Pods zusammen mit dem Grund wird wie folgt erstellt:

```bash
$ kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}' | while read epod enamespace; do kubectl -n $enamespace get pod $epod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,MSG:.status.message; done 
```

Zum Löschen aller Evicted Pods reicht ebenfalls ein Einzeiler:

```bash
$ kubectl get pods --all-namespaces -o go-template='{{range .items}}{{if eq .status.phase "Failed"}}{{if eq .status.reason "Evicted"}}{{.metadata.name}}{{" "}}{{.metadata.namespace}}{{"\n"}}{{end}}{{end}}{{end}}' | while read epod enamespace; do kubectl -n $enamespace delete pod $epod; done
```

# Debugging mit Ephemeral Containern

Ephemeral Container können einem Pod hinzugefügt werden um in der bestehenden
Pod Umgebung debugging durchführen zu können.

```bash
$ kubectl debug $PODNAME --image=alpine --attach -ti -- sh
```

Nach dem Verlassen des Containers bleibt dieser im Pod erhalten und wird erst
durch entfernen des Pods gelöscht.

Solange kann an den Container attached werden.

```bash
$ kubectl attach $PODNAME $CONTAINERNAME -ti
```
