Air gap installation
For an air-gapped installation of Kubewarden, you need a private Open Container Initiative (OCI) registry accessible by your Kubernetes cluster. Kubewarden Policies are WebAssembly modules; therefore, you can store them in an OCI-compliant registry as OCI artifacts. You need to add Kubewarden's images and policies to this OCI registry. You can see a list of Kubewarden artifacts in the Artifacts reference page. The following sections describe the process.
Save Helm charts locally​
You need to download the following helm charts to your workstation:
helm pull kubewarden/kubewarden-crds
helm pull kubewarden/kubewarden-controller
helm pull kubewarden/kubewarden-defaults
helm pull kubewarden/sbomscanner
Optionally, you can verify the signatures of the helm charts and container images
Save container images locally​
-
Each of our Helm charts contains an
imagelist.txtwith the container images consumed by it, and, when applicable, apolicylist.txtwith the OCI Wasm modules of the policies that it consumes too.To obtain them, you can do:
helm pull --untar \
kubewarden/kubewarden-crds \
kubewarden/kubewarden-controller \
kubewarden/kubewarden-defaults \
kubewarden/sbomscannerAnd then concat them into 1 file:
cat */imagelist.txt > kubewarden-images.txt -
Download
kubewarden-save-images.shandkubewarden-load-images.shfrom the utilities repository. -
Save Kubewarden container images into a
.tar.gzfile:./kubewarden-save-images.sh \
--image-list ./kubewarden-images.txt \
--images kubewarden-images.tar.gzDocker begins pulling the images used for an air gap install. This process can take a few minutes. When complete, your current directory, where you ran the command, has a tarball,
kubewarden-images.tar.gz.
Save policies locally​
-
Add all the policies you want to use to a
policies.txtfile:cat */policylist.txt > policies.txt -
Download
kubewarden-save-policies.shandkubewarden-load-policies.shfrom thekubewarden-controllerrepository -
Save policies into a
.tar.gzfile:./kubewarden-save-policies.sh --policies-list policies.txtUse
kwctlto download the policies. Thekubewarden-policies.tar.gzarchive contains the policies.
Populate private registry​
Move these files to the air gap environment:
- Helm charts in
tgzformat (e.g:kubewarden-crds-1.23.0.tgz) kubewarden-policies.tar.gz,kubewarden-images.tar.gz,kubewarden-load-images.sh,kubewarden-load-policies.shandpolicies.txt
-
Load Kubewarden images into the private registry. You need to authenticate the Docker client against the local registry.
./kubewarden-load-images.sh \
--image-list ./kubewarden-images.txt \
--images kubewarden-images.tar.gz \
--registry <REGISTRY.YOURDOMAIN.COM:PORT> -
Load Kubewarden policies into the private registry. You should authenticate
kwctlagainst the local registry (kwctluses the same mechanism to authenticate asdocker, a~/.docker/config.jsonfile)./kubewarden-load-policies.sh \
--policies-list policies.txt \
--policies kubewarden-policies.tar.gz \
--registry <REGISTRY.YOURDOMAIN.COM:PORT> \
--sources-path sources.yml
The kwctl command needs the sources.yaml file to connect to registries in
these categories:
- Authentication is required.
- Self-signed certificate is being used.
- No TLS termination is done.
Refer to the section on custom certificate
authorities in the documentation to
learn how to configure the sources.yaml file.
Install Kubewarden​
Now that your private registry has everything required you can install Kubewarden. The only difference to a standard Kubewarden installation is that you need to change the registry in the container images and policies to be the private registry.
Install the Kubewarden stack:
helm install --wait -n kubewarden \
kubewarden-crds kubewarden-crds.tgz
helm install --wait -n kubewarden \
kubewarden-controller kubewarden-controller.tgz \
--set global.cattle.systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT>
To use the Policy Reporter subchart available in the kubewarden-controller
chart, you need to define other values specific for the subchart in an
air-gapped environment. See an example below:
helm install --wait -n kubewarden kubewarden-controller kubewarden-controller.tgz \
--set global.cattle.systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \
--set auditScanner.policyReporter=true \
--set policy-reporter.image.registry=<REGISTRY.YOURDOMAIN.COM:PORT> \
--set policy-reporter.ui.image.registry=<REGISTRY.YOURDOMAIN.COM:PORT> \
--set policy-reporter.image.repository=kyverno/policy-reporter \
--set policy-reporter.ui.image.repository=kyverno/policy-reporter-ui
It's necessary to define auditScanner.policyReporter to enable the subchart
and 4 more values to configure the registry and repository where you store the
Policy Reporter images. For more information about the policy report subchart
values, see Policy Reporter
documentation.
helm install --wait -n kubewarden \
kubewarden-defaults kubewarden-defaults.tgz \
--set global.cattle.systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT>
To download the recommended policies installed by the kubewarden-defaults
Helm Chart from a registry other than global.cattle.systemDefaultRegistry,
use the recommendedPolicies.defaultPoliciesRegistry configuration.
This configuration lets users specify a registry dedicated to pulling the OCI
artifacts of the policies. It's particularly useful when their container image
repository doesn't support OCI artifacts.
To install and wait for the installation to complete, use the following command:
helm install --wait -n kubewarden \
kubewarden-defaults kubewarden-defaults.tgz \
--set global.cattle.systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \
--set recommendedPolicies.defaultPoliciesRegistry=<REGISTRY.YOURDOMAIN.COM:PORT>
If the recommendedPolicies.defaultPoliciesRegistry configuration isn't set,
you use global.cattle.systemDefaultRegistry as the default registry.
Finally, you need to configure Policy Server to fetch policies from your private registry. See the using private registry section of the documentation.
Now you can create Kubewarden policies in your cluster. Policies must be available in your private registry.
kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
name: privileged-pods
spec:
module: registry://<REGISTRY.YOURDOMAIN.COM:PORT>/kubewarden/policies/pod-privileged:v0.2.2
rules:
- apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
operations:
- CREATE
mutating: false
EOF
PolicyServer resources must use the image available in your private registry.
For example:
apiVersion: policies.kubewarden.io/v1
kind: PolicyServer
metadata:
name: reserved-instance-for-tenant-a
spec:
image: <REGISTRY.YOURDOMAIN.COM:PORT>/kubewarden/policy-server:v1.3.0
replicas: 2
serviceAccountName: sa