Hallo! Hier ist Andrew - Entwickler bei Linode. Im Zuge des Aufbaus einer verwalteten Kubernetes-Lösung habe ich einige Tricks entdeckt und entwickelt, die mir die täglichen Aufgaben mit Kubernetes erleichtern. Ich wollte diese fünf hier mit Ihnen teilen und hoffe, Sie finden sie genauso hilfreich wie ich.
1. Der Meta Shell Trick
Ich habe diesen Trick zum ersten Mal in Olive Powers Vortrag über CKA Preparation auf der diesjährigen KubeCon Europe gesehen.
kubectl <command> --help | grep kubectl
Jeder kubectl-Befehl enthält in seiner Hilfe eine Reihe von Beispielen, und auf diesem Wege können Sie sie alle auf einmal anzeigen. Die Beispiele können Ihnen eine Vorstellung davon geben, wie Sie Parameter und Flags auf nützliche und vielleicht überraschende Weise kombinieren können.
Derzeit gibt der Befehl kubectl run die meisten Beispiele aus: 18. Der Befehl, den ich am häufigsten verwende, ist jedoch kubectl get. Werfen wir einen Blick auf eines seiner Beispiele:
kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
Mit diesem Befehl wird die Ausgabe von kubectl get umgewandelt, sodass Sie nur die für diesen Pod bereitgestellte Containerversion erhalten. Mit einigen leichten Änderungen können Sie die Ausgabe viel nützlicher gestalten. Beachten Sie, dass nur der Name und das Bild des ersten Containers (containers[0]) abgefragt werden. Mit der JSONPath-Syntax, die von kubectl unterstützt wird, können Sie alle Versionen aller Container in allen Pods auflisten.
kubectl get pod -o custom-columns=CONTAINER:.spec.containers[*].name,IMAGE:.spec.containers[*].image -A
Dieser Trick kann Ihnen das Stöbern in einzelnen Pod-Ressourcen ersparen, um ein Canary Image oder einen Version Skew in Ihrem Cluster zu finden. Mit einem Alias von kgi (und dem Entfernen des Namespace Selector -A) können Sie die Version des in Ihrem Cluster laufenden kube-apiservers finden. Siehe unten:
$ kgi -n kube-system -l component=component=kube-apiserver
CONTAINER IMAGE
kube-apiserver k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver k8s.gcr.io/kube-apiserver:v1.14.5
kube-apiserver k8s.gcr.io/kube-apiserver:v1.14.5
Der folgende Befehl gibt eine aktuelle Liste aller eingebauten Beispiele aus. Wählen Sie eines mit einigen Flags, die Sie noch nie zuvor gesehen haben, und experimentieren Sie!
for c in $(kubectl --help | egrep "^\s+([a-z-]+)" -o); do echo -e "$(kubectl $c --help | egrep '^\s+kubectl')"; done
2. Speicherverwendung pro Namensraum abrufen
Einige von uns wissen, dass awk so viel mehr ist als awk { print $1 }. Kürzlich habe ich tiefer gegraben und die Grundlagen dieser unglaublich mächtigen Sprache gelernt, die von einigen Titanen der Unix-Geschichte zu uns kam. Hier ist ein Beispiel für ein sehr nützliches awk-Programm, das noch kurz genug ist, um es als Einzeiler zu verwenden. Es summiert und druckt die Anzahl der MiB Speicher, die von allen Pods in jedem Namespace verwendet werden, und verwendet awks printf für eine saubere Ausgabe, selbst wenn Ihr Cluster lange Namespace-Namen enthält. Erwägen Sie die Verwendung von awk, wenn Sie eine aggregierte Ansicht der kubectl-Ausgabe benötigen.
kubectl top pod -A --no-headers=true | awk '{a[$1] += $4} END {for (c in a) printf "%-35s %s\n", c, a[c]}'
3. Secrets als Klartext anzeigen
Wenn Sie eine App entwickeln, die auf Secrets basiert, gilt es einen Weg zu finden, die Kubectl-Ausgabe an base64 zu übergeben. Vielleicht haben Sie eine Shell-Pipeline oder ein kleines Skript geschrieben, um sie zu dekodieren. Ich habe verschiedene Optionen mit verschiedenen Nachteilen gesehen: keine Unterstützung für die mehrzeilige Ausgabe, Hinzufügen bzw. Entfernen von Newlines oder Verlust des Field Names-Kontexts. Mit Ashley Schuetts Secret Decode Plugin für kubectl können Sie ein Secret in einer lesbaren Form innerhalb der kubectl get-Ausgabe anzeigen und all diese Probleme vermeiden.
Die Projektdokumentation empfiehlt die Verwendung von Curl, um das Binary aus GitHub zu holen und in unseren Pfad einzufügen. Da dies viele sensible Daten betrifft, sollten Sie sie es aus dem Quelltext erstellen und die Quelle zuerst überprüfen. Glücklicherweise besteht dieses Plugin aus einer einzigen gut formatierten Quelldatei:
git clone git@github.com:ashleyschuett/kubernetes-secret-decode.git
cd kubernetes-secret-decode
GO111MODULE=off go build -o $GOPATH/bin/kubectl-ksd
Der Name der im letzten Schritt eingebauten Binärdatei muss mit kubectl- beginnen, damit sie als Plugin erkannt wird. Stellen Sie sicher, dass sich $GOPATH/bin in Ihrem $PATH befindet, und dann können Sie es wie folgt verwenden:
kubectl ksd get secret -n <namespace-name> <secret-name> -o yaml
4. Neuste und vorherige Protokolle
Wenn Sie einen Service mit einer wochen- oder monatelanger Betriebszeit haben, können die Container-Logs zu einer solchen Größe anwachsen, dass die typische kubectl log Befehle eine wahnsinnige Menge an Output produzieren. Vielleicht fühlen Sie sich dann, als ob Sie die Grenzen der Fähigkeit Ihres Terminals, Text zu erstellen, ausloten, oder Sie sind einfach nur erstaunt über die Menge an Netzwerkverkehr, die dadurch entsteht. In jedem Fall gibt es mehrere Möglichkeiten, die Ausgabe zu reduzieren und zu den Nachrichten zu gelangen, die Sie wirklich sehen möchten.
Die erste ist die --tail=N
Flag, die mit dem Drucken der neusten N Lines der Datei beginnt.
kubectl logs --tail=10 -f -n kube-system -l component=kube-apiserver
Außerdem gibt es --since=time
die Zeitintervalle wie 30s, 1h oder 5m akzeptiert.
kubectl logs --since=5m -f -n kube-system -l component=kube-apiserver
Eine weitere Log-Flag, der mir wirklich hilft, ist -p. Dadurch werden die Protokolle des vorherigen Laufs des Containers gedruckt, also die Logs eines abgestellten Containers. Das hätte meine ersten Tage mit Kubernetes viel einfacher gemacht, denn ich versuchte, die Pods neu zu starten und ihre Logs mit einer schnellen Maus- und Tastatur-Aktion zu "fangen", bevor sie wieder zusammenbrachen.
kubectl logs -p -n kube-system -l component=etcd
5. Sparen Sie Zeit
Es gibt gute Alternativen zu einem Loop mit einem Sleep-Befehl. Denn unabhängig davon, welches Intervall Sie wählen, werden Sie wahrscheinlich ein oder zwei Sekunden verschwenden. Dies kann sich summieren, wenn es sich um einen automatisierten Prozess handelt. Dafür ist der Befehl kubectl wait und das zugehörige Apimachinery-Paket gedacht. Mit diesem Befehl können Sie Ihre Skripte für die bestimmte Zeit pausieren, die benötigt wird, um die Bedingung in Ihrem Cluster zu erfüllen. Sie können es auch verwenden, um :airhorn: in Slack zu posten, sobald ein neues Release im Cluster auftaucht. Viel Spaß.
Hier sind einige Beispiele:
kubectl wait --for=condition=Available deployment/metrics-server
kubectl wait --for=condition=Initialized pod/csi-linode-controller-0
Die verfügbaren Conditions variieren je nach Ressourcentyp und können mit kubectl describe unter "Conditions:" entdeckt werden. Eine Ressource kann viele verschiedene Conditions gleichzeitig haben.
Bonus-Tricks!
Manchmal schaut man sich den Output an und wünschst sich, dass ein zusätzliches Netzwerk oder andere Informationen angezeigt würden, richtig? Dafür fügen Sie einfach dem Befehl -owide hinzu. Dies funktioniert für fast jeden Ressourcentyp, und die angezeigten Spalten können für Custom Resource Definitions (CRDs) angepasst werden. Beispiele:
kubectl get pods -A -owide
kubectl get services -A -owide
Last but not least, falls Sie es noch nicht bemerkt haben, wurde -A hinzugefügt als Alias für die Flag --all-namespaces
. Ich schätze, dass dieses Feature allein der Welt Millionen von Tastenanschlägen erspart hat. Ein weiterer großartiger Zeitvorteil ist das Hinzufügen von alias k=kubectl
zu Ihrer Shell rc.
Dieser Beitrag hat sich hauptsächlich mit den eingebauten Kubectl-Funktionen beschäftigt. Um noch mehr in die Tiefe zu gehen, gibt es das Open-Source-Kubectl-Buch, das online lesbar ist. Es konzentriert sich auf die Verwendung von Kustomize, einem integrierten Tool, mit dem Sie Ihre Kubernetes-Ressourcen organisieren und zusammenstellen können. Ich empfehle es sehr, besonders wenn Sie nach Kubernetes Projekt Frameworks mit einer unempfindlichen Oberfläche suchen. Eine Sammlung weiterer nützlicher Befehle finden Sie in Krew, dem offiziellen Paketmanager für Kubectl-Plugins.
Kommentare (2)
Great post Andrew, this is actually cool.
#2, getting memory usage based on namespace is a nice hack, on #3, i’d prefer to use rancher to get most of these information.
What do you think, have you tried rancher before?
Thanks : )
I have used Rancher before, in fact Linode has an official Rancher integration which you can read about here: https://www.linode.com/docs/kubernetes/how-to-deploy-kubernetes-on-linode-with-rancher-2-x/
I do like Rancher for managing access to a cluster, the fact that each user gets a ServiceAccount token proxied through the Rancher deployment is very cool.
For viewing secrets, I still use the technique in #3.