Isoler avec les namespaces #
Utilisez des namespaces pour segmenter et isoler les ressources dans vos clusters.
Gérer les configurations et secrets #
Centralisez les configurations et sécurisez les informations sensibles avec ConfigMaps et Secrets.
Utiliser ConfigMaps #
Les ConfigMaps permettent de centraliser les configurations des applications, facilitant les mises à jour et la gestion des variables d’environnement sans redéployer les conteneurs.
Stocker les informations sensibles #
Utilisez les Secrets pour protéger les données sensibles telles que les mots de passe et les clés API. Limitez leur accès pour garantir la sécurité des applications.
Activer les probes #
Assurez la disponibilité des services avec les probes de liveness et readiness.
Liveness Probes #
Les liveness probes permettent de redémarrer automatiquement les conteneurs en cas de défaillance, améliorant la continuité des services.
Readiness Probes #
Les readiness probes permettent de diriger le trafic uniquement vers les conteneurs prêts, réduisant ainsi les interruptions de service.
Définir des quotas et limites #
Limitez les ressources pour chaque conteneur et namespace afin d’éviter les conflits et d’optimiser les performances.
Automatiser les mises à jour #
Utilisez les Rolling Updates pour déployer des modifications sans interruption de service.
Surveiller les métriques #
La surveillance des performances permet de diagnostiquer rapidement les problèmes.
Outils de Monitoring #
Optez pour des outils comme Prometheus ou Dynatrace pour collecter et visualiser les métriques en temps réel, facilitant la gestion des ressources.
Configuration des alertes #
Définissez des alertes sur les métriques critiques pour réagir rapidement aux anomalies et éviter les interruptions de service.
Organiser avec labels et annotations #
Les labels et annotations facilitent la classification et la gestion des ressources.
Limiter les privilèges #
Appliquez le principe du moindre privilège pour améliorer la sécurité des conteneurs.
Non-Root Execution #
Exécutez les conteneurs avec des utilisateurs non root pour réduire les risques de compromission. Cette bonne pratique limite les privilèges en cas de faille.
Moindre Privilège #
Appliquez le principe du moindre privilège en limitant les permissions des conteneurs aux ressources strictement nécessaires pour fonctionner.
Activer la journalisation #
Centralisez les logs pour faciliter la surveillance et le dépannage.
Outils de journalisation #
Utilisez des solutions comme Fluentd ou Elasticsearch pour centraliser les logs, améliorant ainsi la visibilité des événements dans le cluster.
Planifier des sauvegardes #
Les sauvegardes régulières garantissent la continuité des services en cas de sinistre.
Sauvegardes des volumes #
Effectuez des sauvegardes fréquentes des volumes de données pour prévenir les pertes en cas de panne.
Sauvegarde de l'état du cluster #
Enregistrez régulièrement l’état du cluster pour restaurer facilement les configurations en cas de besoin.
Checklist d'ensemble #
Les six familles de pratiques.
Vue synthétique #
Charges de travail fiables #
Ressources, sondes et disponibilité.
Manifeste de référence #
apiVersion: apps/v1
kind: Deployment
metadata: { name: api }
spec:
replicas: 3
strategy: { type: RollingUpdate, rollingUpdate: { maxSurge: 1, maxUnavailable: 0 } }
selector: { matchLabels: { app: api } }
template:
metadata: { labels: { app: api } }
spec:
securityContext: { runAsNonRoot: true, seccompProfile: { type: RuntimeDefault } }
topologySpreadConstraints:
- { maxSkew: 1, topologyKey: topology.kubernetes.io/zone, whenUnsatisfiable: ScheduleAnyway, labelSelector: { matchLabels: { app: api } } }
containers:
- name: api
image: registre.exemple.fr/shop/api:1.4.2@sha256:... # version + digest
resources: { requests: { cpu: 250m, memory: 256Mi }, limits: { memory: 512Mi } }
readinessProbe: { httpGet: { path: /ready, port: 8080 } }
livenessProbe: { httpGet: { path: /healthz, port: 8080 } }
securityContext: { allowPrivilegeEscalation: false, readOnlyRootFilesystem: true, capabilities: { drop: [ALL] } }kubectl get pods -A -o json | jq -r '.items[] | select(.spec.containers[].resources.requests == null) | .metadata.namespace + "/" + .metadata.name' # pods sans requests
kubectl get pdb -A && kubectl get hpa -A
kubectl top pods -A --sort-by=memory | headSécurité et gouvernance #
Contrôles à automatiser.
Vérifications #
kubectl auth can-i --list --as=system:serviceaccount:prod:default
kubectl get clusterrolebindings -o json | jq -r '.items[] | select(.roleRef.name=="cluster-admin") | .metadata.name + " -> " + ([.subjects[]?.name] | join(","))'
kubectl label ns prod pod-security.kubernetes.io/enforce=restricted --overwrite
kubectl get networkpolicy -A
kubescape scan framework nsa && trivy k8s --report summary cluster
kubectl create quota prod-quota --hard=cpu=40,memory=80Gi,pods=100 -n prodBonne Pratique : Appliquez ces règles avec un moteur de politiques (Kyverno ou OPA Gatekeeper) pour les imposer à l'admission plutôt que de les vérifier après coup.
Exploitation du cluster #
Sauvegardes et mises à jour.
Sauvegarde, mises à jour, nœuds #
# Sauvegarde etcd
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-$(date +%F).db --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key
# Sauvegarde applicative (Velero)
velero backup create prod-$(date +%F) --include-namespaces prod --ttl 720h
velero restore create --from-backup prod-2026-10-18
# Mise à jour contrôlée d'un nœud
kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data && kubectl uncordon worker-1
kubeadm upgrade plan