☸️ Kubernetes: A Pragmatic Kubectl Aliases Collection

Benoit COUETIL 💫 - Jan 6 - - Dev Community

Initial thoughts

Managing Kubernetes clusters and performing administrative tasks can be complex and time-consuming. However, with the right set of kubectl aliases, you can streamline your Kubernetes administration and make your tasks more efficient. In this article, we will explore a collection of useful kubectl aliases that can help you perform common tasks faster and with greater ease. From retrieving resource information to troubleshooting pods and managing nodes, these aliases will become invaluable tools in your Kubernetes toolkit. So, let's dive in and discover the kubectl aliases you need to simplify your Kubernetes administration!

Prerequisites

Before you can start using these helpful kubectl aliases, make sure you have the following prerequisites on your workstation:

The alias list

Here is a list of useful kubectl aliases that you can add to your shell configuration:

# autocomplete kubectl & helm
source <(kubectl completion zsh)
source <(helm completion zsh)

alias k=kubectl

# when using below aliases, print kubectl command and then execute it
function kctl() { echo "+ kubectl $@" && command kubectl $@ }

# add aliases collection like 'kgpo' for 'kubectl get pods` from https://github.com/ahmetb/kubectl-aliases
[ ! -f ~/.kube/aliases.sh ] && curl -fsSL "https://raw.githubusercontent.com/ahmetb/kubectl-aliases/master/.kubectl_aliases" > ~/.kube/aliases.sh && sed -i -e 's/kubectl/kctl/g' ~/.kube/aliases.sh
source ~/.kube/aliases.sh

# set default namespace
alias kn='kctl config set-context --current --namespace'
# get events sorted by last timestamp
alias kgel='kctl get events --sort-by=.lastTimestamp'
# get events sorted by creation timestamp
alias kgec='kctl get events --sort-by=.metadata.creationTimestamp'
# get pod's descending events
function kger() { kctl get events --sort-by=.lastTimestamp --field-selector involvedObject.name="$@" }
# get 'real' all
alias kgworld='kctl get $(kubectl api-resources --verbs=list --namespaced -o name | paste -sd ",")'
# display all nodes resources request and limits
alias kgnr="k get nodes --no-headers | awk '{print \$1}' | xargs -I {} sh -c 'echo {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- ; echo '"
# start a debug pod (including lots of troubleshooting tools)
alias kdebug="kctl -n default run debug-$USER --rm -it --tty --image leodotcloud/swiss-army-knife:v0.12 --image-pull-policy=IfNotPresent -- bash"
# get pod's containers list
function kgpc() { kctl get pod -o jsonpath="{.spec.containers[*].name}" "$@" && echo "" }
# ping a service, ex: 'kping whoami:8080'
alias kping='kctl run httping -it --image bretfisher/httping --image-pull-policy=IfNotPresent --rm=true --'
# get existing pod's yaml without forbidden fields, ex: 'kyaml pod whoami'
function kyaml() { kubectl get "$@" -o yaml | kubectl-neat }
# display and delete failed pods in current namespace
alias krmfailed='kctl delete pods --field-selector=status.phase=Failed'
Enter fullscreen mode Exit fullscreen mode

man repairing a blue ship, (wrench), ((repairman)), ((tools)), (blue ship)

Use cases explained

Let's dive into some of the use cases and explanations for these aliases.

1. Write basic commands faster

The kubectl-aliases Github repo contains a script that generates hundreds of basic aliases, included in the above list.

Some of the 800 generated aliases are:

alias k='kubectl'
alias kg='kubectl get'
alias kgpo='kubectl get pod'

alias ksysgpo='kubectl --namespace=kube-system get pod'

alias krm='kubectl delete'
alias krmf='kubectl delete -f'
alias krming='kubectl delete ingress'
alias krmingl='kubectl delete ingress -l'
alias krmingall='kubectl delete ingress --all-namespaces'

alias kgsvcoyaml='kubectl get service -o=yaml'
alias kgsvcwn='kubectl get service --watch --namespace'
alias kgsvcslwn='kubectl get service --show-labels --watch --namespace'

alias kgwf='kubectl get --watch -f'
...
Enter fullscreen mode Exit fullscreen mode

However, it can be challenging to recall what a command is for:

$> kgcmslwn main

