Kyverno est un moteur de policies natif Kubernetes, projet CNCF Graduated depuis avril 2023. Là où OPA/Gatekeeper nécessite d'apprendre le langage Rego, Kyverno exprime toutes ses règles en YAML standard Kubernetes - si tu sais écrire un manifest K8s, tu sais écrire une policy Kyverno. Il s'installe comme admission controller et prend en charge trois opérations : validation (bloquer les ressources non conformes), mutation (modifier automatiquement les ressources à l'admission), et génération (créer des ressources associées automatiquement).
Informations essentielles
Origine : Nirmata → CNCF · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Releases
Support : CNCF Graduated depuis mars 2026 (Incubating depuis juillet 2022). Compatible Kubernetes 1.25+.
Stack par défaut
| Composant | Valeur |
|---|---|
| Langage des policies | YAML natif Kubernetes (CRDs ClusterPolicy / Policy) |
| Opérations | validate, mutate, generate, verifyImages |
| Modes | enforce (bloque) ou audit (signale sans bloquer) |
| Reporting | PolicyReport / ClusterPolicyReport (CRDs standards) |
| CLI | kyverno pour tester les policies hors cluster |
Concepts clés
| Concept | Description |
|---|---|
| ClusterPolicy | Policy appliquée à tout le cluster |
| Policy | Policy limitée à un namespace |
| validate | Bloque ou signale les ressources qui ne respectent pas les règles |
| mutate | Modifie les ressources à l'admission (ajout labels, annotations…) |
| generate | Crée automatiquement des ressources associées (ex: NetworkPolicy par namespace) |
| verifyImages | Vérifie les signatures d'images (Cosign/Sigstore) |
| PolicyReport | Rapport de conformité généré par Kyverno (CRD standard) |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.25+ |
| Helm | 3.x |
| Droits | cluster-admin |
Installation
Via Helm (recommandé)
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
helm install kyverno kyverno/kyverno \
--namespace kyverno --create-namespace \
--set replicaCount=3 # HA recommandé en production
# Vérifier
kubectl rollout status deploy/kyverno -n kyverno
Vérification de l'installation
# 1. Pods Kyverno
kubectl get pods -n kyverno
# kyverno-* (3/3 en HA) doit être Running
# 2. Webhooks enregistrés (Kyverno s'enregistre comme admission controller)
kubectl get validatingwebhookconfigurations | grep kyverno
kubectl get mutatingwebhookconfigurations | grep kyverno
# Doit afficher kyverno-policy-validating-webhook-cfg et kyverno-resource-mutating-webhook-cfg
# 3. CRDs installés
kubectl get crd | grep kyverno
# clusterpolicies, policies, policyreports, clusterpolicyreports...
# 4. Test rapide avec une policy en mode audit
kubectl apply -f - <<EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-test
spec:
validationFailureAction: audit
rules:
- name: check-labels
match:
any:
- resources:
kinds: [Pod]
validate:
message: "Le label app est requis"
pattern:
metadata:
labels:
app: "?*"
EOF
kubectl get clusterpolicy check-test
# READY doit être True
# Nettoyage
kubectl delete clusterpolicy check-test
Pièges courants à l'installation
| Symptôme | Cause | Correction |
|---|---|---|
| Déploiements bloqués après installation | Policy enforce active sur des resources existantes | Commencer en mode audit puis passer en enforce |
webhook timeout sur admission | Un seul replica Kyverno et il redémarre | Déployer en HA avec replicaCount=3 |
| PolicyReport vide | Policy en mode audit mais pas de violations | Normal - créer des ressources non conformes pour tester |
context deadline exceeded | Kyverno ne répond pas au webhook | Vérifier les ressources CPU/RAM du pod Kyverno |
Policies de validation
Bloquer les containers privilégiés
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged-containers
spec:
validationFailureAction: enforce
background: true
rules:
- name: check-privileged
match:
any:
- resources:
kinds: [Pod]
validate:
message: "Les containers privilégiés sont interdits."
pattern:
spec:
containers:
- =(securityContext):
=(privileged): "false"
Requérir des resource limits
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resource-limits
spec:
validationFailureAction: enforce
rules:
- name: check-limits
match:
any:
- resources:
kinds: [Pod]
validate:
message: "Les resource limits CPU et mémoire sont obligatoires."
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
Policies de mutation
Ajouter automatiquement des labels
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-default-labels
spec:
rules:
- name: add-env-label
match:
any:
- resources:
kinds: [Deployment]
namespaces: [production, staging]
mutate:
patchStrategicMerge:
metadata:
labels:
+(managed-by): kyverno
+(environment): "{{request.namespace}}"
Policies de génération
Créer une NetworkPolicy par namespace
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: generate-networkpolicy
spec:
rules:
- name: default-deny
match:
any:
- resources:
kinds: [Namespace]
generate:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
name: default-deny-ingress
namespace: "{{request.object.metadata.name}}"
synchronize: true
data:
spec:
podSelector: {}
policyTypes: [Ingress]
Tester les policies avec la CLI
# Installer la CLI Kyverno
curl -LO https://github.com/kyverno/kyverno/releases/latest/download/kyverno_linux_amd64.tar.gz
tar -xzf kyverno_linux_amd64.tar.gz && sudo mv kyverno /usr/local/bin/
# Tester une policy contre un manifest
kyverno apply policy.yaml --resource manifest.yaml
# Tester avec des cas de test
kyverno test ./policy-tests/
Mise à jour
helm repo update
helm upgrade kyverno kyverno/kyverno \
--namespace kyverno \
--reuse-values
kubectl rollout status deploy/kyverno -n kyverno
Troubleshooting
# Logs Kyverno
kubectl logs -n kyverno -l app.kubernetes.io/name=kyverno --tail=100
# Voir les violations de policies (mode audit)
kubectl get policyreport -A
kubectl get clusterpolicyreport
# Détail des violations
kubectl describe policyreport -n <namespace>
# Vérifier qu'une policy est bien appliquée
kubectl describe clusterpolicy <nom>
# READY: True, FAILURE ACTION: enforce/audit
Policy en READY: False
# Erreur de syntaxe dans la policy
kubectl describe clusterpolicy <nom>
# Events: voir le message d'erreur de validation de la policy
Commandes utiles
kubectl get clusterpolicy # Lister les policies cluster
kubectl get policy -A # Lister les policies par namespace
kubectl get policyreport -A # Rapports de conformité
kubectl describe clusterpolicy <nom> # Détail et état d'une policy
kyverno apply <policy.yaml> --resource <res.yaml> # Tester hors cluster
kyverno test <test-dir>/ # Exécuter des cas de test
Ressources
- Documentation officielle : https://kyverno.io/docs/
- Policy Library (100+ policies) : https://kyverno.io/policies/
- GitHub : https://github.com/kyverno/kyverno
- Releases : https://github.com/kyverno/kyverno/releases
- CLI : https://kyverno.io/docs/kyverno-cli/