Sécurité

Kyverno

Policy engine CNCF Graduated natif Kubernetes - validation, mutation, génération de ressources via policies YAML. Pas de DSL, admission controller intégré.

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

ComposantValeur
Langage des policiesYAML natif Kubernetes (CRDs ClusterPolicy / Policy)
Opérationsvalidate, mutate, generate, verifyImages
Modesenforce (bloque) ou audit (signale sans bloquer)
ReportingPolicyReport / ClusterPolicyReport (CRDs standards)
CLIkyverno pour tester les policies hors cluster

Concepts clés

ConceptDescription
ClusterPolicyPolicy appliquée à tout le cluster
PolicyPolicy limitée à un namespace
validateBloque ou signale les ressources qui ne respectent pas les règles
mutateModifie les ressources à l'admission (ajout labels, annotations…)
generateCrée automatiquement des ressources associées (ex: NetworkPolicy par namespace)
verifyImagesVérifie les signatures d'images (Cosign/Sigstore)
PolicyReportRapport de conformité généré par Kyverno (CRD standard)

Prérequis

RessourceValeur
Kubernetes1.25+
Helm3.x
Droitscluster-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ômeCauseCorrection
Déploiements bloqués après installationPolicy enforce active sur des resources existantesCommencer en mode audit puis passer en enforce
webhook timeout sur admissionUn seul replica Kyverno et il redémarreDéployer en HA avec replicaCount=3
PolicyReport videPolicy en mode audit mais pas de violationsNormal - créer des ressources non conformes pour tester
context deadline exceededKyverno ne répond pas au webhookVé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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic