At work, I somewhat recently transitioned from using the Kubernetes Dashboard to using k9s as DigitalOcean deprecated their hosted Dashboard for DOKS. Today, I found that I needed to modify a Secret and that k9s and kubectl have no native tools to do this. I also found that I didn’t have bash completion set up since upgrading to a new dev machine, so I took the opportunity to set things up better by using my Shell Customizations. Now I won’t need to configure bash completion for helm/kubectl every time I set up a new computer.

Shell Customizations

Rather than adding shell completion to the system config as is often suggested in documentation, I chose to keep everything in my .bashrc so its portable between environments.

I already had some k8s-related content:

export EDITOR=nano
alias k9=k9s

I added:

which kubectl 1> /dev/null && source <(kubectl completion bash)
which helm 1> /dev/null && source <(helm completion bash)
[ -d "${KREW_ROOT:-$HOME/.krew}/bin" ] && export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

This adds kubectl and helm completion iff (not a typo) those commands are available. It also appends the krew binary path to $PATH if its defined (more on krew later).

k9s and helm Installation

k9s has a few installation methods, but I chose to grab the latest release from GitHub since I don’t have snap installed and usually run Linux Mint. I ended up updating k9s because the configuration file specs have changed some since I originally got k9s, and updating means the example configurations in docs and other resources should all work. The currently installed version can be determined with k9s info.

helm installation is documented on their website. I prefer to install via apt to simplify updates since (as noted earlier) I don’t usually have snap installed.

krew and the kubectl-modify-secret plugin

krew is a plugin for kubectl that makes it easy to install more plugins. They have an installation guide that is very straight-forward. Note that the change in my .bashrc earlier adds the same KREW_ROOT to my PATH as they specify in the installation guide.

With krew installed, I’m finally back to what I started this all for: installing a plugin to modify a secret in k9s. The kubectl-modify-secret plugin can be installed via:

kubectl krew update
kubectl krew install modify-secret

Now, kubectl modify-secret <secret_name> should open an editor where a secret can be modified in plaintext.

k9s Plugin Configuration

With the plugin installed, I next configured k9s so I can use the plugin to edit secrets the same way I edit configurations and other specs. The k9s plugin configuration is documented here. My config at ~/.config/k9s/plugins.yaml looks like:

plugins:
  edit-secret:
    shortCut: Ctrl-X
    confirm: false
    description: "Edit Secret"
    scopes:
      - secrets
    command: kubectl
    background: false
    args:
      - modify-secret
      - --namespace
      - $NAMESPACE
      - --context
      - $CONTEXT
      - $NAME

This adds a ctrl+x shortcut to edit a Secret, similar to how e would edit a ConfigMap; ctrl+e is already used to show/hide the information at the top of k9s, otherwise I’d have used that.

Future Plans

I’m satisfied now with my tools and workflow for interacting with Kubernetes. Ideally, I would like to come up with a method for synchronizing configuration between my devices automatically; for now, I manually copy my .bashrc, .ssh, and .config file/directories around. A better solution I think could be a git repository + update script, Nextcloud sync, or something else. I still have some research to do, but for now the changes are infrequent enough I’m satisfied with manual processes.