unpdate tsl sync
This commit is contained in:
@@ -1,270 +0,0 @@
|
||||
# Automatisation de la Synchronisation des Secrets TLS
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Ce document décrit les différentes options pour automatiser la synchronisation des secrets TLS depuis le cluster OPS (où cert-manager génère les certificats) vers les clusters DEV, RCT et PRD (où les applications sont déployées).
|
||||
|
||||
## 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 │ vers les autres clusters
|
||||
└─────────────────┘
|
||||
│
|
||||
├───► Cluster DEV (homarr-dev, headlamp-dev, etc.)
|
||||
├───► Cluster RCT (applications RCT)
|
||||
└───► Cluster PRD (applications PRD)
|
||||
```
|
||||
|
||||
## Solution Implémentée : CronJob Kubernetes
|
||||
|
||||
### Avantages
|
||||
|
||||
✅ **Simple et fiable** : Utilise les ressources Kubernetes natives
|
||||
✅ **GitOps compatible** : Déployé via ArgoCD depuis Git
|
||||
✅ **Facile à déboguer** : Logs disponibles via `kubectl logs`
|
||||
✅ **Configurable** : Fréquence de synchronisation ajustable
|
||||
✅ **Robuste** : Gestion automatique des erreurs et retry
|
||||
|
||||
### Inconvénients
|
||||
|
||||
⚠️ **Délai de synchronisation** : Maximum 1 heure (selon la fréquence configurée)
|
||||
⚠️ **Nécessite les kubeconfigs** : Les contextes kubectl doivent être disponibles dans le pod
|
||||
|
||||
## Installation
|
||||
|
||||
### 1. Créer le Secret avec les kubeconfigs
|
||||
|
||||
Le CronJob a besoin d'accéder aux différents clusters. Créez un Secret contenant les kubeconfigs :
|
||||
|
||||
```bash
|
||||
# Option 1 : Utiliser le kubeconfig par défaut (si tous les contextes sont dedans)
|
||||
kubectl create secret generic tls-sync-kubeconfig \
|
||||
--from-file=config=/root/.kube/config \
|
||||
-n certificates-ops \
|
||||
--dry-run=client -o yaml | kubectl apply -f -
|
||||
|
||||
# Option 2 : Créer un kubeconfig combiné avec tous les contextes
|
||||
# (recommandé si vous avez plusieurs fichiers kubeconfig)
|
||||
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. Déployer via ArgoCD
|
||||
|
||||
Le chart Helm est déjà configuré dans `apps/applicationset-tls-sync.yaml`. ArgoCD le déploiera automatiquement sur le cluster OPS.
|
||||
|
||||
Si vous préférez déployer manuellement :
|
||||
|
||||
```bash
|
||||
helm install tls-sync ./helm/tls-sync/ops \
|
||||
-n certificates-ops \
|
||||
--create-namespace
|
||||
```
|
||||
|
||||
### 3. Vérifier le déploiement
|
||||
|
||||
```bash
|
||||
# Vérifier le CronJob
|
||||
kubectl get cronjob -n certificates-ops
|
||||
|
||||
# Vérifier les Jobs créés
|
||||
kubectl get jobs -n certificates-ops -l app=tls-sync
|
||||
|
||||
# Voir les logs du dernier Job
|
||||
kubectl logs -n certificates-ops -l app=tls-sync --tail=100
|
||||
|
||||
# Déclencher manuellement une synchronisation
|
||||
kubectl create job --from=cronjob/tls-sync tls-sync-manual-$(date +%s) -n certificates-ops
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Modifier la fréquence de synchronisation
|
||||
|
||||
Éditez `helm/tls-sync/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
|
||||
```
|
||||
|
||||
### Modifier les ressources
|
||||
|
||||
```yaml
|
||||
tlsSync:
|
||||
resources:
|
||||
requests:
|
||||
memory: "128Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "256Mi"
|
||||
cpu: "500m"
|
||||
```
|
||||
|
||||
## Alternatives
|
||||
|
||||
### Option 1 : Watch/Webhook (Réactif)
|
||||
|
||||
Utiliser un opérateur Kubernetes qui surveille les changements de secrets et synchronise immédiatement.
|
||||
|
||||
**Avantages** :
|
||||
- Synchronisation instantanée
|
||||
- Réactif aux changements
|
||||
|
||||
**Inconvénients** :
|
||||
- Plus complexe à mettre en place
|
||||
- Nécessite un opérateur personnalisé ou External Secrets Operator
|
||||
- Plus de ressources consommées
|
||||
|
||||
### Option 2 : External Secrets Operator
|
||||
|
||||
Utiliser ESO pour synchroniser les secrets depuis un backend (comme Kubernetes secrets dans OPS).
|
||||
|
||||
**Avantages** :
|
||||
- Solution standardisée
|
||||
- Support multi-cluster natif
|
||||
|
||||
**Inconvénients** :
|
||||
- Nécessite d'installer ESO sur tous les clusters
|
||||
- Configuration plus complexe
|
||||
- Overhead supplémentaire
|
||||
|
||||
### Option 3 : ArgoCD Application (GitOps)
|
||||
|
||||
Créer des Applications ArgoCD qui référencent les secrets TLS depuis OPS.
|
||||
|
||||
**Avantages** :
|
||||
- Complètement GitOps
|
||||
- Intégré avec ArgoCD
|
||||
|
||||
**Inconvénients** :
|
||||
- Les secrets ne sont pas dans Git (contraire aux pratiques GitOps)
|
||||
- Nécessite une configuration complexe avec des secrets externes
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Le CronJob ne se déclenche pas
|
||||
|
||||
```bash
|
||||
# Vérifier le schedule
|
||||
kubectl get cronjob tls-sync -n certificates-ops -o yaml | grep schedule
|
||||
|
||||
# Vérifier les événements
|
||||
kubectl get events -n certificates-ops --sort-by='.lastTimestamp' | grep tls-sync
|
||||
```
|
||||
|
||||
### Les Jobs échouent
|
||||
|
||||
```bash
|
||||
# Voir les logs du dernier Job
|
||||
kubectl logs -n certificates-ops -l app=tls-sync --tail=100
|
||||
|
||||
# Vérifier les erreurs
|
||||
kubectl describe job -n certificates-ops -l app=tls-sync
|
||||
```
|
||||
|
||||
### 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 \
|
||||
--overrides='
|
||||
{
|
||||
"spec": {
|
||||
"containers": [{
|
||||
"name": "debug",
|
||||
"image": "bitnami/kubectl:1.31",
|
||||
"command": ["/bin/sh"],
|
||||
"args": ["-c", "sleep 3600"],
|
||||
"volumeMounts": [{
|
||||
"name": "kubeconfig",
|
||||
"mountPath": "/root/.kube"
|
||||
}]
|
||||
}],
|
||||
"volumes": [{
|
||||
"name": "kubeconfig",
|
||||
"secret": {
|
||||
"secretName": "tls-sync-kubeconfig"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}' -n certificates-ops
|
||||
|
||||
# Dans le pod, tester :
|
||||
kubectl config get-contexts
|
||||
kubectl get nodes --context=cluster-dev
|
||||
```
|
||||
|
||||
### Les secrets ne sont pas synchronisés
|
||||
|
||||
1. Vérifier que les certificats existent dans OPS :
|
||||
```bash
|
||||
kubectl get certificates -n certificates-ops
|
||||
```
|
||||
|
||||
2. Vérifier que les secrets TLS existent dans OPS :
|
||||
```bash
|
||||
kubectl get secrets -n certificates-ops | grep tls
|
||||
```
|
||||
|
||||
3. Vérifier que les contextes kubectl sont corrects :
|
||||
```bash
|
||||
kubectl config get-contexts
|
||||
```
|
||||
|
||||
4. Vérifier les logs du Job pour voir les erreurs spécifiques
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Vérifier l'historique des synchronisations
|
||||
|
||||
```bash
|
||||
# Voir tous les Jobs créés par le CronJob
|
||||
kubectl get jobs -n certificates-ops -l app=tls-sync --sort-by=.metadata.creationTimestamp
|
||||
|
||||
# Voir les logs de tous les Jobs réussis
|
||||
for job in $(kubectl get jobs -n certificates-ops -l app=tls-sync -o name | grep -v "No resources"); do
|
||||
echo "=== $job ==="
|
||||
kubectl logs -n certificates-ops $job
|
||||
done
|
||||
```
|
||||
|
||||
### Alertes (optionnel)
|
||||
|
||||
Vous pouvez créer des alertes Prometheus pour surveiller :
|
||||
- Le nombre de Jobs échoués
|
||||
- La durée d'exécution des Jobs
|
||||
- Le nombre de secrets synchronisés
|
||||
|
||||
## Conclusion
|
||||
|
||||
La solution CronJob est recommandée car elle est :
|
||||
- ✅ Simple à mettre en place
|
||||
- ✅ Fiable et robuste
|
||||
- ✅ Compatible avec GitOps
|
||||
- ✅ Facile à maintenir et déboguer
|
||||
|
||||
Pour la plupart des cas d'usage, une synchronisation toutes les heures est suffisante, car les certificats Let's Encrypt sont valides pendant 90 jours et sont renouvelés automatiquement 30 jours avant expiration.
|
||||
|
||||
231
docs/tls-sync-wildcard.md
Normal file
231
docs/tls-sync-wildcard.md
Normal file
@@ -0,0 +1,231 @@
|
||||
# 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 : 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 \
|
||||
--context=cluster-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 \
|
||||
--context=cluster-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 `/home/user/.kube/config`.
|
||||
|
||||
### 2. Le ConfigMap avec le script est créé automatiquement
|
||||
|
||||
Le script de synchronisation est automatiquement inclus dans le chart Helm via un ConfigMap. Aucune action manuelle n'est nécessaire.
|
||||
|
||||
### 3. Déployer via ArgoCD
|
||||
|
||||
Le chart est déployé automatiquement via l'ApplicationSet `applicationset-tls-sync-wildcard.yaml`.
|
||||
|
||||
Pour un déploiement manuel :
|
||||
|
||||
```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 \
|
||||
--context=cluster-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 --context=cluster-ops
|
||||
|
||||
# Vérifier les Jobs créés
|
||||
kubectl get jobs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops
|
||||
|
||||
# Voir les logs du dernier Job
|
||||
kubectl logs -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops --tail=100
|
||||
|
||||
# Déclencher manuellement une synchronisation
|
||||
kubectl create job --from=cronjob/tls-sync-wildcard tls-sync-wildcard-manual-$(date +%s) -n certificates-ops --context=cluster-ops
|
||||
```
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Le CronJob ne se déclenche pas
|
||||
|
||||
```bash
|
||||
# Vérifier le schedule
|
||||
kubectl get cronjob tls-sync-wildcard -n certificates-ops --context=cluster-ops -o yaml | grep schedule
|
||||
|
||||
# Vérifier les événements
|
||||
kubectl get events -n certificates-ops --context=cluster-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 --context=cluster-ops --tail=100
|
||||
|
||||
# Vérifier les erreurs
|
||||
kubectl describe job -n certificates-ops -l app=tls-sync-wildcard --context=cluster-ops
|
||||
```
|
||||
|
||||
### 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 --context=cluster-ops -o yaml
|
||||
|
||||
# Tester l'accès depuis un pod
|
||||
kubectl run -it --rm debug --image=alpine/k8s:1.33.0 --restart=Never \
|
||||
-n certificates-ops \
|
||||
--context=cluster-ops \
|
||||
--overrides='
|
||||
{
|
||||
"spec": {
|
||||
"containers": [{
|
||||
"name": "debug",
|
||||
"image": "alpine/k8s:1.33.0",
|
||||
"volumeMounts": [{
|
||||
"name": "kubeconfig",
|
||||
"mountPath": "/home/user/.kube",
|
||||
"readOnly": true
|
||||
}]
|
||||
}],
|
||||
"volumes": [{
|
||||
"name": "kubeconfig",
|
||||
"secret": {
|
||||
"secretName": "tls-sync-kubeconfig"
|
||||
}
|
||||
}]
|
||||
}
|
||||
}' \
|
||||
-- kubectl config get-contexts
|
||||
```
|
||||
|
||||
### Erreur "jq: command not found"
|
||||
|
||||
L'image utilisée ne contient pas `jq`. Vérifiez que l'image dans `values.yaml` contient `jq` :
|
||||
|
||||
```yaml
|
||||
image:
|
||||
repository: alpine/k8s # Contient kubectl et jq
|
||||
tag: "1.33.0"
|
||||
```
|
||||
|
||||
## Sécurité
|
||||
|
||||
Le CronJob s'exécute avec les meilleures pratiques de sécurité :
|
||||
|
||||
- ✅ **Non-root** : Le conteneur s'exécute avec l'UID 1000 (utilisateur non-privilégié)
|
||||
- ✅ **Pas d'élévation de privilèges** : `allowPrivilegeEscalation: false`
|
||||
- ✅ **Capabilities minimales** : Toutes les capabilities Linux sont supprimées
|
||||
- ✅ **Image sécurisée** : Utilise une image qui contient déjà tous les outils nécessaires (pas d'installation de paquets)
|
||||
|
||||
## 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)
|
||||
```
|
||||
|
||||
## Scripts utiles
|
||||
|
||||
- `scripts/sync-all-certificates.sh` : Script de synchronisation (utilisé par le CronJob)
|
||||
- `scripts/verify-tls-sync.sh` : Script de vérification du fonctionnement
|
||||
|
||||
Reference in New Issue
Block a user