Blog: Bring your ideas to the world with kubectl plugins
-
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 makekubectl
do what you need is to build new functionality intokubectl
.Challenges with building commands into
kubectl
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 ofkubectl
. Also, when it comes to tools or commands useful only to a minuscule proportion of users, the maintainers may simply reject your proposal askubectl
needs to address common needs.But this doesn’t mean you can’t ship your ideas to
kubectl
users.What if you didn’t have to change
kubectl
to add functionality?This is where
kubectl
plugins shine. Sincekubectl
v1.12, you can simply drop executables into yourPATH
, which follows the naming patternkubectl-myplugin
. Then you can execute this plugin askubectl myplugin
, and it will just feel like a normal sub-command ofkubectl
.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 propose 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 inkubectl
in a KEP). 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 existing
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 compiled.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 excellent
client-go
library to interact with the Kubernetes API. The Kubernetes maintained sample-cli-plugin demonstrates some best practices and can be used as a template for new plugin projects.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.
https://kubernetes.io/blog/2020/02/28/bring-your-ideas-to-the-world-with-kubectl-plugins/
© Lightnetics 2024