Bonnes pratiques
Table des matières
- Structure du repository
- Gestion des secrets
- Promotion entre environnements
- Monitoring et debugging
- Checklist production
- Exercices pratiques
1 - Structure du repository
Monorepo recommandé
gitops-fleet/
├── clusters/
│ ├── dev/
│ │ ├── flux-system/
│ │ └── apps.yaml
│ ├── staging/
│ │ ├── flux-system/
│ │ └── apps.yaml
│ └── production/
│ ├── flux-system/
│ └── apps.yaml
├── infrastructure/
│ ├── sources/ # HelmRepository, GitRepository
│ ├── controllers/ # cert-manager, ingress, etc.
│ └── configs/ # ConfigMaps partagés
└── apps/
├── base/
│ ├── app-1/
│ └── app-2/
└── overlays/
├── dev/
├── staging/
└── production/
Convention de nommage
# Préfixer par l'environnement
metadata:
name: production-nginx
# ou
name: nginx
namespace: production
Labels standards
metadata:
labels:
app.kubernetes.io/name: nginx
app.kubernetes.io/component: frontend
environment: production
team: platform
🔝 Retour à la table des matières
2 - Gestion des secrets
SOPS (recommandé)
# Installer SOPS
brew install sops
# Créer une clé age
age-keygen -o age.key
# Chiffrer
sops --encrypt --age age1xxx... secret.yaml > secret.enc.yaml
# Kustomization avec SOPS
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
spec:
decryption:
provider: sops
secretRef:
name: sops-age
Sealed Secrets
# Installer kubeseal
brew install kubeseal
# Chiffrer
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: my-secret
spec:
encryptedData:
password: AgBy8hCi...
External Secrets
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: my-secret
spec:
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: my-secret
data:
- secretKey: password
remoteRef:
key: secret/myapp
property: password
Comparaison
| Solution | Complexité | Sécurité | Rotation |
|---|---|---|---|
| SOPS | Moyenne | Excellente | Manuelle |
| Sealed Secrets | Faible | Bonne | Manuelle |
| External Secrets | Élevée | Excellente | Automatique |
🔝 Retour à la table des matières
3 - Promotion entre environnements
Pattern Git branches
Pattern Kustomize overlays
# apps/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 1
# apps/overlays/production/kustomization.yaml
patches:
- patch: |
- op: replace
path: /spec/replicas
value: 5
Pattern ImagePolicy par environnement
# Dev : dernier tag
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: my-app-dev
spec:
policy:
alphabetical:
order: desc
---
# Prod : semver stable
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: my-app-prod
spec:
policy:
semver:
range: ">=1.0.0"
🔝 Retour à la table des matières
4 - Monitoring et debugging
Commandes de debug
# État général
flux check
# Toutes les ressources
flux get all -A
# Logs d'un controller
flux logs --kind=Kustomization --name=my-app
# Events récents
kubectl get events -n flux-system --sort-by=.lastTimestamp
# Reconcilier manuellement
flux reconcile kustomization my-app --with-source
Métriques Prometheus
# ServiceMonitor pour Flux
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: flux
namespace: flux-system
spec:
selector:
matchLabels:
app.kubernetes.io/part-of: flux
endpoints:
- port: http-prom
Alertes importantes
# Alertmanager rule
- alert: FluxReconciliationFailure
expr: gotk_reconcile_condition{status="False",type="Ready"} == 1
for: 10m
labels:
severity: critical
annotations:
summary: "Flux reconciliation failing"
Dashboard Grafana
Flux fournit un dashboard Grafana officiel :
- ID:
16714(Flux Cluster Stats) - ID:
16716(Flux Control Plane)
🔝 Retour à la table des matières
5 - Checklist production
Avant la mise en production
- Bootstrap avec repo privé et SSH
- SOPS ou autre solution pour les secrets
- Notifications Slack/Teams configurées
- Monitoring Prometheus + Grafana
- RBAC multi-tenancy si nécessaire
- NetworkPolicies pour flux-system
- ResourceQuotas pour les tenants
Configuration recommandée
# Kustomization production
spec:
interval: 5m
retryInterval: 2m
timeout: 5m
prune: true
wait: true
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: my-app
Sécurité
# Restreindre les sources autorisées
# (au niveau du namespace tenant)
spec:
serviceAccountName: tenant-flux
targetNamespace: tenant-namespace
Backup
# Exporter toutes les ressources Flux
flux export source git --all > sources.yaml
flux export kustomization --all > kustomizations.yaml
flux export helmrelease --all > helmreleases.yaml
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice : Structure GitOps complète
# Créer cette structure
my-gitops/
├── clusters/
│ └── demo/
│ ├── flux-system/
│ │ ├── gotk-components.yaml
│ │ ├── gotk-sync.yaml
│ │ └── kustomization.yaml
│ └── apps.yaml
├── infrastructure/
│ └── sources/
│ └── bitnami.yaml
└── apps/
└── nginx/
├── namespace.yaml
├── release.yaml
└── kustomization.yaml
Quiz
Q1. Quelle solution de secrets est recommandée pour Flux ?
Réponse
SOPS avec age ou GPG est la solution recommandée car :
- Intégrée nativement dans Flux
- Les secrets chiffrés sont versionnés dans Git
- Pas de dépendance externe au runtime
Alternative : External Secrets pour les secrets dynamiques depuis un vault.
Q2. Comment forcer une réconciliation immédiate ?
Réponse
# Réconcilier une Kustomization avec sa source
flux reconcile kustomization my-app --with-source
# Ou juste la Kustomization
flux reconcile kustomization my-app
# Ou via annotation
kubectl annotate kustomization my-app \
reconcile.fluxcd.io/requestedAt="$(date +%s)" \
-n flux-system
🔝 Retour à la table des matières
Points clés à retenir
- Structure claire : clusters/, infrastructure/, apps/
- SOPS pour les secrets dans Git
- Overlays Kustomize pour la promotion
- Monitoring : Prometheus + dashboards Flux
- Checklist production avant déploiement