Déploiement en environnement isolé (air-gapped)¶
Ce guide explique comment déployer AKKO dans un environnement isolé (air-gapped) sans accès internet. Toutes les images de conteneurs, les charts Helm et les modèles LLM doivent être pré-chargés dans un registre privé et un stockage local.
Prérequis¶
Avant de commencer, assurez-vous d'avoir :
| Exigence | Description |
|---|---|
| Registre de conteneurs privé | Harbor, Nexus, GitLab Registry, ou tout registre compatible OCI accessible depuis votre cluster isolé |
| Archive du chart Helm | Le chart Helm AKKO empaqueté sous forme de fichier .tgz |
| Machine de préparation connectée | Un poste de travail avec Docker et Helm pour récupérer et empaqueter tous les artefacts |
| Support de transfert | Clé USB, DVD, ou diode de données unidirectionnelle pour transférer les artefacts vers le réseau isolé |
| Cluster Kubernetes | Un cluster fonctionnel (k3s, kubeadm, RKE2, OpenShift) dans le réseau isolé |
1. Regrouper les images de conteneurs¶
AKKO utilise 12 images personnalisées et 15+ images communautaires. Toutes doivent être sauvegardées sur la machine de préparation et chargées dans le registre privé.
Images personnalisées (compilées depuis les sources)¶
Compilez toutes les images personnalisées sur la machine de préparation :
Cela produit les images suivantes :
| Image | Tag | Source |
|---|---|---|
akko-postgres |
2026.04 |
docker/postgres/Dockerfile |
akko-spark |
2026.04 |
docker/spark/Dockerfile |
akko-notebook |
2026.04 |
docker/jupyterhub/Dockerfile.notebook |
akko-cockpit |
2026.04 |
branding/cockpit/Dockerfile |
akko-trino |
2026.04 |
docker/trino-ai-functions/Dockerfile |
akko-ai-service |
2026.04 |
docker/ai-service/Dockerfile |
akko-mlflow |
2026.04 |
docker/mlflow/Dockerfile |
akko-airflow |
2026.04 |
docker/airflow/Dockerfile |
akko-dbt |
2026.04 |
docker/dbt/Dockerfile |
akko-mcp-trino |
2026.04 |
docker/mcp-trino/Dockerfile |
akko-mcp-openmetadata |
2026.04 |
docker/mcp-openmetadata/Dockerfile |
Images communautaires¶
Récupérez toutes les images communautaires utilisées par le chart Helm :
# Services principaux
docker pull quay.io/keycloak/keycloak:26.2.4
docker pull apache/polaris:1.3.0
docker pull trinodb/trino:473
docker pull apache/airflow:3.0.1
docker pull apache/superset:4.1.2
docker pull ollama/ollama:0.6.2
docker pull ghcr.io/berriai/litellm:main-v1.65.4
docker pull openpolicyagent/opa:1.4.2
docker pull lldap/lldap:v0.6.1-alpine
docker pull docker.getcollate.io/openmetadata/server:1.6.5
# Infrastructure
docker pull traefik:v3.3.6
docker pull minio/minio:RELEASE.2025-02-18T16-25-55Z
docker pull minio/mc:RELEASE.2025-02-15T09-18-34Z
docker pull nginxinc/nginx-unprivileged:1.27.4-alpine
docker pull curlimages/curl:8.12.1
# Supervision
docker pull quay.io/prometheus/prometheus:v3.2.1
docker pull grafana/grafana:11.5.2
docker pull grafana/loki:3.4.3
docker pull grafana/promtail:3.4.3
docker pull quay.io/prometheus/alertmanager:v0.28.1
# JupyterHub
docker pull quay.io/jupyterhub/k8s-hub:4.1.0
# OpenSearch (pour OpenMetadata)
docker pull opensearchproject/opensearch:2.19.1
Exactitude des versions
Les versions listées ci-dessus sont celles de 2026.04. Référez-vous
toujours à helm/akko/values.yaml pour les tags exacts utilisés dans
votre version d'AKKO.
Sauvegarder toutes les images dans une archive¶
# Sauvegarder toutes les images dans une archive compressée unique
docker save \
akko-postgres:2026.04 \
akko-spark:2026.04 \
akko-notebook:2026.04 \
akko-jupyterhub:2026.04 \
akko-cockpit:2026.04 \
akko-airflow:2026.04 \
akko-dbt:2026.04 \
akko-mcp-trino:2026.04 \
quay.io/keycloak/keycloak:26.2.4 \
apache/polaris:1.3.0 \
trinodb/trino:473 \
apache/airflow:3.0.1 \
apache/superset:4.1.2 \
ollama/ollama:0.6.2 \
ghcr.io/berriai/litellm:main-v1.65.4 \
openpolicyagent/opa:1.4.2 \
lldap/lldap:v0.6.1-alpine \
docker.getcollate.io/openmetadata/server:1.6.5 \
traefik:v3.3.6 \
minio/minio:RELEASE.2025-02-18T16-25-55Z \
minio/mc:RELEASE.2025-02-15T09-18-34Z \
nginxinc/nginx-unprivileged:1.27.4-alpine \
curlimages/curl:8.12.1 \
quay.io/prometheus/prometheus:v3.2.1 \
grafana/grafana:11.5.2 \
grafana/loki:3.4.3 \
grafana/promtail:3.4.3 \
quay.io/prometheus/alertmanager:v0.28.1 \
quay.io/jupyterhub/k8s-hub:4.1.0 \
opensearchproject/opensearch:2.19.1 \
| gzip > akko-images.tar.gz
L'archive résultante fait typiquement 15 à 20 Go selon les services activés.
Transférer et charger les images¶
Sur le réseau isolé :
# Charger toutes les images depuis l'archive
docker load < akko-images.tar.gz
# Taguer et pousser chaque image vers votre registre privé
REGISTRY="registre.interne.corp.com/akko"
# Images personnalisées
for IMG in akko-postgres akko-spark akko-notebook akko-jupyterhub \
akko-cockpit akko-airflow akko-dbt akko-mcp-trino; do
docker tag ${IMG}:2026.04 ${REGISTRY}/${IMG}:2026.04
docker push ${REGISTRY}/${IMG}:2026.04
done
# Images communautaires — re-taguer sous votre espace de registre
docker tag quay.io/keycloak/keycloak:26.2.4 ${REGISTRY}/keycloak:26.2.4
docker push ${REGISTRY}/keycloak:26.2.4
docker tag trinodb/trino:473 ${REGISTRY}/trino:473
docker push ${REGISTRY}/trino:473
# ... répéter pour toutes les images communautaires
Automatiser le re-taguage
En production, créez un script qui lit les références d'images depuis
helm/akko/values.yaml et automatise le processus de taguage et de push.
Cela évite les erreurs humaines et garantit qu'aucune image n'est oubliée.
2. Empaqueter le chart Helm¶
Sur la machine de préparation connectée à internet :
cd /chemin/vers/AKKO/helm/akko
# Mettre à jour toutes les dépendances de sous-charts
helm dependency update .
# Empaqueter le chart umbrella en .tgz
helm package . -d /tmp/akko-charts/
# Sortie : /tmp/akko-charts/akko-0.1.0.tgz (version depuis Chart.yaml)
Transférez le fichier .tgz vers le réseau isolé.
Sur le réseau isolé, vous pouvez soit :
-
Pousser vers un dépôt de charts (ex. le dépôt de charts intégré de Harbor) :
-
Installer directement depuis le .tgz :
3. Configurer les références d'images¶
Créez un overlay de valeurs qui pointe toutes les images vers votre registre privé :
# values-airgapped.yaml
global:
image:
registry: "registre.interne.corp.com/akko/"
pullPolicy: IfNotPresent
pullSecrets:
- name: registry-credentials
# --- Images personnalisées ---
akko-postgres:
image:
repository: registre.interne.corp.com/akko/akko-postgres
tag: "2026.04"
akko-postgres-data:
image:
repository: registre.interne.corp.com/akko/akko-postgres
tag: "2026.04"
akko-keycloak:
image:
repository: registre.interne.corp.com/akko/keycloak
tag: "26.2.4"
akko-polaris:
image:
repository: registre.interne.corp.com/akko/polaris
tag: "1.3.0"
akko-spark:
image:
repository: registre.interne.corp.com/akko/akko-spark
tag: "2026.04"
akko-cockpit:
image:
repository: registre.interne.corp.com/akko/akko-cockpit
tag: "2026.04"
akko-ollama:
image:
repository: registre.interne.corp.com/akko/ollama
tag: "0.6.2"
akko-litellm:
image:
repository: registre.interne.corp.com/akko/litellm
tag: "main-v1.65.4"
akko-mlflow:
image:
repository: registre.interne.corp.com/akko/akko-mlflow
tag: "2026.04"
akko-opa:
image:
repository: registre.interne.corp.com/akko/opa
tag: "1.4.2"
akko-lldap:
image:
repository: registre.interne.corp.com/akko/lldap
tag: "v0.6.1-alpine"
akko-docs:
image:
repository: registre.interne.corp.com/akko/nginx-unprivileged
tag: "1.27.4-alpine"
jupyterhub:
hub:
image:
name: registre.interne.corp.com/akko/k8s-hub
tag: "4.1.0"
singleuser:
image:
name: registre.interne.corp.com/akko/akko-notebook
tag: "2026.04"
trino:
image:
repository: registre.interne.corp.com/akko/trino
tag: "473"
airflow:
defaultAirflowRepository: registre.interne.corp.com/akko/airflow
defaultAirflowTag: "3.0.1"
superset:
image:
repository: registre.interne.corp.com/akko/superset
tag: "4.1.2"
minio:
image:
repository: registre.interne.corp.com/akko/minio
tag: "RELEASE.2025-02-18T16-25-55Z"
mcImage:
repository: registre.interne.corp.com/akko/mc
tag: "RELEASE.2025-02-15T09-18-34Z"
Créez le secret de registre sur le cluster isolé :
kubectl create namespace akko
kubectl create secret docker-registry registry-credentials \
--docker-server=registre.interne.corp.com \
--docker-username=<NOM_UTILISATEUR> \
--docker-password=<MOT_DE_PASSE> \
-n akko
4. Pré-charger les modèles Ollama¶
Les modèles Ollama ne peuvent pas être téléchargés depuis internet dans un environnement isolé. Vous devez les pré-télécharger et les charger via un PersistentVolumeClaim.
Sur la machine de préparation (connectée à internet)¶
# Récupérer les modèles sur une machine avec Ollama installé
ollama pull qwen2.5-coder:7b
ollama pull qwen2.5:3b
ollama pull nomic-embed-text
# Les fichiers de modèles sont stockés dans ~/.ollama/models/
# Les archiver
tar czf ollama-models.tar.gz -C ~/.ollama models/
Sur le cluster isolé¶
-
Créer un PVC pour Ollama :
-
Copier les modèles dans le PVC via un pod temporaire :
# Créer un pod temporaire qui monte le PVC kubectl run ollama-loader --image=busybox:1.36 -n akko \ --overrides='{ "spec": { "containers": [{ "name": "loader", "image": "busybox:1.36", "command": ["sleep", "3600"], "volumeMounts": [{ "name": "data", "mountPath": "/ollama" }] }], "volumes": [{ "name": "data", "persistentVolumeClaim": { "claimName": "akko-ollama-data" } }] } }' # Attendre que le pod soit prêt kubectl wait --for=condition=Ready pod/ollama-loader -n akko --timeout=60s # Copier l'archive des modèles et extraire kubectl cp ollama-models.tar.gz akko/ollama-loader:/tmp/ kubectl exec -n akko ollama-loader -- tar xzf /tmp/ollama-models.tar.gz -C /ollama/ # Nettoyage kubectl delete pod ollama-loader -n akko -
Désactiver le téléchargement automatique des modèles dans vos valeurs :
5. Déployer¶
Avec tous les artefacts pré-chargés, déployez AKKO :
# Générer les valeurs de domaine (si ce n'est pas déjà fait)
bash helm/scripts/generate-domain-values.sh akko.interne.corp.com
bash helm/scripts/generate-dev-secrets.sh
# Installer
helm upgrade --install akko /tmp/akko-charts/akko-0.1.0.tgz \
-n akko --create-namespace \
--wait --wait-for-jobs --timeout 20m \
-f helm/examples/values-dev.yaml \
-f helm/examples/values-domain.yaml \
-f values-airgapped.yaml \
-f helm/examples/values-dev-secrets.yaml \
--set-file akko-keycloak.realm.data=helm/examples/realm-domain.json
6. Liste de vérification¶
Après le déploiement, vérifiez :
- [ ] Tous les pods sont en état
RunningouCompleted:kubectl get pods -n akko - [ ] Aucune erreur
ImagePullBackOff(indiquerait une image manquante dans le registre) - [ ] Le cockpit se charge à
https://akko.interne.corp.com - [ ] La connexion Keycloak fonctionne à
https://keycloak.interne.corp.com - [ ] Ollama répond :
kubectl exec -n akko deploy/akko-ollama -- ollama list - [ ] JupyterHub lance les notebooks sans télécharger d'images depuis internet
- [ ] Les requêtes Trino s'exécutent correctement (tester avec un simple
SELECT 1)
Mise à jour en environnement isolé¶
Pour mettre à jour AKKO :
- Sur la machine de préparation, récupérez la nouvelle version et recompilez les images
- Sauvegardez les images delta (uniquement les images nouvelles ou modifiées)
- Transférez et chargez dans le registre privé
- Empaquetez le chart Helm mis à jour
- Exécutez
helm upgradeavec le nouveau chart et les valeurs
# Sur la machine de préparation
git pull origin main
bash helm/scripts/build-images.sh
helm dependency update helm/akko/
helm package helm/akko/ -d /tmp/akko-charts/
# Sur le cluster isolé (après transfert)
helm upgrade akko /tmp/akko-charts/akko-<NOUVELLE_VERSION>.tgz \
-n akko \
--wait --wait-for-jobs --timeout 20m \
-f helm/examples/values-dev.yaml \
-f helm/examples/values-domain.yaml \
-f values-airgapped.yaml \
-f helm/examples/values-dev-secrets.yaml \
--set-file akko-keycloak.realm.data=helm/examples/realm-domain.json
Pour aller plus loin¶
- Guide de déploiement entreprise -- Configuration production complète
- Fournisseur d'identité externe -- Connecter l'IdP d'entreprise
- Référence de configuration -- Toutes les valeurs Helm
- Dépannage -- Problèmes courants et correctifs