Installation
Pour toutes les commandes des sections suivantes lancées sur kdl-spray-1 :
-
les variables
ENVKOSMOS_DOMAIN_EXTERNALKOSMOS_DOMAINKOSMOS_REGISTRY_ENDPOINTKOSMOS_VALUES_CUSTOM_PATHWORK_DIR
doivent être définies dans le terminal conformément à la plateforme cible
-
le répertoire
WORK_DIRetKOSMOS_VALUES_CUSTOM_PATHdoivent exister -
l'utilisateur utilisé est l'utilisateur sudoers demandé en prérequis
Pour que cela soit fait automatiquement dans tout terminal de kdl-spray-1, lancer les commandes suivantes en modifiant si nécessaire les trois premières lignes conformément à votre plateforme.
export KDL_VERSION="KDL_3.6"
export KOSMOS_DOMAIN=kdl-dev.athea
export KOSMOS_VALUES_CUSTOM_PATH=/data/values-custom
sudo bash -c "cat >> /etc/bash.bashrc <<EOF
# Répertoire dans lequel les fichiers d installation seront mis
export WORK_DIR=/data/$KDL_VERSION
mkdir -p \"\\\$WORK_DIR\"
# Nom du domaine à utiliser pour les url d accès aux services hébergés par le KDL
export KOSMOS_DOMAIN=$KOSMOS_DOMAIN
export KOSMOS_DOMAIN_EXTERNAL=\".$KOSMOS_DOMAIN\"
## Variables pour Helmfile
# Le fichier platform-provisioner/environments/\\\$ENV.yaml sera chargé durant l'installation
export ENV=kdl
# Répertoire qui contiendra les fichiers d'installation spécifiques à la plateforme (modification de sizing, configuration d'accès zot, ...)
export KOSMOS_VALUES_CUSTOM_PATH=$KOSMOS_VALUES_CUSTOM_PATH
mkdir -p \"\\\$KOSMOS_VALUES_CUSTOM_PATH\"
# Registry utilisée par helmfile
export KOSMOS_REGISTRY_ENDPOINT=kosmos-registry.$KOSMOS_DOMAIN/athea/hauler
EOF"
source /etc/bash.bashrc
source ~/.bashrc
Les différents livrables doivent être placés dans le répertoire WORK_DIR sur le noeud kdl-spray-1. Les livrables suivants doivent être disponibles :
- apt-PF_noble_20260212-offline.tar.gz
- apt-PF_noble_20260212-offline.tar.gz.sha256
- kube_v1.32.6_3.6.21.tar.gz
- kube_v1.32.6_3.6.21.tar.gz.sha256
- platform-provisioner-core_3.6.21.tar.zst
- platform-provisioner-core_3.6.21.tar.zst.sha256
- platform-provisioner_3.6.21.tar.zst
- platform-provisioner_3.6.21.tar.zst.sha256
- offline-package-mvn-3-0-0.tar.gz
- offline-package-mvn-3-0-0.tar.gz.sha256
- offline-package-npm-3-0-0.tar.gz
- offline-package-npm-3-0-0.tar.gz.sha256
- offline-package-pip-3-0-10.tar.gz
- offline-package-pip-3-0-10.tar.gz.sha256
- offline-package-r-3-0-0.tar.gz
- offline-package-r-3-0-0.tar.gz.sha256
Paquets Ubuntu
Lancer les commandes suivantes pour installer les paquets apt nécessaires pour l'installation sur kdl-spray-1
cd "$WORK_DIR"
tar -zxvf apt-PF_noble_20260212-offline.tar.gz -C /tmp
sudo bash -c "echo \"deb [trusted=yes] file:/tmp/apt-PF_noble_20260212-offline/Packages ./\" > /etc/apt/sources.list.d/offline.list"
# Deactivate "Pending kernel upgrade" message
sudo sed -i "s/#\$nrconf{kernelhints} = -1;/\$nrconf{kernelhints} = -1;/g" /etc/needrestart/needrestart.conf
sudo apt update -o Dir::Etc::SourceList="/etc/apt/sources.list.d/offline.list" -o Dir::Etc::SourceParts=/dev/null -o Acquire::Languages="none"
sudo apt install -y -o Dir::Etc::SourceList="/etc/apt/sources.list.d/offline.list" -o Dir::Etc::SourceParts=/dev/null -o Acquire::Languages="none" ansible apache2-utils bash-completion curl podman git jq less rsync tmux uidmap vim wget yq
Binaires Kubernetes
Lancer les commandes suivantes pour installer les binaires qui permettront d'interagir avec Kubernetes
cd "$WORK_DIR"
tar -zxvf kube_v1.32.6_3.6.21.tar.gz
# Deploy binaries
sudo cp kube-provisioner/v1.32.6/bin/* /usr/local/bin
sudo chmod +x /usr/local/bin/*
# Set auto completion
echo "" | sudo tee -a /etc/bash.bashrc
echo "source <(cilium completion bash)" | sudo tee -a /etc/bash.bashrc
echo "source <(hauler completion bash)" | sudo tee -a /etc/bash.bashrc
echo "source <(helm completion bash)" | sudo tee -a /etc/bash.bashrc
echo "source <(helmfile completion bash)" | sudo tee -a /etc/bash.bashrc
echo "source <(k9s completion bash)" | sudo tee -a /etc/bash.bashrc
echo "source <(kubectl completion bash)" | sudo tee -a /etc/bash.bashrc
# Installation helm diff plugin
mkdir -p ~/.local/share/helm/plugins/helm-diff/
tar -zxf kube-provisioner/v1.32.6/plugins/helm-diff-linux-amd64.tgz -C ~/.local/share/helm/plugins/helm-diff --strip-components=1
# Source basrc configuration
source /etc/bash.bashrc
source ~/.bashrc
Kubernetes
Cas des plateformes sans Kubernetes
La section décrit comment installer Kubernetes sur l'environnement.
Se rendre dans le répertoire d'installation de Kubernetes
cd "$WORK_DIR/kube-provisioner/os-provided"
Editer le fichier inventory_kdl.yaml conformément à votre plateforme :
- kosmos_domain : le nom de domaine voulu pour les services hébergés par le KDL
- external_registry : mettre à kosmos-registry.
<kosmos_domain>, en remplaçant<kosmos_domain>par la valeur choisie - kube_endpoint : l'adresse ip du kdl-master-1
- Pour chaque noeud :
- ansible_host : l'adresse ip du noeud
- node_ip : l'adresse ip du noeud
- lvm_disk : le nom du disque brut demandé dans les prérequis
Kubernetes pour fonctionner aura besoin d'utiliser deux réseaux, un pour les pods l'autre pour les services. Par défaut les réseaux suivants sont utilisés : 10.42.0.0/16 pour le réseau des pods et 10.43.0.0/16 pour le réseau des services.
Il est conseillé de garder ces réseaux par défaut, mais si un changement de réseaux était nécessaire, ajouter dans le fichier inventory_kdl.yaml dans la section all > vars les entrées suivantes avec les réseaux souhaités
pod_network_cidr: 20.42.0.0/16
service_network_cidr: 20.43.0.0/16
Lancer les commandes d'installation de Kubernetes
# Installation de Kubernetes
ansible-playbook -i inventory_kdl.yaml kube.yaml
# Récupération du kubeconfig pour communiquer avec le cluster
mkdir -p ~/.kube
until ssh $(yq -r '.all.vars.kube_endpoint' inventory_kdl.yaml) "sudo cat /etc/rancher/rke2/rke2.yaml" > ~/.kube/config; do
echo "Le fichier n'est pas encore disponible, nouvelle tentative dans 5 minutes..."
sleep 300
done
echo "Le fichier config a été récupéré"
chmod 600 ~/.kube/config
# Attente de l'apparition des noeuds kubernetes
until kubectl get nodes; do
echo "Les noeuds Kubernetes ne sont pas encore visibles, nouvelle tentative dans 1 minute..."
sleep 60
done
echo "Les noeuds Kubernetes commencent à apparaitre"
- le cluster met plusieurs minutes à démarrer.
- le démarrage de Kubernetes peut être suivi en allant sur le master et en lançant la commande
sudo journalctl -f | grep rke2. Le temps de démarrer plusieurs messages d'erreur sont visibles
Les commandes suivantes peuvent être lancées sur le master pour vérifier le bon chargement des images de base
cd /var/lib/rancher/rke2/data/v1.*/bin
sudo ./ctr -n=k8s.io --address /run/k3s/containerd/containerd.sock images list
Avant de passer aux sections suivantes, attendre que Kubernetes soit démarré en lançant la commande watch -c "kubectl get nodes && kubectl get pods -A". Lorsque Kubernetes est déployé :
- les différents noeuds du cluster sont visibles et dans l'état "Ready"
- les pods sont dans l'état "Running" ou "Completed".
Cas des plateformes avec Kubernetes déjà installé
Récupérer la configuration du cluster Kubernetes sur un noeud master. Mettre à jour la première ligne du script avec le nom du premier master.
# Récupération du kubeconfig pour communiquer avec le cluster
MASTER_NODE=kdl-master-1
mkdir -p ~/.kube
ssh $MASTER_NODE "sudo cat /etc/rancher/rke2/rke2.yaml" > ~/.kube/config
chmod 600 ~/.kube/config
Avant de passer aux sections suivantes, vérifier que Kubernetes est bien accessible et fonctionnel en lançant la commande watch -c "kubectl get nodes && kubectl get pods -A" :
- les différents noeuds du cluster sont visibles et dans l'état "Ready"
- les pods sont dans l'état "Running" ou "Completed".
Composants Kubernetes de base
- Lancer les commandes suivantes pour préparer Hauler et le déploiement :
cd "$WORK_DIR"
# Variables pour Hauler
export HAULER_STORE_DIR=$WORK_DIR/hauler-store
export HAULER_REGISTRY_DIR=$WORK_DIR/hauler-registry
export HAULER_TEMP_DIR=$WORK_DIR/hauler-tmp
mkdir -p $HAULER_TEMP_DIR
# Récupération du déploiement via Hauler
hauler store load --filename platform-provisioner-core_3.6.21.tar.zst
hauler store extract hauler/platform-provisioner.tar
tar -xvf platform-provisioner.tar
# Lancement de Hauler en tant que registry
nohup hauler store serve registry --directory "$HAULER_REGISTRY_DIR" > /dev/null 2>&1 &
# cd dans le répertoire de déploiement
cd "$WORK_DIR/platform-provisioner"
- Attendre que la registry Hauler réponde à la requête suivante (des lignes doivent apparaitre)
curl -s http://localhost:5000/v2/_catalog?n=1000 | jq .
Pour éviter que le pods zot soit en erreur à cause de l'OIDC, garder une copie du fichier values/zot/values.yaml
cp ./values/zot/values.yaml ./values/zot/values.yaml_ori
Editer le fichier ./values/zot/values.yaml pour modifier le bloc
"htpasswd": { "path": "/secrets/htpasswd/htpasswd" },
"openid": {
"providers": {
"oidc": {
"name": "oidc",
"credentialsFile": "/secrets/oidc-creds/oidc-creds.json",
"issuer": "https://auth.{{ .Values.domain }}/realms/kosmos",
"keypath": "",
"scopes": ["openid"]
}
}
}
en
"htpasswd": { "path": "/secrets/htpasswd/htpasswd" }
Attention à bien supprimer la virgule à la fin de la ligne
- Lancer l'installation des composants Kubernetes de base (certmanager, topolvm, zot)
KOSMOS_REGISTRY_ENDPOINT=localhost:5000/hauler helmfile -e $ENV sync -l component=core
- Arrêter le serveur Hauler et supprimer ses données
kill -9 $(ps -eo pid,cmd | grep "[h]auler store serve" | awk '{print $1}')
rm -rf ${HAULER_STORE_DIR}
rm -rf ${HAULER_TEMP_DIR}
rm -rf ${HAULER_REGISTRY_DIR}
Configuration pour accéder à la registry kosmos-registry (zot)
# Ajout des entrées vers la registry dans `/etc/hosts`
cd "$WORK_DIR/kube-provisioner/os-provided"
NODE_INFO=$(
kubectl get nodes \
--selector='!node-role.kubernetes.io/control-plane' \
-o jsonpath="{.items[0].metadata.name} {.items[0].status.addresses[?(@.type=='InternalIP')].address}" \
2>/dev/null
)
if [ -z "$NODE_INFO" ]; then
NODE_INFO=$(kubectl get nodes \
-o jsonpath="{.items[0].metadata.name} {.items[0].status.addresses[?(@.type=='InternalIP')].address}")
fi
NODE_NAME=$(echo "$NODE_INFO" | awk '{print $1}')
NODE_IP=$(echo "$NODE_INFO" | awk '{print $2}')
echo "Ajout dans /etc/hosts de l'entrée kosmos-registry.$KOSMOS_DOMAIN avec l'ip $NODE_IP ($NODE_NAME)"
ansible localhost -m lineinfile -b -a "path=/etc/hosts line='${NODE_IP} kosmos-registry.$KOSMOS_DOMAIN' state=present"
# Récupération de la CA Kubernetes
kubectl -n kosmos-system-restricted get secrets kosmos-ca-secret -o jsonpath={'.data.tls\.crt'} | base64 -d > /tmp/kube-ca.crt
sudo cp /tmp/kube-ca.crt /usr/local/share/ca-certificates
sudo update-ca-certificates
# Authentification de Hauler et Helm
zot_username=$(kubectl -n kosmos-dev-restricted get secret zot-admin-secret -o jsonpath='{.data.username}' | base64 -d )
zot_password=$(kubectl -n kosmos-dev-restricted get secret zot-admin-secret -o jsonpath='{.data.password}' | base64 -d )
hauler login --username ${zot_username} --password ${zot_password} kosmos-registry.${KOSMOS_DOMAIN}
helm registry login --username ${zot_username} --password ${zot_password} kosmos-registry.${KOSMOS_DOMAIN}
Pour éviter les futures alertes dans votre navigateur lors de la connexion aux UI hébergées par Kube, le certificat /tmp/kube-ca.crt peut être importé dans votre navigateur
Chargement des images des conteneurs et du déploiement
Lancer les commandes suivantes pour charger l'ensemble des images de la livraison dans kosmos-registry (zot).
- Le livrable faisant plusieurs dizaines de Go le
store loadetstore copyprennent plusieurs dizaines de minutes. - La commande
store loadaffichera le messageINF unarchiving completed successfullymais ne rendra pas la main immédiatement. Le comportement est normal et il est nécessaire d'attendre plusieurs minutes
cd "$WORK_DIR"
# Variables pour Hauler
export HAULER_STORE_DIR=$WORK_DIR/hauler-store
export HAULER_TEMP_DIR=$WORK_DIR/hauler-tmp
mkdir -p $HAULER_TEMP_DIR
# Chargement des artefacts dans la registry
hauler store load --filename platform-provisioner_3.6.21.tar.zst
hauler store copy registry://kosmos-registry.${KOSMOS_DOMAIN}/athea
# Récupération du déploiement via Hauler
hauler store extract hauler/platform-provisioner.tar
tar -xvf platform-provisioner.tar
# Suppression des répertoires Hauler
rm -rf ${HAULER_STORE_DIR}
rm -rf ${HAULER_TEMP_DIR}
Installation des Apps dans Kubernetes
Configuration de l'installation
Configurer l'environnement selon la réponse aux questions des sections suivantes.
Un GPU est-il disponible ?
Par défaut l'installation considère qu'un GPU est disponible. Si ce n'est pas le cas, pour éviter de perdre des ressources inutilement, éditer le fichier $WORK_DIR/platform-provisioner/environments/$ENV.yaml pour ajouter les lignes suivantes
gpuOperator:
enabled: false
Lancement de l'installation
Lancer les commandes suivantes pour lancer l'installation du reste des Apps dans Kubernetes
cd "$WORK_DIR/platform-provisioner"
helmfile -e $ENV sync -l component!=core
Pour suivre la progression la commande suivante peut être utilisée
watch -c "helm list -aA | grep -v deployed && kubectl get pods -A -o wide | grep -v Running | grep -v Completed"
Si à la fin de l'installation dans le namespace kosmos-data des pods scan-pipeline* sont en erreur, lancer la commande helmfile -e $ENV sync -l component=scan.
Les pods en erreur vont disparaitre.
Post-installation Gitlab
Suivre les instructions sur la post installation de Gitlab
Configuration des accès aux IHMs
Si aucun DNS n'est disponible, lancer la commande suivante pour remplir /etc/hosts.
Par défaut les url sont renvoyées vers le premier worker. Si un load balancer est disponible utiliser plutôt son IP que celui du premier worker
FIRST_WORKER_IP=$(kubectl get nodes --selector='!node-role.kubernetes.io/control-plane' -o jsonpath="{.items[0].status.addresses[?(@.type=='InternalIP')].address}")
for host in $(kubectl get ingress -A -o custom-columns="HOSTS:.spec.rules[*].host" --no-headers | sort -u); do
if ! grep -q " $host" /etc/hosts; then
echo "$FIRST_WORKER_IP $host" | sudo tee -a /etc/hosts
echo "Ajouté : $FIRST_WORKER_IP $host"
else
echo "Déjà présent : $host"
fi
done
Si un DNS est disponible, définir des entrées pour les url retournées par la commande suivante en les renvoyant vers le premier worker
kubectl get ingress -A -o custom-columns="HOSTS:.spec.rules[*].host" --no-headers | sort -u
Configuration de Rancher et accès aux secrets
Suivre les instructions sur l'activation du SSO dans l'interface Rancher
Suivre les instructions sur l'ajout de la kosmos-registry (zot) à Rancher
Ensuite, pour accéder aux secrets de la plateforme :
- se connecter avec le compte admin à
https://rancher.$KOSMOS_DOMAIN - cliquer dans le tableau sur le cluster
local - cliquer sur la gauche sur
Storage - cliquer sur la gauche sur
Secrets - utiliser le champ de recherche en haut à droite pour chercher un secret en particulier
Quelques secrets utiles :
argocd-initial-admin-secret: mot de passe de l'utilisateuradminpour argocdgitlab-gitlab-initial-root-password: mot de passe de l'utilisateurrootpour gitlabkeycloak-cluster-initial-admin: mot de passe de l'utilisateuradminpour keycloakgitea-admin-secret: nom d'utilisateur et password de l'administrateur gitea
Import des librairies
L'import des librairies consistent à déposer les offline-package-*.tar.gz de la livraison dans le bucket S3 adéquat. Pour cela :
- récupérer les credentials S3
echo s3_username = $(kubectl -n kosmos-s3 get secret minio-secrets -ojsonpath='{.data.accessKey}'| base64 -d)
echo s3_password = $(kubectl -n kosmos-s3 get secret minio-secrets -ojsonpath='{.data.secretKey}'| base64 -d)
- se connecter à S3
https://s3-admin.$KOSMOS_DOMAINen modeUse Credentialsavec ces credentials - cliquer sur le bucket
pkg-python - cliquer sur
UploadpuisUpload File - sélectionner le fichier
offline-package-pip-*.tar.gzde la livraison puis cliquer surOpen - recommencer ce processus avec le bucket
pkg-npmet le fichieroffline-package-npm-*.tar.gzde la livraison - recommencer ce processus avec le bucket
pkg-mvnet le fichieroffline-package-mvn-*.tar.gzde la livraison - recommencer ce processus avec le bucket
pkg-ret le fichieroffline-package-r-*.tar.gzde la livraison
Plus d'information sont disponibles dans la section Importer un package
Vérification des exemples de code git
Pour que les exemples de code Git fonctionnent :
- Créer un tenant fictif en suivant la documentation de Création d'un tenant
- Configurer le gestionnaire de code pour ce tenant
Pour la configuration du runner :
- Utiliser l'exemple du runner privilégié car il est nécessaire pour les builds des images avec Buildah
- Activer la case à cocher
Run untagged jobs - Mettre
3600dans le champMaximum job timeout
Pour la configuration RBAC, pour que les samples fonctionnent, utiliser le fichier agent-rbac-athea-samples.yaml disponible dans la livraison
- Forker les projets présents dans le groupe Toolbox/Athea/Samples
https://gitlab.<KOSMOS_DOMAIN>/toolbox/athea/samplesdans le groupe créé pour le tenant fictif - Dans le groupe créé pour le tenant fictif, cliquer sur
Settings > CI/CDpuisGeneral pipelinespour mettre500en tant queMaximum artifacts size. La valeur par défaut est de100, ce qui n'est pas suffisant pour l'exemple java. Le compte administrateur de Gitlab doit être utilisé pour cela, êtreOwnerdu groupe n'étant pas suffisant. - Lancer les pipelines des projets forkés