Carvel Logo


Grab the latest copy of YAML from the Releases page and use your favorite deployment tool (such as kapp or kubectl) to install it.


$ kapp deploy -a kc -f


$ kubectl apply -f

Specific Environments and Distributions

Some kubernetes distributions require specific setup. Notes below capture the wisdom of our collective community - we appreciate your corrections and contributions to help everyone install kapp-controller everywhere.


  1. Explicitly set resource packageinstalls/finalizers for kapp controller cluster role to access (else the kapp controller fails to create packageinstalls).

    kind: ClusterRole
      name: kapp-controller-cluster-role
    - apiGroups:
      - packageinstalls/finalizers
  2. Bind the kapp-controller cluster role to a security context constraint allowing uids/gids that kapp deployment uses (currently uid 1000; value given for runAsUser in the release.yaml for your version of kapp-controller).

    Note: The security context constraint you provide should allow kapp-controller’s uid to run and should not have root privileges.

    kind: ClusterRole
      name: kapp-controller-cluster-role
    - apiGroups:
      - my-nonroot-security-context-contstraint
      - securitycontextconstraints
      - use
  3. Set the IMGPKG_ENABLE_IAAS_AUTH environment variable to false.

Kubernetes versions >= 1.24

All kapp-controller versions <= v0.36.1 will be unable to reconcile PackageInstall and App CRs with the LegacyServiceAccountTokenNoAutoGeneration feature gate, which is enabled by default in Kubernetes starting in v1.24.

Kubernetes versions < 1.20

Starting in kapp-controller 0.31.0 we have upgraded our underlying kubernetes libraries which will try to use APIs that don’t exist on clusters v1.19 and earlier.

Those using k8s v1.19 and earlier will see a repeating error message such as the one below, because our libraries are hardcoded to watch v1beta1.PriorityLevelConfiguration and that won’t exist on your cluster. Failed to watch *v1beta1.PriorityLevelConfiguration: failed to list *v1beta1.PriorityLevelConfiguration: the server could not find the requested resource (get

While kapp-controller will still work, your logs may fill at a remarkable pace.

To disable these APIs, set the deployment config variable enable_api_priority_and_fairness to false.

Installing kapp-controller CLI: kctrl

Via script (macOS or Linux)

(Note that script installs other Carvel tools as well.)

Install binaries into specific directory:

$ mkdir local-bin/
$ curl -L | K14SIO_INSTALL_BIN_DIR=local-bin bash

$ export PATH=$PWD/local-bin/:$PATH
$ kctrl version

Or system wide:

$ wget -O- >

# Inspect before running...
$ sudo bash
$ kctrl version

Via Homebrew (macOS or Linux)

Based on

$ brew tap carvel-dev/carvel
$ brew install kctrl
$ kctrl version

Specific version from a GitHub release

To download, click on one of the assets in a chosen GitHub release, for example for ‘kctrl-darwin-amd64’.

# **Compare binary checksum** against what's specified in the release notes
# (if checksums do not match, binary was not successfully downloaded)
$ shasum -a 256 ~/Downloads/kctrl-darwin-amd64
08b25d21675fdc77d4281c9bb74b5b36710cc091f30552830604459512f5744c  /Users/pivotal/Downloads/kctrl-darwin-amd64

# Move binary next to your other executables
$ mv ~/Downloads/kctrl-darwin-amd64 /usr/local/bin/kctrl

# Make binary executable
$ chmod +x /usr/local/bin/kctrl

# Check its version
$ kctrl version

(Help improve our docs: edit this page on GitHub)