Title: kubectl plugins Author: paco Date: 2020-08-11 Type: article Following the `kubernetes` management theme, there's something that may be of interest for `kubectl` users. That management tool accepts what they call _plugins_. Those are simply executables that reside in `$PATH`, and they follow a naming convention, that is `kubectl-name`. Where `name` is a subcommand you want to create. Sub-sub-commands can nested by creating executables with the form `kubectl-sub-sub-command` (so dash separated words for them). They can be compiled binaries written in your language of choice, or scripts made in your preferred interpreted programming language. I use this to simplify or wrap around existing subcommands, for tasks that I do regularly and annoy me, but can be used to develop new functionalities. For reference, [this is the official documentation][1] I'll show a couple of examples here. ## Restart a deployment This one is as simple as it gets. Actually there's no way of restarting a deployment on kubernetes. Pods are (or should be) stateless and expendable, so you really kill them and the scheduler re-creates them when the deployment definition requirements are not met. A simple way of _"emulating"_ a restart, is modifying the deployment so the scheduler re-creates all the pods in it. For that, just changing the value of an environment variable in the deployment definition will suffice. For that I created this plugin: ``` #!/bin/sh set -eu usage() { echo "kubectl restart " exit 1 } deployment=${1:-x} test $deployment != "x" || usage kubectl set env \ "deployment/$deployment" \ LAST_MANUAL_RESTART="$(date +%Y%m%d.%H%M%S)" ``` ## Custom log output Even with all the log aggregation and the cloudy stuff doing cloudy things, one sometimes needs to take a peek at the logs of an specific container. That can be done with the `kubectl logs` command, which will dump all the things to your terminal. Some of the apps at work spit out some sort of structured JSON as logs, which is hard to read when they come in one line and without any time stamp on them. For that I created this: ``` #!/bin/sh set -eu if ! command -v jq > /dev/null; then echo 'You need to have jq installed to run this plugin.' exit 1 fi usage() { echo "kubectl pslog [container] [options]" echo "(options can be any option passed to kubectl logs)" exit 1 } pod=${1:-x} test $pod != "x" || usage kubectl logs $* |\ grep -E '^{' |\ jq -r '"\(.timestamp.seconds | strftime("%Y-%m-%d %H:%M:%S %Z")) | \(.message)"' ``` `kubectl pslog` uses the power of `jq` to print the time stamp in a human readable manner in front of each log entry, and then _prettifies_ it in the process, which is way more readable. Not much more to say, hope this gives you some ideas to make your life easier when using `kubectl`. [1]: https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/