unpdate tsl sync

This commit is contained in:
2026-01-22 03:18:37 +01:00
parent 71449d02f2
commit 482341f9f4
6 changed files with 51 additions and 592 deletions

View File

@@ -1,12 +0,0 @@
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: traefik-dev-tls
namespace: certificates-ops
spec:
secretName: traefik-dev-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- traefik.dev.gkdomaine.fr

View File

@@ -1,22 +0,0 @@
# Exemple de Dockerfile pour créer une image personnalisée SLE avec kubectl et jq
# Usage: docker build -t harbor.gkdomaine.local/images/kubectl-sle:1.33.0 -f Dockerfile.example .
FROM registry.suse.com/caasp/v4/kubectl:1.33
# Installer jq (nécessite root pour l'installation)
USER root
RUN zypper --non-interactive install -y jq && \
zypper clean -a
# Créer un utilisateur non-root
RUN useradd -u 1000 -m -s /bin/bash user && \
mkdir -p /home/user/.kube && \
chown -R user:user /home/user
# Passer à l'utilisateur non-root
USER user
WORKDIR /home/user
# Vérifier que kubectl et jq sont disponibles
RUN kubectl version --client && jq --version

View File

@@ -1,208 +0,0 @@
# TLS Sync Wildcard - Synchronisation automatique des certificats wildcard
Ce chart Helm déploie un CronJob qui synchronise automatiquement les secrets TLS wildcard depuis le cluster OPS vers tous les namespaces qui en ont besoin dans les clusters DEV, RCT et PRD.
## Problème résolu
En Kubernetes, un Ingress ne peut référencer un secret TLS que s'il est dans le **même namespace** que l'Ingress. C'est une limitation de Kubernetes.
Pour les certificats wildcard utilisés par plusieurs applications dans différents namespaces, il faut donc copier le secret dans chaque namespace.
Ce CronJob automatise cette synchronisation.
## Installation
### 1. Créer le Secret avec le kubeconfig
Le CronJob a besoin d'accéder aux différents clusters. Créez un Secret contenant les kubeconfigs :
```bash
# Option 1 : En root Utiliser le kubeconfig par défaut (si tous les contextes sont dedans)
kubectl create secret generic tls-sync-kubeconfig \
--from-file=config=$HOME/.kube/config \
-n certificates-ops \
--dry-run=client -o yaml | kubectl apply -f -
# Option 2 : Créer un kubeconfig combiné avec tous les contextes
kubectl config view --flatten > /tmp/combined-kubeconfig.yaml
kubectl create secret generic tls-sync-kubeconfig \
--from-file=config=/tmp/combined-kubeconfig.yaml \
-n certificates-ops \
--dry-run=client -o yaml | kubectl apply -f -
```
**Important** : Assurez-vous que le fichier dans le Secret s'appelle `config` pour que kubectl le trouve automatiquement dans `/root/.kube/config`.
### 2. Créer le ConfigMap avec le script
Le script de synchronisation doit être disponible dans un ConfigMap :
```bash
kubectl create configmap tls-sync-wildcard-script \
--from-file=sync-all-certificates.sh=../../scripts/sync-all-certificates.sh \
-n certificates-ops \
--dry-run=client -o yaml | kubectl apply -f -
```
### 3. Déployer via ArgoCD
Créez un ApplicationSet ou une Application ArgoCD pour déployer ce chart :
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: tls-sync-wildcard
namespace: argocd-ops
spec:
project: default
source:
repoURL: https://git.gkdomaine.fr/kubernetes/argocd.git
targetRevision: main
path: helm/tls-sync-wildcard/ops
destination:
name: cluster-ops
namespace: certificates-ops
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
```
### 4. Déploiement manuel (alternative)
```bash
helm install tls-sync-wildcard ./helm/tls-sync-wildcard/ops \
-n certificates-ops \
--create-namespace
```
## Configuration
### Modifier la fréquence de synchronisation
Éditez `helm/tls-sync-wildcard/ops/values.yaml` :
```yaml
tlsSync:
schedule: "0 */2 * * *" # Toutes les 2 heures
# Autres exemples :
# "0 * * * *" - Toutes les heures
# "*/30 * * * *" - Toutes les 30 minutes
# "0 0 * * *" - Tous les jours à minuit
```
### Ajouter des namespaces cibles
Pour ajouter d'autres namespaces qui utilisent le certificat wildcard, modifiez la fonction `get_wildcard_target_namespaces` dans `scripts/sync-all-certificates.sh` :
```bash
case "$env" in
dev)
WILDCARD_TARGET_NAMESPACES=("headlamp-dev" "homarr-dev" "longhorn-dev" "autre-app-dev")
;;
# ...
esac
```
## Vérification
```bash
# Vérifier le CronJob
kubectl get cronjob -n certificates-ops tls-sync-wildcard
# Vérifier les Jobs créés
kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard
# Voir les logs du dernier Job
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --tail=100
# Déclencher manuellement une synchronisation
kubectl create job --from=cronjob/tls-sync-wildcard tls-sync-wildcard-manual-$(date +%s) -n certificates-ops
```
## Dépannage
### Le CronJob ne se déclenche pas
```bash
# Vérifier le schedule
kubectl get cronjob tls-sync-wildcard -n certificates-ops -o yaml | grep schedule
# Vérifier les événements
kubectl get events -n certificates-ops --sort-by='.lastTimestamp' | grep tls-sync-wildcard
```
### Les Jobs échouent
```bash
# Voir les logs du dernier Job
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --tail=100
# Vérifier les erreurs
kubectl describe job -n certificates-ops -l app=tls-sync-wildcard
```
### Erreur "context not found"
Le Secret `tls-sync-kubeconfig` n'est pas correctement configuré ou les contextes kubectl ne sont pas disponibles.
```bash
# Vérifier le Secret
kubectl get secret tls-sync-kubeconfig -n certificates-ops -o yaml
# Tester l'accès depuis un pod
kubectl run -it --rm debug --image=bitnami/kubectl:1.31 --restart=Never \
-n certificates-ops \
--overrides='
{
"spec": {
"containers": [{
"name": "debug",
"image": "bitnami/kubectl:1.31",
"volumeMounts": [{
"name": "kubeconfig",
"mountPath": "/root/.kube",
"readOnly": true
}]
}],
"volumes": [{
"name": "kubeconfig",
"secret": {
"secretName": "tls-sync-kubeconfig"
}
}]
}
}' \
-- kubectl config get-contexts
```
## Architecture
```
┌─────────────────┐
│ Cluster OPS │
│ │
│ cert-manager │─── Génère les certificats Let's Encrypt
│ │
│ Certificates │─── Crée les secrets TLS dans certificates-ops
│ │
│ CronJob │─── Synchronise automatiquement les secrets
│ tls-sync- │ wildcard vers tous les namespaces nécessaires
│ wildcard │
└─────────────────┘
├───► Cluster DEV
│ ├─── headlamp-dev (wildcard-dev-tls)
│ ├─── homarr-dev (wildcard-dev-tls)
│ └─── longhorn-dev (wildcard-dev-tls)
├───► Cluster RCT
│ └─── (même principe)
└───► Cluster PRD
└─── (même principe)
```

View File

@@ -1,268 +0,0 @@
# Guide de Vérification - TLS Sync Wildcard
Ce guide vous explique comment vérifier que le CronJob de synchronisation des certificats wildcard fonctionne correctement.
## 1. Vérifier que le CronJob est déployé
```bash
# Vérifier que le CronJob existe
kubectl get cronjob -n certificates-ops tls-sync-wildcard --context=cluster-ops
# Voir les détails du CronJob
kubectl describe cronjob -n certificates-ops tls-sync-wildcard --context=cluster-ops
# Vérifier le schedule configuré
kubectl get cronjob -n certificates-ops tls-sync-wildcard --context=cluster-ops -o jsonpath='{.spec.schedule}' && echo
```
**Résultat attendu** : Le CronJob doit être présent avec un schedule (par exemple `0 * * * *` pour toutes les heures).
## 2. Vérifier que les Jobs sont créés
```bash
# Lister tous les Jobs créés par le CronJob
kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops
# Voir les Jobs récents (dernières 24h)
kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --sort-by=.metadata.creationTimestamp | tail -5
# Vérifier le statut du dernier Job
kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops -o wide | head -2
```
**Résultat attendu** : Vous devriez voir des Jobs avec le statut `Complete` ou `Running`.
## 3. Voir les logs des Jobs
```bash
# Voir les logs du dernier Job
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=100
# Voir les logs d'un Job spécifique
JOB_NAME=$(kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1].metadata.name}')
kubectl logs -n certificates-ops job/$JOB_NAME --context=cluster-ops
# Suivre les logs en temps réel (si un Job est en cours)
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops -f
```
**Résultat attendu** : Les logs doivent montrer :
- `=== Synchronisation automatique des secrets TLS ===`
- `📋 Traitement du certificat: wildcard-dev-tls`
- `🌐 Certificat wildcard détecté`
- `✅ Synchronisé avec succès dans <namespace>`
## 4. Vérifier que les secrets sont synchronisés
### Dans le cluster DEV
```bash
# Vérifier que le secret existe dans headlamp-dev
kubectl get secret wildcard-dev-tls -n headlamp-dev --context=cluster-dev
# Vérifier que le secret existe dans homarr-dev
kubectl get secret wildcard-dev-tls -n homarr-dev --context=cluster-dev
# Vérifier que le secret existe dans longhorn-dev
kubectl get secret wildcard-dev-tls -n longhorn-dev --context=cluster-dev
# Vérifier les détails d'un secret (date de création, taille, etc.)
kubectl describe secret wildcard-dev-tls -n headlamp-dev --context=cluster-dev
```
**Résultat attendu** : Les secrets doivent exister dans tous les namespaces configurés.
### Comparer les secrets entre namespaces
```bash
# Comparer les certificats (doivent être identiques)
kubectl get secret wildcard-dev-tls -n certificates-ops --context=cluster-ops -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -subject -dates
kubectl get secret wildcard-dev-tls -n headlamp-dev --context=cluster-dev -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -subject -dates
```
**Résultat attendu** : Les certificats doivent être identiques (même sujet, mêmes dates).
## 5. Déclencher manuellement une synchronisation
```bash
# Créer un Job manuel à partir du CronJob
kubectl create job --from=cronjob/tls-sync-wildcard tls-sync-wildcard-manual-$(date +%s) -n certificates-ops --context=cluster-ops
# Attendre quelques secondes puis voir les logs
sleep 5
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=50
```
**Résultat attendu** : Un nouveau Job est créé et exécuté immédiatement.
## 6. Vérifier les permissions RBAC
```bash
# Vérifier que le ServiceAccount existe
kubectl get serviceaccount tls-sync-wildcard -n certificates-ops --context=cluster-ops
# Vérifier que le ClusterRole existe
kubectl get clusterrole tls-sync-wildcard --context=cluster-ops
# Vérifier que le ClusterRoleBinding existe
kubectl get clusterrolebinding tls-sync-wildcard --context=cluster-ops
# Tester les permissions du ServiceAccount
kubectl auth can-i get secrets --namespace=certificates-ops --as=system:serviceaccount:certificates-ops:tls-sync-wildcard --context=cluster-ops
kubectl auth can-i create secrets --namespace=headlamp-dev --as=system:serviceaccount:certificates-ops:tls-sync-wildcard --context=cluster-dev
```
**Résultat attendu** : Toutes les commandes doivent retourner `yes`.
## 7. Vérifier le ConfigMap avec le script
```bash
# Vérifier que le ConfigMap existe
kubectl get configmap tls-sync-wildcard-script -n certificates-ops --context=cluster-ops
# Voir le contenu du script (premières lignes)
kubectl get configmap tls-sync-wildcard-script -n certificates-ops --context=cluster-ops -o jsonpath='{.data.sync-all-certificates\.sh}' | head -20
```
**Résultat attendu** : Le ConfigMap doit exister et contenir le script.
## 8. Vérifier le Secret kubeconfig
```bash
# Vérifier que le Secret existe
kubectl get secret tls-sync-kubeconfig -n certificates-ops --context=cluster-ops
# Vérifier que le fichier config est présent
kubectl get secret tls-sync-kubeconfig -n certificates-ops --context=cluster-ops -o jsonpath='{.data.config}' | base64 -d | head -5
```
**Résultat attendu** : Le Secret doit exister et contenir un fichier `config` valide.
## 9. Script de vérification complète
Créez un script pour vérifier tout d'un coup :
```bash
#!/bin/bash
# Script de vérification complète du TLS Sync
echo "=== Vérification du TLS Sync Wildcard ==="
echo ""
echo "1. CronJob..."
kubectl get cronjob -n certificates-ops tls-sync-wildcard --context=cluster-ops 2>/dev/null && echo "✅ CronJob existe" || echo "❌ CronJob manquant"
echo ""
echo "2. Derniers Jobs..."
kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --sort-by=.metadata.creationTimestamp | tail -3
echo ""
echo "3. Secrets dans cluster-dev..."
for ns in headlamp-dev homarr-dev longhorn-dev; do
if kubectl get secret wildcard-dev-tls -n "$ns" --context=cluster-dev &>/dev/null; then
echo "✅ $ns: secret présent"
else
echo "❌ $ns: secret manquant"
fi
done
echo ""
echo "4. Logs du dernier Job..."
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=20 2>/dev/null | tail -5
echo ""
echo "=== Vérification terminée ==="
```
## 10. Dépannage des problèmes courants
### Le CronJob ne crée pas de Jobs
```bash
# Vérifier les événements
kubectl get events -n certificates-ops --context=cluster-ops --sort-by='.lastTimestamp' | grep tls-sync-wildcard | tail -10
# Vérifier le schedule
kubectl get cronjob -n certificates-ops tls-sync-wildcard --context=cluster-ops -o yaml | grep -A 2 schedule
```
### Les Jobs échouent
```bash
# Voir les détails du Job en échec
kubectl describe job -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops | tail -30
# Voir les logs d'erreur
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=100 | grep -i error
```
### Les secrets ne sont pas synchronisés
```bash
# Vérifier que le certificat source existe
kubectl get certificate wildcard-dev-tls -n certificates-ops --context=cluster-ops
# Vérifier que le secret source existe
kubectl get secret wildcard-dev-tls -n certificates-ops --context=cluster-ops
# Vérifier les logs pour voir pourquoi la synchronisation a échoué
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=200 | grep -A 10 "wildcard-dev-tls"
```
### Erreur "context not found"
```bash
# Vérifier que le Secret kubeconfig contient tous les contextes
kubectl get secret tls-sync-kubeconfig -n certificates-ops --context=cluster-ops -o jsonpath='{.data.config}' | base64 -d | grep -E "contexts:|name:"
# Tester l'accès aux clusters depuis un pod de test
kubectl run -it --rm test-kubeconfig --image=bitnami/kubectl:1.31 --restart=Never \
-n certificates-ops \
--context=cluster-ops \
--overrides='
{
"spec": {
"containers": [{
"name": "test-kubeconfig",
"image": "bitnami/kubectl:1.31",
"volumeMounts": [{
"name": "kubeconfig",
"mountPath": "/root/.kube",
"readOnly": true
}]
}],
"volumes": [{
"name": "kubeconfig",
"secret": {
"secretName": "tls-sync-kubeconfig"
}
}]
}
}' \
-- kubectl config get-contexts
```
## 11. Monitoring continu
Pour surveiller en continu :
```bash
# Watch les Jobs
watch -n 5 'kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops'
# Watch les secrets dans un namespace
watch -n 10 'kubectl get secret wildcard-dev-tls -n headlamp-dev --context=cluster-dev'
```
## Résumé des commandes essentielles
```bash
# Vérification rapide (tout en une fois)
kubectl get cronjob,jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops && \
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=30 && \
echo "--- Secrets dans cluster-dev ---" && \
kubectl get secret wildcard-dev-tls -n headlamp-dev --context=cluster-dev && \
kubectl get secret wildcard-dev-tls -n homarr-dev --context=cluster-dev && \
kubectl get secret wildcard-dev-tls -n longhorn-dev --context=cluster-dev
```

View File

@@ -1,21 +1,17 @@
# Configuration pour le CronJob de synchronisation des secrets TLS wildcard
tlsSync:
# Schedule Cron pour la synchronisation (toutes les heures par défaut)
schedule: "*/5 * * * *" # Toutes les 5 minutes
schedule: "0 0 * * *" # Toutes les jours à 00:00
# Cluster source (où les certificats sont générés)
sourceCluster: "cluster-ops"
sourceNamespace: "certificates-ops"
sourceCluster: "cluster-ops" # Cluster OPS
sourceNamespace: "certificates-ops" # Namespace des certificats
# Image à utiliser (doit contenir kubectl, bash ET jq)
# IMPORTANT: L'image doit contenir jq car le conteneur s'exécute en non-root (sécurité)
# Options recommandées:
# - alpine/k8s (contient kubectl et jq)
# - bitnami/kubectl (contient kubectl, peut nécessiter jq)
# - Image personnalisée basée sur SLE avec jq pré-installé
image:
repository: alpine/k8s
tag: "1.33.0" # Version de kubectl
tag: "1.33.0" # Version de kubectl (doit contenir jq)
pullPolicy: IfNotPresent
# Ressources