There have been quite a few posts recently describing how to write custom plugins, now that the mechanism for creating and working with them has been made easier in upstream Kubernetes (as of v1.12). Here are the official plugin docs if you’re interested in learning more about how it all works.
One neat thing about the new plugin architecture is that they don’t need to be written in Go to be recognized by kubectl. There is a document in the Kubernetes repo that describes how to write your own custom plugin and even a helper library for making it easier to write plugins.
Instead of just writing another tutorial about how to make your own plugin, I decided to show how easy it is to grab and experiment with existing plugins.
Installing krew
If you haven’t heard about it yet, Krew is a new tool released by the Google Container Tools team for managing Kubernetes plugins. As far as I know this is the first plugin manager offering available, and it really scratches my itch for finding a specific tool for a specific job (while also being easy to use).
Krew basically builds on top of the kubectl plugin architecture for making it easier to deal with plugins by providing a sort of framework for keeping track of things and making sure they are doing what they are supposed to.
The following kubectl-compatible plugins are available:
/home/jmreicha/.krew/bin/kubectl-krew
/home/jmreicha/.krew/bin/kubectl-rbac_lookup
...
You can manage plugins without Krew, but if you work with a lot of plugins complexity and maintenance generally start to escalate quickly if you are managing everything manually. Below I will show you how easy it is to deal with plugins instead using Krew.
There are installation instructions in the repo, but it is really easy to get going. Run the following commands in your shell and you are ready to go.
(
set -x; cd "$(mktemp -d)" &&
curl -fsSLO "https://storage.googleapis.com/krew/v0.2.1/krew.{tar.gz,yaml}" &&
tar zxvf krew.tar.gz &&
./krew-"$(uname | tr '[:upper:]' '[:lower:]')_amd64" install \
--manifest=krew.yaml --archive=krew.tar.gz
)
# Then append the following to your .zshrc or bashrc
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
# Then source your shell to pick up the path
source ~/.zshrc # or ~/.bashrc
You can use the kubectl plugin list command to look at all of your plugins.
Test it out to make sure it works.
kubectl krew help
If everything went smoothly you should see some help information and can start working with the plugin manager. For example, if you want to check currently available plugins you can use Krew.
kubectl krew update
kubectl krew search
Or you can browse around the plugin index on GitHub. Once you find a plugin you want to try out, just install it.
kubectl krew install view-utilization
That’s it. Krew should take care of downloading the plugin and putting it in the correct path to make it usable right away.
kubectl view-utilization
Some plugins require additional tools to be installed beforehand as dependencies but should tell you which ones are required when they are installed the first time.
Installing plugin: view-secret
CAVEATS:
\
| This plugin needs the following programs:
| * jq
/
Installed plugin: view-secret
When you are done with a plugin, you can install it just as easily as it was installed.
kubectl krew uninstall view-secret
Conclusion
I must say I am a really big fan of this new model for managing and creating plugins, and I think it will encourage the community to develop even more tools so I’m looking forward to seeing what people come up with.
Likewise I think Krew is a great fit for this because it is super easy to get installed and started with, which I think is important for gaining widespread adoption in the community. If you have an idea for a Kubectl plugin please consider adding it to the krew-index. The project maintainers are super friendly and are great about feedback and getting things merged.