Aller au contenu

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 :

cd /chemin/vers/AKKO

# Compiler toutes les images personnalisées
bash helm/scripts/build-images.sh

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) :

    helm push /tmp/akko-charts/akko-0.1.0.tgz oci://registre.interne.corp.com/akko-charts
    

  • Installer directement depuis le .tgz :

    helm install akko /tmp/akko-charts/akko-0.1.0.tgz -n akko --create-namespace ...
    


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é

  1. Créer un PVC pour Ollama :

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: akko-ollama-data
      namespace: akko
    spec:
      accessModes: [ReadWriteOnce]
      resources:
        requests:
          storage: 20Gi
    EOF
    

  2. 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
    

  3. Désactiver le téléchargement automatique des modèles dans vos valeurs :

    # values-airgapped.yaml (ajouter à l'existant)
    akko-ollama:
      modelPull:
        enabled: false     # Les modèles sont pré-chargés dans le PVC
      persistence:
        existingClaim: "akko-ollama-data"
    


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 Running ou Completed : 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 :

  1. Sur la machine de préparation, récupérez la nouvelle version et recompilez les images
  2. Sauvegardez les images delta (uniquement les images nouvelles ou modifiées)
  3. Transférez et chargez dans le registre privé
  4. Empaquetez le chart Helm mis à jour
  5. Exécutez helm upgrade avec 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