I love working with Kubernetes but there has been one aspect of the way it treats configurations that bugged me: It’s really hard to work with various kubectl configuration files (and the multiple contexts you can define in them). A co-worker recently mentioned that he has a shell script that allows him to quickly pick a configuration file from a specific folder and set the KUBECONFIG environment variable for the current shell based on that.
Sadly, that didn’t work for me because Iβm using contexts quite heavily. I usually structure my kubeconfigs like this:
- 1 kubeconfig file per cluster
- 1 context for each namespace/user-pair that I use more than once
So I needed something that would not only help me picking a KUBECONFIG environment value but also set the --context
flag in kubectl. I have a certification exam next week and so I’m basically spending most of my time learning for that but in order not to go completely insane, I thought it would be nice to tackle this little issue of mine. The result of a bit of coding yesterday is kubeselect.
kubeselect select
scans your $HOME/.kube
folder for files ending with .yml, .yaml, or .conf and looks for contexts defined in them. It will provide you with a listing using go-fuzzyfinder. When you now pick an option, it will return environment variable commands for your shell:
$ kubeselect select
export KUBECONFIG=$HOME/.kube/some-config.yaml
export KUBECTX=context-name
# To also set those inside your current terminal,
# run eval on it
$ eval $(kubeselect select)
Since I’m lazy, I’ve defined an alias for that:
$ alias ks='eval $(kubeselect select)'
The second part of kubeselect is a simple wrapper around kubectl that uses the KUBECTX
environment variable to set the --context
flag:
$ kubeselect run -- get nodes
# is the same as...
$ kubectl --context some-context get nodes
Again, aliases FTW:
$ alias k='kubeselect run -- '
How to install
At this point there isn’t a binary-release available but you can either take a binary produced by one of the build jobs or install from the master branch using go-get:
GO111MODULE=off \
go get gitlab.com/zerok/kubeselect/cmd/kubeselect
What’s missing?
What’s missing right now is a simple status-command that shows what configuration a call to kubeselect run
would be using. This command could then, for instance, also be integrated into shell-prompts etc.
I hope I’ll be able to get to this in the next couple of days π
Do you want to give me feedback about this article in private? Please send it to comments@zerokspot.com.
Alternatively, this website also supports Webmentions. If you write a post on a blog that supports this technique, I should get notified about your link π