Supercharge your Kubernetes setup with OhMyZSH 🚀🚀🚀 + awesome command line tools
Table of Contents
Almost all of my colleagues who have worked with kubernetes have had similar complaints about the kubectl tool. It's so verbose! I need to remember such long commands! This lead me to search and discover a bunch of powerful cli tools, which combined with the OhMyZSH command line framework can make your kubectl journey much smoother.
How you would usually use kubectl
kubectl
by itself is a very powerful kubernetes client, and can be used for all kinds of purposes, but it really is too verbose, with a lot of gotchas in different commands.
- Query the kubernetes pods running in specific namespaces of your kubernetes cluster.
kubectl get pod -n myZoo
- Get the status of and details about different kubernetes entities, such as pods, configmaps, services etc.
kubectl describe deployment myCatDeploy -n myZoo
- Tail the logs of a specific container. Firstly, find the list of all pods with
kubectl get pod -n myZoo
then find your specific pod and run kubectl logs
(and hope you didn't make a typo anywhere)
kubectl logs -f myKittenPod -n myZoo
Tools to turbocharge kubectl
We can do better.
I give the installation instructions for these tools with macOS here. You can check the links to get installation instructions for other operating systems.
1. kubectx to switch cluster & namespaces quickly
kubectx can be installed on macOS with homebrew
brew install kubectx
This command actually installs two tools, kubectx
and kubens
.
You can use kubectx
to switch between different clusters with kubectx my-cluster-name
. Behind the scenes, this command will edit your ~/.kube/config
file to mark a specific cluster as being the current-context
. You would otherwise have to edit this file manually or use kubectl config use-context my-cluster-name
.
kubens
helps you switch between namespaces quickly. Whereas earlier you would have had to run kubectl config set-context --current --namespace=myZoo
, now you can just run kubens myZoo
.
As a bonus, I alias these tools to even shorter commands in my ZSH configuration file (~/.zshrc
).
alias kctx="kubectx"
alias kns="kubens"
Then source the ZSH configuration file to load the changes.
source ~/.zshrc
Furthermore, if you use it with OhMyZsh you can get auto-completion of namespaces and cluster names with these completion scripts. No need to remember those long namespaces anymore!
mkdir -p ~/.oh-my-zsh/completions
chmod -R 755 ~/.oh-my-zsh/completions
ln -s /opt/kubectx/completion/kubectx.zsh ~/.oh-my-zsh/completions/_kubectx.zsh
ln -s /opt/kubectx/completion/kubens.zsh ~/.oh-my-zsh/completions/_kubens.zsh
2. kube-ps1 to display current cluster & namespace
kube-ps1 is a great companion tool to kubectx
and kubens
which displays the currently active cluster and namespace on your command line prompt. No more accidental deploys to the production cluster at 2AM.
Install with:
brew install kube-ps1
Here's how your kubernetes cluster-name (minikube
) and namespace (default
) appear in the command prompt now:
Here's how it looks when combined with the kubectx
and kubens
tools to switch clusters and namespaces.
3. OhMyZSH kubectl plugin for kubectl shortcuts
OhMyZSH actually has a plugin for kubectl which gives you nearly hundred shortcuts for commonly used commands.
To use it, add kubectl
to the plugins array in your ~/.zshrc
file and then source the ~/.zshrc
file like before:
plugins=(... kubectl)
source ~/.zshrc
Some shortcuts for commonly used commands provided by this plugin below.
Alias | Command | Description |
---|---|---|
k | kubectl | The kubectl command |
kaf | kubectl apply -f | Apply a YML file |
keti | kubectl exec -ti | Drop into an interactive terminal on a container |
kdel | kubectl delete | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
kgp | kubectl get pods | List all pods in ps output format |
kdp | kubectl describe pods | Describe all pods |
kdelp | kubectl delete pods | Delete all pods matching passed arguments |
kgd | kubectl get deployment | Get the deployment |
… and more! Check out the full list on the github page.
4. stern for logs
stern has been designed to allow you to tail the logs of multiple pods and containers using regex. This means that you can search pods by partial name matches, rather than having to query the full names of pods and then running kubectl logs -f
with the exact name of every single pod.
Install with:
brew install stern
To receive and then tail all the available logs of all pods whose names partially match myKitten
(assuming default
namespace of the minikube
cluster used with kubectx
, kubens
and kube-ps1
):
(⎈ |minikube:default)➜ ~ stern myKitten
To receive the last 10 lines per container and then tail:
(⎈ |minikube:default)➜ ~ stern myKittenPod --tail=10
To receive the last 2 minutes of logs per container and then tail:
(⎈ |minikube:default)➜ ~ stern myKittenPod --since=2m
You can also source stern autocompletion with zsh by adding this to your ~/.zshrc
and then running source ~/.zshrc
source <(stern --completion=zsh)
5. kpoof to port-forward pods intuitively
kpoof is the easiest way to port-forward ports, which is often useful when you want to test an internal service which is not supposed to be publicly exposed outside the cluster.
Install with:
brew tap farmotive/k8s
brew install kpoof
With kpoof
, you get an interactive way to firstly choose the namespace, and then the name of the pod which you would like to port-forward. The tool forwards the same local port number as the port exposed by the pod by default.
For example, in order to port-forward localhost port 3306 to port 3306 of the pod nyc
below, you can run the following commands:
$ kpoof
Namespace? (default zoo):
1 zoo
2 town
3 city
3
Pod number? (default 1):
1 nyc
2 london
3 bangkok
1
Forwarding from 127.0.0.1:3306 -> 3306
See it in action below.
6. Popeye to scan your cluster for potential issues
Popeye is a tool which scans your cluster for misconfigured resources. Currently, nodes, namespaces, pods and services are supported for scanning.
When your cluster grows to 100s of different pods and to 10s of different namespaces, having such a tool is invaluable in detecting issues before they blow up, especially if you don't have monitoring on some of these resources.
Install with:
brew install derailed/popeye/popeye
Run with the command popeye
to eye your entire cluster. Here's a screenshot of a well-maintained cluster which gets the cluster score 93 -- A
from popeye
Bonus
@megabreit pointed out on Twitter that I missed the built-in auto-completion feature of kubectl
, which allows you to run any kubectl
command and then type resource names partially. For example, you could type in partial namespace names and wait for the full namespace name to be fetched from the kube-api-server
.
For ZSH, install with:
source <(kubectl completion zsh)
If you've aliased your kubectl
, you can extend autocompletion to work with it this way:
echo 'alias k=kubectl' >>~/.zshrc
echo 'complete -F __start_kubectl k' >>~/.zshrc
Know of any other useful CLI or GUI utilities for kubernetes? Let me know in the comments below!
Did you find this article useful? If yes, follow me on Twitter. Feel free to suggest ideas, give feedback or discuss any Backend or DevOps topics with me.