Air-Gapped Installation Prep (Ubuntu)¶
Use this guide when the target VM has no outbound internet access. The IVAAP SDC package embeds the Helm chart, container images, connectors, and database seed — but the host still needs k3s, Helm, OS packages, and Zalando PostgreSQL staged separately.
After completing the steps below, continue with the K3s Manual Install Checklist from Add ivaap-helpers aliases onward (skip k3s, Helm, and Zalando sections you already finished).
Scope
Ubuntu 24.04 only. FlexNet license server on your LAN is assumed reachable from the VM and from pods — same as a connected install. This guide does not cover ivaap install on an air-gapped host; use the manual checklist for deployment.
Automated install
ivaap install still reaches out for k3s, Helm, apt packages, and Zalando when those are not already present. Air-gapped deployments use the manual checklist after host prep.
What to stage¶
| Bundle | Purpose |
|---|---|
| IVAAP SDC zip | ivaap binary (embedded payload) |
| k3s air-gap kit | k3s binary, install.sh, k3s-airgap-images-amd64.tar or .tar.zst |
| Helm 3 | helm-*-linux-amd64.tar.gz from Helm releases |
Ubuntu .deb packages |
unzip, htop, jq, nfs-common, cifs-utils, smbclient, openjdk-21-jdk |
| Zalando PostgreSQL v1.15.1 | Helm chart .tgz, two CRD manifests, operator + Spilo-17 images |
Confirm the IVAAP payload before transfer:
./ivaap manifest --summary
1. Download on a connected machine¶
IVAAP package¶
Download the unified zip from the SLB Software Download Center and unzip it.
k3s (air-gap)¶
Use k3s 1.30+ (see Technical Data Sheet). Pick one release version and download the matching binary and image archive from k3s releases:
K3S_VERSION='v1.30.4+k3s1' # example — use a current 1.30+ build
curl -LO "https://github.com/k3s-io/k3s/releases/download/${K3S_VERSION}/k3s"
curl -LO "https://github.com/k3s-io/k3s/releases/download/${K3S_VERSION}/k3s-airgap-images-amd64.tar"
# Some releases ship .tar.zst instead of .tar — use whichever the release page lists.
curl -Lo install.sh https://get.k3s.io
chmod +x install.sh k3s
Helm¶
HELM_VERSION='v3.16.3' # example
curl -LO "https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz"
Ubuntu packages¶
On Ubuntu 24.04:
mkdir -p airgap-debs && cd airgap-debs
apt-get download unzip htop jq nfs-common cifs-utils smbclient openjdk-21-jdk
Zalando PostgreSQL (matches ivaap install)¶
ZAL_VER='v1.15.1'
helm repo add postgres-operator \
https://opensource.zalando.com/postgres-operator/charts/postgres-operator
helm repo update
helm pull postgres-operator/postgres-operator --version "${ZAL_VER}"
# Produces postgres-operator-1.15.1.tgz in the current directory
curl -LO "https://raw.githubusercontent.com/zalando/postgres-operator/${ZAL_VER}/charts/postgres-operator/crds/postgresqls.yaml"
curl -LO "https://raw.githubusercontent.com/zalando/postgres-operator/${ZAL_VER}/charts/postgres-operator/crds/operatorconfigurations.yaml"
# Image tags — read from the chart on the staging machine:
helm show values postgres-operator-1.15.1.tgz | grep -E 'image:|spilo'
# Pull and save (Docker example; use the tags from the previous command):
docker pull registry.opensource.zalan.do/acid/postgres-operator:v1.15.1
docker pull registry.opensource.zalan.do/acid/spilo-17:3.3-p3 # example — verify against helm show values
docker save -o zalando-images.tar \
registry.opensource.zalan.do/acid/postgres-operator:v1.15.1 \
registry.opensource.zalan.do/acid/spilo-17:3.3-p3
Package for transfer¶
tar czf ivaap-airgap-bundle.tar.gz \
ivaap-sdc/ \
k3s/ \
helm/ \
airgap-debs/ \
zalando/
2. Transfer to the air-gapped VM¶
Copy ivaap-airgap-bundle.tar.gz (or the individual directories) to the target Ubuntu VM using your organization's approved method.
3. Install on the Ubuntu VM¶
Run as the user who will own the IVAAP deployment (not root).
OS packages¶
cd airgap-debs
sudo dpkg -i ./*.deb
k3s¶
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp k3s-airgap-images-amd64.tar* /var/lib/rancher/k3s/agent/images/
sudo install -o root -g root -m 0755 k3s /usr/local/bin/k3s
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_KUBECONFIG_MODE=644 ./install.sh
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown "$(id -u):$(id -g)" ~/.kube/config
echo 'export KUBECONFIG=$HOME/.kube/config' >> ~/.bashrc
kubectl get nodes
Helm¶
tar xzf helm-*-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
helm version
Extract IVAAP payload¶
sudo mkdir -p /opt/ivaap
sudo chown "$USER:$USER" /opt/ivaap
chmod +x ./ivaap
./ivaap extract-payload --dest /opt/ivaap
Zalando PostgreSQL (offline)¶
Layout matches ivaap install: namespace ivaap-postgres, cluster ivaap-postgres-cluster, PostgreSQL 17, operator chart v1.15.1.
ZAL_VER='v1.15.1'
# Load images into k3s
sudo k3s ctr images import zalando-images.tar
# CRDs + operator
kubectl create namespace ivaap-postgres
kubectl apply -f postgresqls.yaml
kubectl apply -f operatorconfigurations.yaml
helm install postgres-operator "./postgres-operator-1.15.1.tgz" \
-n ivaap-postgres \
--version "${ZAL_VER}" \
--skip-crds --wait --timeout 5m
# Cluster CR
kubectl apply -f - <<'YAML'
apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
name: ivaap-postgres-cluster
namespace: ivaap-postgres
spec:
teamId: "default"
volume:
size: 15Gi
numberOfInstances: 1
users:
ivaapserver:
- superuser
- createdb
databases:
ivaapdb: ivaapserver
resources:
limits:
cpu: "4"
memory: "2Gi"
requests:
cpu: "500m"
memory: "1Gi"
postgresql:
version: "17"
parameters:
shared_buffers: "256MB"
enableLogicalBackup: false
YAML
# Wait for the pod, then load the bundled seed dump
kubectl wait --for=condition=Ready pod/ivaap-postgres-cluster-0 -n ivaap-postgres --timeout=600s
DUMP=$(readlink -f /opt/ivaap/ivaap-postgres-*.sql)
kubectl cp "$DUMP" "ivaap-postgres/ivaap-postgres-cluster-0:/tmp/seed.sql"
kubectl exec -n ivaap-postgres ivaap-postgres-cluster-0 -- \
psql -U ivaapserver -d ivaapdb -v ON_ERROR_STOP=1 \
-c "DROP SCHEMA IF EXISTS metric_helpers CASCADE;" \
-c "DROP SCHEMA IF EXISTS user_management CASCADE;"
kubectl exec -n ivaap-postgres ivaap-postgres-cluster-0 -- \
psql -U ivaapserver -d ivaapdb -v ON_ERROR_STOP=1 -f /tmp/seed.sql
Verify seeding (same check ivaap install uses):
kubectl exec -n ivaap-postgres ivaap-postgres-cluster-0 -- \
psql -U ivaapserver -d ivaapdb -tAc \
"SELECT 1 FROM information_schema.tables WHERE table_schema='int' AND table_name='User' LIMIT 1;"
Expected output: 1
4. Continue with the manual install checklist¶
Open the K3s Manual Install Checklist and start at Add ivaap-helpers aliases — skip Basic Environment Setup (k3s / Helm), Extract the embedded payload, and Deploy Zalando PostgreSQL (unless you used the offline commands above instead of deploy-k3s-postgres.sh).
When configuring database secrets, use:
ivaap-postgres-cluster.ivaap-postgres.svc.cluster.local
For TLS, use bring-your-own or self-signed certificates — Let's Encrypt requires public internet reachability.
Related guides¶
- K3s Manual Install Checklist — manual deployment after host prep
- K3s Single Node Installation Guide — connected
ivaap installworkflow - Technical Data Sheet — VM sizing and prerequisites