# NAME                   DATA   AGE    LABELS
# kube-root-ca.crt       1      144d   <none>
# logstash-config        1      100d   app=logstash,chart=logstash,heritage=Helm,release=ls
# logstash-pipeline      1      100d   app=logstash,chart=logstash,heritage=Helm,release=ls
# ls-finance-config      1      61d    app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance
# ls-finance-pipeline    1      61d    app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance
Enter fullscreen mode Exit fullscreen mode

To address this, we added a function that displays the full command before executing it. This provides clarity and helps you understand what the command does:

$> kgcmslwn main
+ kubectl get configmap --show-labels --watch --namespace main

# NAME                   DATA   AGE    LABELS
# kube-root-ca.crt       1      144d   <none>
# logstash-config        1      100d   app=logstash,chart=logstash,heritage=Helm,release=ls
# logstash-pipeline      1      100d   app=logstash,chart=logstash,heritage=Helm,release=ls
# ls-finance-config      1      61d    app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance
# ls-finance-pipeline    1      61d    app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance
Enter fullscreen mode Exit fullscreen mode

2. Get sorted and filtered events

Sorting events in a Kubernetes cluster can be challenging. We added aliases to sort events by last seen date and creation timestamp.

$> kgel -A
+ kubectl get events --sort-by=.lastTimestamp -A

# NAMESPACE            LAST SEEN   TYPE      REASON                 OBJECT                                            MESSAGE
# illu-for-designers   22m         Warning   Unhealthy              pod/auth-server-67c944c549-7qmmj                  Startup probe failed: Get "http://10.0.8.148:8080/auth-server/actuator/health/liveness": dial tcp 10.0.8.148:8080: connect: connection refused
# fix-analytics-env    3m23s       Warning   BackOff                pod/marketplace-test-6b9955d469-9zq2n             Back-off restarting failed container
# elk                  2m44s       Normal    WaitForFirstConsumer   persistentvolumeclaim/ls-logstash-ls-logstash-0   waiting for first consumer to be created before binding
# illu-for-designers   2m4s        Warning   BackOff                pod/backoffice-5c88b6d84-mv88z                    Back-off restarting failed container

$> kgec -A
+ kubectl get events --sort-by=.metadata.creationTimestamp -A

# NAMESPACE            LAST SEEN   TYPE      REASON                 OBJECT                                            MESSAGE
# elk                  4m4s        Normal    WaitForFirstConsumer   persistentvolumeclaim/ls-logstash-ls-logstash-0   waiting for first consumer to be created before binding
# fix-analytics-env    4m43s       Warning   BackOff                pod/marketplace-test-6b9955d469-9zq2n             Back-off restarting failed container
# illu-for-designers   3m20s       Warning   BackOff                pod/bff-66b6b7bc4b-l8s82                          Back-off restarting failed container
# illu-for-designers   23m         Warning   Unhealthy              pod/auth-server-67c944c549-7qmmj                  Startup probe failed: Get "http://10.0.8.148:8080/auth-server/actuator/health/liveness": dial tcp 10.0.8.148:8080: connect: connection refused
Enter fullscreen mode Exit fullscreen mode

Additionally, you can filter events for a specific resource using the kger alias:

$> kger auth-server-67c944c549-7qmmj
+ kubectl get events --sort-by=.lastTimestamp --field-selector involvedObject.name=auth-server-67c944c549-7qmmj

# LAST SEEN   TYPE      REASON      OBJECT                             MESSAGE
# 26m         Warning   Unhealthy   pod/auth-server-67c944c549-7qmmj   Startup probe failed: Get "http://10.0.8.148:8080/auth-server/actuator/health/liveness": dial tcp 10.0.8.148:8080: connect: connection refused
# 99s         Warning   BackOff     pod/auth-server-67c944c549-7qmmj   Back-off restarting failed container
Enter fullscreen mode Exit fullscreen mode

3. Display every resources (really)

The kubectl get all command does not actually display all resources. To overcome this limitation, we created the kgworld alias. This alias retrieves all resources using kubectl get $(kubectl api-resources --verbs=list --namespaced -o name | paste -sd ",").

4. Display nodes resources requests and limits

To view the resource requests and limits for nodes in your cluster, you can use the kgnr alias. This alias provides a clear overview of CPU and memory allocations for each node.

