Aller au contenu principal

Bonnes pratiques


Table des matières

  1. Structure du repository
  2. Gestion des secrets
  3. Promotion entre environnements
  4. Monitoring et debugging
  5. Checklist production
  6. 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

SolutionComplexitéSécuritéRotation
SOPSMoyenneExcellenteManuelle
Sealed SecretsFaibleBonneManuelle
External SecretsÉlevéeExcellenteAutomatique

🔝 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

← Chapitre précédent | Chapitre suivant : Exercices →