diff --git a/admin/cluster.md b/admin/cluster.md index dc34c7e..cd83761 100644 --- a/admin/cluster.md +++ b/admin/cluster.md @@ -62,7 +62,8 @@ La connexion SSH se coupe à la fin (storage-01 s'éteint lui-même). C'est norm funk-stop --k8s ``` -Ordre d'arrêt automatique : hermes-agent + litellm → cordon+drain compute-02/03 → drain compute-01 → vérif NFS → talosctl shutdown → gpu-01 → qdrant + postgresql → storage-01. +Ordre d'arrêt : hermes-agent + litellm → cordon+drain compute-02/03 → drain compute-01 → vérif NFS → talosctl shutdown → gpu-01 → qdrant + postgresql → storage-01. +Ordre de démarrage : storage-01 déjà up → gpu-01 (WOL) → compute-01/02/03 (WOL) → uncordon → ArgoCD up → workloads. --- @@ -83,7 +84,10 @@ Vérifie dans l'ordre : 3. Attend le montage NFS `/mnt/models` sur gpu-01 4. Attend le chargement du modèle GPU (jusqu'à 4 min) 5. Attend les modèles CPU (jusqu'à 2 min) -6. `--k8s` : envoie WOL aux 3 nœuds, attend ping, attend nœuds Ready (3 min max) +6. `--k8s` : + - Envoie WOL aux 3 nœuds, attend ping, attend nœuds Ready (3 min max) + - **Uncordon** des nœuds s'ils sont `SchedulingDisabled` (état résiduel après `funk-stop --k8s`) + - Attend qu'ArgoCD soit Running (signe que le GitOps redémarre les workloads) ### `funk-stop [--k8s]` diff --git a/ansible/roles/litellm/files/funk-cluster b/ansible/roles/litellm/files/funk-cluster index 87b6606..bda49db 100644 --- a/ansible/roles/litellm/files/funk-cluster +++ b/ansible/roles/litellm/files/funk-cluster @@ -308,6 +308,8 @@ cmd_start() { if [ -n "$with_k8s" ]; then echo "" echo "[ cluster k8s — démarrage compute-01/02/03 ]" + + # Envoi WOL pour les nœuds éteints for i in 0 1 2; do local ip="${K8S_IPS[$i]}" name="${K8S_NAMES[$i]}" mac="${K8S_MACS[$i]}" if ping -c1 -W2 "$ip" &>/dev/null; then @@ -317,21 +319,53 @@ cmd_start() { ok "$name — WOL envoyé" fi done + + # Attente ping info "Attente ping des nœuds..." for ip in "${K8S_IPS[@]}"; do wait_ping "$ip" 120 && ok "$ip joignable" || warn "$ip n'a pas répondu" done + + # Attente nœuds Ready (kubelet enregistré + CNI ok) info "Attente nœuds Ready (jusqu'à 3 min)..." local k8s_elapsed=0 - until [ $($KUBECTL get nodes --no-headers 2>/dev/null | grep -c " Ready" || echo 0) -ge 3 ] \ + until [ "$($KUBECTL get nodes --no-headers 2>/dev/null | grep -c " Ready" || echo 0)" -ge 3 ] \ || [ $k8s_elapsed -ge 180 ]; do sleep 10; k8s_elapsed=$((k8s_elapsed + 10)) echo -ne " → Attente nœuds Ready... ${k8s_elapsed}s\r" done; echo "" - local ready=$($KUBECTL get nodes --no-headers 2>/dev/null | grep -c " Ready" || echo 0) + local ready="$($KUBECTL get nodes --no-headers 2>/dev/null | grep -c " Ready" || echo 0)" [ "$ready" -ge 1 ] \ && check_ok "kubectl — $ready nœud(s) Ready" \ || warn "Nœuds pas encore Ready (vérifier avec kubectl get nodes)" + + # Uncordon — les nœuds restent SchedulingDisabled après un funk-stop --k8s + # Sans ça, ArgoCD déploie des pods qui restent Pending indéfiniment + echo "" + info "Uncordon des nœuds (autorise le scheduling des pods)..." + local uncordoned=0 + for name in "${K8S_NAMES[@]}"; do + if $KUBECTL get node "$name" --no-headers 2>/dev/null | grep -q "SchedulingDisabled"; then + $KUBECTL uncordon "$name" 2>/dev/null && ok "$name — uncordonné" || warn "$name — uncordon échoué" + uncordoned=$((uncordoned + 1)) + fi + done + [ $uncordoned -eq 0 ] && ok "Nœuds déjà schedulables (pas de cordon résiduel)" + + # Attente ArgoCD opérationnel (signe que les workloads peuvent se déployer) + echo "" + info "Attente ArgoCD opérationnel (jusqu'à 3 min)..." + local argocd_elapsed=0 + until [ "$($KUBECTL get pods -n argocd --no-headers 2>/dev/null \ + | grep -c "Running" || echo 0)" -ge 1 ] \ + || [ $argocd_elapsed -ge 180 ]; do + sleep 10; argocd_elapsed=$((argocd_elapsed + 10)) + echo -ne " → Attente ArgoCD... ${argocd_elapsed}s\r" + done; echo "" + local argocd_pods="$($KUBECTL get pods -n argocd --no-headers 2>/dev/null | grep -c "Running" || echo 0)" + [ "$argocd_pods" -ge 1 ] \ + && check_ok "ArgoCD — $argocd_pods pod(s) Running (GitOps opérationnel)" \ + || warn "ArgoCD pas encore prêt — workloads k8s en cours de déploiement" fi print_score