Graphic showing the Kubernetes logo

Krew is a package manager for Kubectl, the official Kubernetes CLI. Using Krew you can find, install, and update Kubectl plugins that extend the CLI with additional functionality.

Kubectl’s plugins mechanism supports several plugin installation methods. The simplest way is to pop plugins straight into a directory that’s in your PATH. This is a manual process which offers no way to update the plugin as new releases are published.

Krew provides common package management functionalities for the Kubectl plugin ecosystem. It maintains a public index of known packages and supports third-party indexes too. The latter lets you publish plugins privately within an organization or team.

Installing Krew

Krew is an open-source tool that’s part of the Kubernetes project. It doesn’t come bundled with Kubectl though. To get started with Krew, you must manually download and install the latest release. Current Krew distributions work with Kubectl v1.12 and later.

Downloads are available from the project’s GitHub releases page. The distribution tar archives contain the Krew binary. Run its installation script to finish adding Krew to your system:

$ ./krew-linux_amd64 install krew

A complete script that automatically downloads and installs the correct Krew distribution for your system is available within the documentation.

Next you should update your PATH to include Krew’s bin directory. This is located within $KREW_ROOT which is usually $HOME/.krew. Executables from Kubectl plugins you install will be stored inside the bin subdirectory.

$ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

Now you should be able to use Krew via the kubectl krew command:

~$ kubectl krew
krew is the kubectl plugin manager.
You can invoke krew through kubectl: "kubectl krew [command]..."

Usage:
  kubectl krew [command]
...

Updating the Plugin Index

Krew’s plugin index catalogs all the currently available plugins you can install. It works similarly to the package lists used by OS-level package managers such as apt.

Update the index periodically so your Krew installation has access to the latest versions of all available plugins:

$ kubectl krew update
Updated the local copy of plugin index.

Installing Plugins

The install command adds new plugins to Kubectl. It can install any of the plugins listed in Krew’s index. Krew takes care of downloading the plugin and registering it with Kubectl.

$ kubectl krew install ctx
Updated the local copy of plugin index.
Installing plugin: ctx
Installed plugin: ctx
...

Krew automatically updates its plugin index before installation, ensuring you get the new plugin’s latest release. Once the install completes, you’ll see some basic information from the plugin’s author at the bottom of the command’s output.

Now you can use the plugin’s commands via the kubectl CLI:

$ kubectl ctx my-context

Updating to New Plugin Releases

One of Krew’s biggest advantages is its integrated plugin update system. Running the upgrade command will refresh the package index and update all your installed plugins to their newest release. This process is fully automatic.

$ kubectl krew upgrade
Updated the local copy of plugin index.
...

You can upgrade plugins individually by passing their names to the upgrade command:

$ kubectl krew upgrade ctx

If you ever want to remove a plugin, supply its name to the uninstall command:

$ kubectl krew uninstall ctx

Krew will ensure the plugin’s completely removed from your system.

The list command shows all your plugins and their installed versions:

~$ kubectl krew list
PLUGIN  VERSION
ctx     v0.9.4
krew    v0.4.3
ns      v0.9.4

Krew itself appears in the plugin list and is supported by the update system. Running upgrade or upgrade krew will fetch and install the latest Krew release before your plugins are updated.

Searching for Plugins

The search command lets you browse the Krew package index from your terminal.

~$ kubectl krew search cert-manager
NAME          DESCRIPTION                                        INSTALLED
cert-manager  Manage cert-manager resources inside your cluster  no

Once you’ve found a plugin you’re interested in, run the info command to find out more about it. This reveals the plugin’s current version number, a link to its website, and a short description supplied by the author.

~$ kubectl krew info cert-manager
NAME: cert-manager
INDEX: default
URI: https://github.com/jetstack/cert-manager/releases/download/v1.7.0/kubectl-cert_manager-linux-amd64.tar.gz
SHA256: 73618617b9ec42994c3ea77bbc8be743e382501d42ad2ee7aeca0d32c15655c0
VERSION: v1.7.0
HOMEPAGE: https://github.com/jetstack/cert-manager
DESCRIPTION: 
The official plugin accompanying cert-manger, a Kubernetes add-on to
automate the management and issuance of TLS certificates. Allows for
direct interaction with cert-manager resources e.g. manual renewal of
Certificate resources.

Using Custom Indexes

Krew supports custom indexes that facilitate plugin installation from your own sources. Indexes are simply Git repositories with a plugins folder containing YAML manifests. These files define the plugins that are available for installation. The structure of Krew’s default index is a useful model when you’re setting up your own.

To add an index, pass its repository URL to the index add command:

$ kubectl krew index add custom-index https://example.com/krew/index.git

To reference plugins in your index, prefix their names with your chosen index name:

$ kubectl krew install custom-index/example-plugin

When no prefix is given, Krew uses the default/ prefix instead. This always refers to Krew’s built-in plugin index. If you’d prefer to direct unprefixed plugin names to your own index, set the KREW_DEFAULT_INDEX_URI environment variable to your repository’s URL:

$ export KREW_DEFAULT_INDEX_URI="https://example.com/krew/index.git"

# Automatically resolved to the custom index
$ kubectl krew install example-plugin

Publishing Your Own Plugins

It’s fairly straightforward to distribute your own plugins to users via Krew. First you need to create an archive of your Kubectl plugin’s content, either as a .tar.gz or .zip file. Upload this to a publicly accessible location – your project’s website or GitHub releases page are both good choices.

Write a Krew plugin manifest next. This is a simple YAML file which provides basic information about your plugin such as its name, description, and current version. The manifest also includes your plugin archive’s public URL. When a user installs your plugin, Krew will fetch its archive from the URL specified in the manifest.

Once you’ve written your manifest, you can commit it to a Git repository. Add that repository as a custom Krew index to add your plugin to your Kubectl installation. Submissions to Krew’s public index are accepted by creating a pull request to its repository that adds your manifest in the plugins directory.

Conclusion

Krew simplifies Kubernetes plugin discovery, installation, and management. It’s a handy convenience tool for anyone using Kubectl plugins. Krew offers a full package management experience that includes custom private indexes for your internal tools.

The public index contains over 180 plugins covering all aspects of Kubernetes management. Some popular options include cert-manager, for working with Cert-Manager objects in your cluster, tail, offering simplified log streaming, score for static analysis of your objects, and ctx and ns to streamline switching between contexts and namespaces.

Profile Photo for James Walker James Walker
James Walker is a contributor to How-To Geek DevOps. He is the founder of Heron Web, a UK-based digital agency providing bespoke software development services to SMEs. He has experience managing complete end-to-end web development workflows, using technologies including Linux, GitLab, Docker, and Kubernetes.
Read Full Bio »