Basis-Befehle
Hier eine Sammlung nützlicher CLI Befehle, die immer wieder mal gebraucht werden.
Befehle zu Pods
einen Pod starten
kubectl [-n namespace] run <Pod/Container> --image=<Image:Tag> [--rm] -it [--command --] <Command> [<ARG> ...]
# sich wieder verbinden
kubectl [-n namespace] attach <Pod> -c <Container> -it
#
# wieder entfernen
kubectl [-n namespace] delete pod <Pod>
Beispiel:
kubectl -n development run testcont --image=debian:stable-slim -it bash
kubectl -n development attach testcont -c testcont -it
kubectl -n development delete pod testcont
Befehl oder Konsole auf bestehenden Pod ausführen
Beispiel:
# Pod starten mit einem endlosen Prozess:
kubectl -n development run testcont --image=debian:stable-slim sleep infinity
# Bash im Pod ausführen:
kubectl -n development exec -it testcont -- bash
Pod oder Service mit Forwarding erreichen
Port-Forwarding wird zur Zeit nur für TCP unterstützt - UDP ist in der Community hierfür noch in der Diskussion - siehe: https://github.com/kubernetes/kubernetes/issues/47862
# Port-Forwarding zu einem Service
kubectl [-n namespace] port-forward service/<Service-Name im Namespace> [<lokaler Port>]:<Service-Port>
# Port-Forwarding zu einem Deployment
kubectl [-n namespace] port-forward deployments/<Deployment-Name im Namespace> [<lokaler Port>]:<Service-Port>
# oder Statefullset
kubectl [-n namespace] port-forward statefulsets/<Deployment-Name im Namespace> [<lokaler Port>]:<Service-Port>
# oder Daemonset
kubectl [-n namespace] port-forward daemonsets/<Deployment-Name im Namespace> [<lokaler Port>]:<Service-Port>
# Port-Forwarding direkt zu einem Pod
kubectl [-n namespace] get pods # wird zur Ermittlung des Pod-Namens gebraucht
kubectl [-n namespace] port-forward pods/<Pod-Name im Namespace> [<lokaler Port>]:<Service-Port>
Beispiele:
user@local : ~ $ kubectl -n mydbs port-forward services/mydbadmin 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
...
http://localhost:8080/ erreichbar.
Gleiche App, aber via Deployment mit zufälligem lokalen Port:
user@local : ~ $ kubectl -n mydbs port-forward deployments/phpmyadmin :80
Forwarding from 127.0.0.1:50137 -> 80
Forwarding from [::1]:50137 -> 80
...
http://localhost:50137/ erreichbar.
Deployment bearbeiten
Hier und da will man ein Deployment nicht neu ausrollen, aber dennoch "Korrekturen" einsetzen.
Rolling Update
Einen Restart eines Deployments erwirken:
Falls bei dem Container "imagePullPolicy" auf "Always" gesetzt ist, wird dadurch u.a. das erneute Downloaden des Images bewirkt.Rollback
Es besteht die Möglichkeit auf ein Rollback eines Deployments.
kubectl [-n namespace] rollout undo deployment|statefulset|daemonset <Deploy-Name> [--to-revision=<Revisions-Nummer>]
Die Revisions-Nummern können mit einer Historie abgefragt werden:
Der Inhalt kann dann mit Angabe der Revisions-Nummer in einem entsprechenden Format angezeigt werden. (Im folgenden Beispiel als YAML.)kubectl [-n namespace] rollout history deployment|statefulset|daemonset <Deploy-Name> --revision=<RevNr> -o yaml
Update durch Patchen des Image-Tags
Um ein aktuelles oder bestimmtes Image zu laden und dabei ebenfalls einen Neustart des Deployments zu erwirken, reicht es auch das Tag/Label des Container-Images zu ändern - mit einem sog. Patch:
kubectl [-n <namespace>] patch deployment|statefulset|daemonset <Deploy-Name> -p '{"spec": {"template": {"spec":{"containers":[{"name": "<Container-Name>", "image":"<Registry>/<Path>/<Image>:<Tag>"}]}}}}'
Anzahl der Pods in einem Deployment ändern
Um beispielsweise schnell mal auf Last-Spitzen reagieren zu können:
Node Labels und Taints
Wenn nicht bereits bei der Installation des Node-Systems mit angegeben (und somit fest), können Labels und Taints manuell für Nodes erstellt werden.
Node-Labels
generell gilt:
kubectl label node <Node-Name> <Label-Key>=<Label-Value>
# wieder zu entfernen:
kubectl label node <Node-Name> <Label-Key>-
Beispiel für eine Node-Rolle:
kubectl label node <Node-Name> node-role.kubernetes.io/work-plane=true
# wieder zu entfernen:
kubectl label node <Node-Name> node-role.kubernetes.io/work-plane-
Beispiel für ein beliebiges Node-Label:
kubectl label node <Node-Name> tier=frontend
# wieder zu entfernen:
kubectl label node <Node-Name> tier-
Taints
Mit Taints kann bestimmt werden, welche Pods auf einem Node laufen soll(t)en (oder auch nicht).
kubectl taint node <Nodename> <Key>=<Value>:<Effekt>
# wieder entfernen:
kubectl taint node <Nodename> <Key>=<Value>:<Effekt>-
Ein Nebeneffekt ist auch ein "Freiräumen" z.B. für Wartungsarbeiten: