I figured I would wrap up my three-part mini-series on Kubernetes by talking about some tools that make interacting with Kubernetes easier. Read on to learn more!

In my last post, I talked about kubectl and minikube — these are must haves. As a refresher:
$ brew install kubectl $ brew cask install minikube
Kubectl has a lot of commands so autocompletion is important. With HomeBrew you get this for free if you configured auto-completion for your shell already:
$ brew install bash-completion
Not too long after you start interacting with k8s you will run into namespace and/or multiple clusters. As soon as you find yourself interacting with multiple namespaces or clusters you should definitely take a look at the kubectx and kubens commands:
$ brew install kubectx $ kubectx prod stag $ kubectx prod Switched to context "prod". $ kubens kube-system kube-public default $ kubens default Context "prod" modified. Active namespace is "default".
If you leverage Git today via the CLI, you likely have prompt information whenever you access a Git repo. The same can be achieved with k8s:
$ brew install kube-ps1 $ source /path/to/kube-ps1.sh $ PS1='[\u@\h \W $(kube_ps1)]\$ ' # or update your prompt as desired [user@hostname ~ (⎈ |stag:default)]$ kubeoff -g # turn off kube-ps1 status globally $ kubeon [user@hostname ~ (⎈ |stag:default)]$
As you begin to install and upgrade items running on k8s you may find a package manager helpful. While perhaps not a must-have today, helm is worth considering:
$ brew install kubernetes-helm $ helm init
Finally, aliases and functions can make your life easier. I have created and leverage the following today:
### Kubernetes aliases
alias k='kubectl'
alias mks='minikube --cpus 4 --memory 8192 start --extra-config=kubelet.CAdvisorPort=4194'
alias tls='cluster=$(kubectl config current-context); echo -n "--tls --tls-cert $(helm home)/tls/$cluster/cert.pem --tls-key $(helm home)/tls/$cluster/key.pem"'
alias h='helm $(tls)'
alias grafana='kpf app=grafana 3000'
# Separate file per k8s configuration
if [ -d $HOME/.kube ]; then
    for CONFIG in $(ls $HOME/.kube/config.*); do
        export KUBECONFIG=$KUBECONFIG:$CONFIG
    done
fi
### Kubernetes functions
# Kubernetes Port Forward
kpf () {
    if [ -z "$1" ]; then
        echo "USAGE: $0 <pod-selector> <pod-port> (<local-port>)"
        echo "Example: $0 app=grafana 3000"
        echo "Example: $0 component=web 80 8080"
        return 2
    fi
    POD_SELECTOR=$1
    POD_PORT=$2
    LOCAL_PORT=$3
    if [ -z "${LOCAL_PORT}" ]; then LOCAL_PORT=${POD_PORT}; fi
    POD_FOUND=$(kubectl -n monitoring get pods -l ${POD_SELECTOR} -o name --no-headers=true | head -n 1)
    if [ ! -z "${POD_FOUND}" ]; then
        echo "INFO: Found pod with name: ${POD_FOUND}"
        while (true); do
            kubectl -n monitoring port-forward ${POD_FOUND} ${LOCAL_PORT}:${POD_PORT}
        done
    else
        echo "ERROR: Unable to find pod with selector ${POD_SELECTOR}"
        return 1
    fi
}
© 2018, Steve Flanders. All rights reserved.
