Skip to content

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.