$> kgnr

# ip-10-0-17-119.eu-west-1.compute.internal
#   Resource                    Requests       Limits
#   cpu                         935m (23%)     6300m (160%)
#   memory                      11952Mi (80%)  10948Mi (73%)
# ip-10-0-31-235.eu-west-1.compute.internal
#   Resource                    Requests       Limits
#   cpu                         1415m (36%)    8900m (227%)
#   memory                      14259Mi (96%)  15326Mi (103%)
Enter fullscreen mode Exit fullscreen mode

man repairing a blue ship, (wrench), ((repairman)), ((tools)), (blue ship)

5. Start a swiss-army-knife debug pod

Debugging pods can be challenging when they lack the necessary troubleshooting tools.

The kdebug alias solves this problem by starting a debug pod with all the essential tools pre-installed: arping, arptables, bridge-utils, ca-certificates, conntrack, curl, docker, dnsutils, ethtool, iperf, iperf3, iproute2, ipsec-tools, ipset, iptables, iputils-ping, jq, kmod, kubectl, ldap-utils, less, libpcap-dev, man, manpages-posix, mtr, net-tools, netcat, netcat-openbsd, openssl, openssh-client, psmisc, socat, tcpdump, telnet, tmux, traceroute, tcptraceroute, tree, ngrep, vim, wget, yq.

6. Get pod's containers list

To retrieve a list of containers within a pod, you can use the kgpc alias. This is useful when you need to work with specific containers within a pod:

$> kgpc ebs-csi-controller-b77c4f786-dxv4g -n kube-system
+ kubectl get pod -o jsonpath={.spec.containers[*].name} ebs-csi-controller-b77c4f786-dxv4g -n kube-system

# ebs-plugin csi-provisioner csi-attacher csi-snapshotter csi-resizer liveness-probe
Enter fullscreen mode Exit fullscreen mode

7. Ping a service

Testing the availability of a Kubernetes service can be challenging. The kping alias uses the HTTP Ping Docker image to ping a service and check its availability:

$> kgsvc
+ kubectl get service

# NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
# api                    ClusterIP   172.20.251.151   <none>        80/TCP     12d
# auth-server            ClusterIP   172.20.241.45    <none>        80/TCP     144d
# backend                ClusterIP   172.20.89.116    <none>        80/TCP     144d
# webapp                 ClusterIP   172.20.68.65     <none>        80/TCP     144d

$> kping auth-server:80
+ kubectl run httping -it --image bretfisher/httping --image-pull-policy=IfNotPresent --rm=true -- auth-server:80

# If you don't see a command prompt, try pressing enter.
# connected to 172.20.241.45:80 (159 bytes), seq=1 time=  4.63 ms
# connected to 172.20.241.45:80 (159 bytes), seq=2 time=  2.07 ms
# connected to 172.20.241.45:80 (159 bytes), seq=3 time=  1.90 ms
# connected to 172.20.241.45:80 (159 bytes), seq=4 time=  2.30 ms
Enter fullscreen mode Exit fullscreen mode

8. Get a runnable manifest of an deployed resource

When retrieving the YAML of a deployed resource using kubectl get pod -o=yaml, certain fields are unnecessary and can cause issues when redeploying the YAML. The kyaml alias solves this problem by providing a runnable manifest that excludes unnecessary fields.

It depends on kubectl-neat mentioned in pre-requisites.

9. Delete failed (and evicted) pods

Failed pods can clutter your cluster and affect performance. The krmfailed alias allows you to easily delete failed pods in the current namespace.

Wrapping up

These kubectl aliases provide a convenient way to streamline your Kubernetes administration tasks. By using these aliases, you can save time and effort when working with kubectl commands. Whether you need to retrieve specific information, troubleshoot pods, or manage resources, these aliases have got you covered.

So go ahead, give these a try, and enjoy a more efficient Kubernetes administration experience!

Some useful aliases are missing ? please advise in the comments 🤓

man repairing a blue ship, (wrench), ((repairman)), ((tools)), (blue ship)

Illustrations generated locally by Automatic1111 using MajicMixFantasy model

Further reading

This article was enhanced with the assistance of an AI language model to ensure clarity and accuracy in the content, as English is not my native language.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .