Friday, February 28, 2020
Author: Cornelius Weig (TNG Technology Consulting GmbH)
kubectl is the most critical tool to interact with Kubernetes and has to address multiple user personas, each with their own needs and opinions.
One way to make
kubectl do what you need is to build new functionality into
Challenges with building commands into
However, that’s easier said than done. Being such an important cornerstone of
Kubernetes, any meaningful change to
kubectl needs to undergo a Kubernetes
Enhancement Proposal (KEP) where the intended change is discussed beforehand.
When it comes to implementation, you’ll find that
kubectl is an ingenious and
complex piece of engineering. It might take a long time to get used to
the processes and style of the codebase to get done what you want to achieve. Next
comes the review process which may go through several rounds until it meets all
the requirements of the Kubernetes maintainers – after all, they need to take
over ownership of this feature and maintain it from the day it’s merged.
When everything goes well, you can finally rejoice. Your code will be shipped
with the next Kubernetes release. Well, that could mean you need to wait
another 3 months to ship your idea in
kubectl if you are unlucky.
So this was the happy path where everything goes well. But there are good
reasons why your new functionality may never make it into
kubectl. For one,
kubectl has a particular look and feel and violating that style will not be
acceptable by the maintainers. For example, an interactive command that
produces output with colors would be inconsistent with the rest of
Also, when it comes to tools or commands useful only to a minuscule proportion
of users, the maintainers may simply reject your proposal as
kubectl needs to
address common needs.
But this doesn’t mean you can’t ship your ideas to
What if you didn’t have to change
kubectl to add functionality?
This is where
kubectl plugins shine.
kubectl v1.12, you can simply
drop executables into your
PATH, which follows the naming pattern
kubectl-myplugin. Then you can execute this plugin as
kubectl myplugin, and
it will just feel like a normal sub-command of
Plugins give you the opportunity to try out new experiences like terminal UIs, colorful output, specialized functionality, or other innovative ideas. You can go creative, as you’re the owner of your own plugin.
Further, plugins offer safe experimentation space for commands you’d like to
kubectl. By pre-releasing as a plugin, you can push your
functionality faster to the end-users and quickly gather feedback. For example,
the kubectl-debug plugin is proposed
to become a built-in command in
kubectl in a
In the meanwhile, the plugin author can ship the functionality and collect
feedback using the plugin mechanism.
How to get started with developing plugins
If you already have an idea for a plugin, how do you best make it happen?
First you have to ask yourself if you can implement it as a wrapper around
kubectl functionality. If so, writing the plugin as a shell script
is often the best way forward, because the resulting plugin will be small,
works cross-platform, and has a high level of trust because it is not
On the other hand, if the plugin logic is complex, a general-purpose language
is usually better. The canonical choice here is Go, because you can use the
client-go library to interact with the Kubernetes API. The Kubernetes
demonstrates some best practices and can be used as a template for new plugin
When the development is done, you just need to ship your plugin to the
Kubernetes users. For the best plugin installation experience and discoverability,
you should consider doing so via the
krew plugin manager. For an in-depth
discussion about the technical details around
kubectl plugins, refer to the
documentation on kubernetes.io.