xpeditis2.0/infra/prod/scripts/03-install-cluster-addons.sh
2026-09-07 21:40:50 +02:00

87 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# 03 - Composants du cluster (cert-manager, namespaces, acces registre)
# =============================================================================
# A executer depuis VOTRE POSTE, kubeconfig de prod charge :
#
# export KUBECONFIG=~/.kube/xpeditis-prod.yaml
# REGISTRY_TOKEN=... bash 03-install-cluster-addons.sh
#
# cert-manager est installe depuis son manifeste statique officiel : pas de
# Helm a maintenir sur le cluster, une seule version epinglee, un seul fichier
# a relire en cas de doute.
set -euo pipefail
CERT_MANAGER_VERSION="${CERT_MANAGER_VERSION:-v1.16.2}"
REGISTRY_SERVER="${REGISTRY_SERVER:-rg.fr-par.scw.cloud}"
REGISTRY_TOKEN="${REGISTRY_TOKEN:-}"
NAMESPACE="${NAMESPACE:-xpeditis-prod}"
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
K8S_DIR="${HERE}/../k8s"
log() { printf '\n>>> %s\n' "$*"; }
kubectl version --output=yaml >/dev/null || { echo "kubectl ne joint pas le cluster." >&2; exit 1; }
# --- 1. Namespaces -----------------------------------------------------------
log "Namespaces"
kubectl apply -f "${K8S_DIR}/base/00-namespaces.yaml"
# --- 2. cert-manager ---------------------------------------------------------
if ! kubectl get ns cert-manager >/dev/null 2>&1; then
log "Installation de cert-manager ${CERT_MANAGER_VERSION}"
kubectl apply -f \
"https://github.com/cert-manager/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml"
else
log "cert-manager deja present"
fi
log "Attente de cert-manager"
kubectl -n cert-manager rollout status deploy/cert-manager --timeout=180s
kubectl -n cert-manager rollout status deploy/cert-manager-webhook --timeout=180s
kubectl -n cert-manager rollout status deploy/cert-manager-cainjector --timeout=180s
# --- 3. Acces au registre Scaleway ------------------------------------------
# Le registre est prive : sans ce Secret, les pods restent en ImagePullBackOff.
if [[ -n "$REGISTRY_TOKEN" ]]; then
log "Secret d'acces au registre (${REGISTRY_SERVER})"
kubectl -n "$NAMESPACE" create secret docker-registry regcred \
--docker-server="$REGISTRY_SERVER" \
--docker-username=nologin \
--docker-password="$REGISTRY_TOKEN" \
--dry-run=client -o yaml | kubectl apply -f -
else
echo "AVERTISSEMENT: REGISTRY_TOKEN absent. Creez 'regcred' avant de deployer :"
echo " kubectl -n ${NAMESPACE} create secret docker-registry regcred \\"
echo " --docker-server=${REGISTRY_SERVER} --docker-username=nologin --docker-password=<token>"
fi
# --- 4. Emetteur ACME --------------------------------------------------------
# Le ClusterIssuer depend d'un Secret contenant le token API Cloudflare :
# il est chiffre SOPS et doit etre applique avant (secrets-apply.sh).
if kubectl -n cert-manager get secret cloudflare-api-token >/dev/null 2>&1; then
log "ClusterIssuer Let's Encrypt (DNS-01 Cloudflare)"
kubectl apply -f "${K8S_DIR}/cluster/cluster-issuer.yaml"
else
echo "AVERTISSEMENT: le Secret cert-manager/cloudflare-api-token est absent."
echo " Appliquez d'abord les secrets : bash scripts/secrets-apply.sh"
echo " puis : kubectl apply -f ${K8S_DIR}/cluster/cluster-issuer.yaml"
fi
# --- 5. Verifications --------------------------------------------------------
log "Etat"
kubectl get ns
kubectl -n cert-manager get pods
kubectl get clusterissuer 2>/dev/null || true
cat <<NEXT
=============================================================================
Composants du cluster installes.
=============================================================================
Etapes suivantes :
1. bash scripts/secrets-apply.sh # secrets SOPS -> cluster
2. bash scripts/deploy.sh <tag-image> # premier deploiement
=============================================================================
NEXT