Appliquer une gestion des politiques sur OVHcloud Managed Kubernetes avec Kyverno
Découvrez comment sécuriser votre OVHcloud Managed Kubernetes et déployer Kyverno pour la gestion des politiques
Objectif
Kyverno (du grec « gouverner ») est un moteur de politiques conçu spécifiquement pour Kubernetes.

Avec Kyverno, les politiques sont gérées comme des ressources Kubernetes et aucun nouveau langage n'est requis pour les écrire (contrairement à OPA Gatekeeper, qui utilise le langage de programmation Rego). Cela permet d'utiliser des outils familiers comme kubectl, git et kustomize pour gérer les politiques.
Les politiques Kyverno peuvent valider, muter et générer des ressources Kubernetes.
Kyverno s'exécute comme un contrôleur d'admission dynamique dans un cluster Kubernetes. Kyverno reçoit des rappels HTTP de webhook d'admission de validation et de mutation depuis l'API-Server de Kubernetes, et applique les politiques correspondantes pour renvoyer des résultats qui appliquent les politiques d'admission ou rejettent les requêtes.
Les politiques Kyverno peuvent cibler des ressources en fonction du type de ressource, du nom et de sélecteurs de labels. Les caractères génériques sont pris en charge dans les noms.
Les politiques de mutation et de validation peuvent être écrites sous forme d'overlays (à la manière de Kustomize).
L'application des politiques est capturée via des événements Kubernetes. Kyverno signale également les violations de politiques pour les ressources existantes.

Concrètement, lorsque vous appliquez une ressource sur le cluster Kubernetes, le manifeste envoyé à l'API Kubernetes doit passer par plusieurs étapes avant d'être créé en tant que ressource souhaitée. Deux étapes nous intéressent particulièrement : l'Admission de mutation et l'Admission de validation.

Parmi les nombreuses fonctionnalités de Kyverno, on retrouve :
- la validation et la mutation via des overlays (à la manière de Kustomize) ;
- la synchronisation des configurations entre les namespaces ;
- l'analyse des workloads existants et la génération de rapports d'audit ;
- le blocage des ressources non conformes via des contrôles d'admission, ou le signalement des violations de politiques ;
- le test des politiques et la validation des ressources avec la CLI
kyverno, dans votre pipeline CI/CD, avant de les appliquer à votre cluster.
Pour en savoir plus sur Kyverno.
Sécuriser un cluster Kubernetes est important. Grâce à Kyverno, vous pouvez vérifier plusieurs bonnes pratiques de sécurité, par exemple :
- configurer les sondes Readiness et Liveness ;
- configurer les quotas de ressources ;
- ne pas utiliser de tags d'image mutables (
latest) ; - restreindre les registres d'images ;
- configurer la sécurité des pods ;
- appliquer un RBAC précis (fine-grained).
Chez OVHcloud, nous tenons à vous fournir les meilleurs produits et services, et la sécurité est pour nous une priorité. C'est pourquoi nous avons souhaité vous faire découvrir Kyverno, qui vous aidera à sécuriser votre OVHcloud Managed Kubernetes grâce à la gestion des politiques.
Dans ce guide, vous allez :
- installer Kyverno ;
- écrire et déployer plusieurs politiques ;
- tester leur comportement.
Vous pouvez utiliser la fonction Réinitialiser le cluster dans la section Public Cloud de l' pour réinitialiser votre cluster avant de suivre ce tutoriel.
Prérequis
Ce tutoriel suppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes fonctionnel, ainsi que de connaissances de base sur son fonctionnement. Pour en savoir plus sur ces sujets, consultez la documentation Déployer une application Hello World.
En pratique
Installation de la CLI Kyverno
Vous pouvez installer la CLI via Krew ou en compilant la CLI depuis les sources, par exemple.
Pour ce tutoriel, vous allez installer la CLI depuis les sources :
Vous devriez obtenir des résultats similaires à ceux-ci :
Après l'installation, vérifiez que la CLI kyverno fonctionne :
Vous devriez obtenir un résultat similaire à celui-ci :
L'interface en ligne de commande (CLI) Kyverno est conçue pour valider et tester le comportement des politiques avant de les ajouter à un cluster.
La bonne pratique consiste donc à utiliser la CLI kyverno dans vos pipelines CI/CD afin d'accompagner le processus de rédaction des ressources et de garantir leur conformité aux standards avant leur déploiement.
Installation de Kyverno
Pour ce tutoriel, nous utilisons le chart Helm Kyverno.
Ajoutez le dépôt Helm Kyverno :
Ces commandes ajoutent le dépôt Helm Kyverno à votre dépôt local de charts Helm et mettent à jour les dépôts de charts installés :
Installez la dernière version de Kyverno avec la commande helm install :
Cette commande installe la dernière version de Kyverno et crée un nouveau namespace kyverno :
Vous pouvez également installer Kyverno en mode HA (haute disponibilité) avec la commande suivante :
helm install kyverno kyverno/kyverno -n kyverno --create-namespace --set=replicaCount=3
Vous pouvez vérifier que le pod Kyverno s'exécute correctement :
Et vous pouvez vérifier que Kyverno a installé plusieurs webhooks sur votre cluster :
Créer et déployer des politiques
Kyverno s'exécute sur votre cluster OVHcloud Managed Kubernetes, vous pouvez donc désormais créer et déployer des politiques avec les règles que vous souhaitez mettre en place dans votre cluster.
Dans ce guide, nous allons vous montrer comment créer plusieurs politiques qui vont :
- refuser le déploiement de ressources dans le namespace
default; - créer automatiquement une ConfigMap dans tous les namespaces sauf
kube-system,kube-publicetkyverno; - ajouter automatiquement un label aux Pods, Services, ConfigMaps et Secrets d'un namespace donné.
Politique 1 : interdire les déploiements dans le namespace default
Pour notre premier exemple, nous souhaitons interdire le déploiement de ressources dans le namespace default.
Pourquoi ? Parce qu'il est recommandé d'isoler les workloads/applications à l'aide de namespaces. Un namespace par projet/équipe/...
Ainsi, si plusieurs équipes déploient des applications différentes dans le namespace default, elles ne seront pas isolées.
Cette politique va valider si de nouvelles ressources peuvent être déployées ; nous allons donc créer une politique validate.
Créez une nouvelle politique dans un fichier policy-disallow-default-namespace.yaml :
L'attribut de politique validationFailureAction, qui contrôle l'admission, est défini sur enforce pour bloquer la création ou la mise à jour de ressources lorsqu'une ressource n'est pas conforme.
Utiliser la valeur par défaut audit signalera les violations (dans un PolicyReport ou un ClusterPolicyReport) mais ne bloquera pas les requêtes.
Pour déployer la politique Kyverno dans le cluster, exécutez la commande suivante afin d'appliquer le fichier YAML :
Après avoir appliqué la politique, vérifiez qu'elle a bien été appliquée sur le cluster :
Avec l'installation de Kyverno, de nouvelles CRD ont été ajoutées. Celle qui nous intéresse est le nouveau type de ressource ClusterPolicy. Ainsi, pour lister, afficher, modifier et supprimer les politiques Kyverno, vous pouvez exécuter la commande kubectl avec le type d'objet ressource ClusterPolicy.
Ex. : kubectl get clusterpolicy ou kubectl get cpol avec le nom court.
Vous allez maintenant essayer de déployer une application simple dans le namespace default.
Pour cela, créez un fichier nommé my-pod.yaml avec le contenu suivant :
Appliquez-le sans définir de namespace (le namespace est default par défaut) :
Parfait, vous ne pouvez plus déployer de Pod/Deployment/ReplicaSet/Job/StatefulSet dans le namespace default.
Politique 2 : créer une ConfigMap dans tous les namespaces sauf kube-system, kube-public et kyverno
Pour notre second exemple, nous souhaitons créer une politique generate qui créera une nouvelle ConfigMap nommée zk-kafka-address dans tous les nouveaux namespaces, sauf kube-system, kube-public et kyverno.
Créez une nouvelle politique dans un fichier policy-generate-cm.yaml :
Lorsque l'attribut synchronize est défini sur true, les modifications sont synchronisées avec les ressources générées.
Ainsi, dans notre cas, si vous modifiez les valeurs de ZK_ADDRESS et KAFKA_ADDRESS par exemple, toutes les ConfigMaps créées seront mises à jour.
Pour déployer la politique Kyverno dans le cluster, exécutez la commande suivante afin d'appliquer le fichier YAML :
Après avoir appliqué la politique, vérifiez qu'elle a bien été appliquée sur le cluster :
La règle generate est déclenchée lors de l'opération API CREATE, donc dans le cas de cette politique, lors de la création d'un nouveau namespace.
Pour tester le comportement de cette politique, vous allez créer un nouveau namespace test2 :
Puis vérifiez que la nouvelle ConfigMap apparaît dans le nouveau namespace test2 :
Vous devriez obtenir des résultats similaires à ceux-ci :
Comme vous pouvez le constater, la ConfigMap zk-kafka-address a bien été créée dans le nouveau namespace test2.
Politique 3 : ajouter le label app: my-awesome-app aux Pods, Services, ConfigMaps et Secrets d'un namespace donné
L'objectif de cette politique est d'ajouter automatiquement le label app=my-awesome-app aux Pods, Services, ConfigMaps et Secrets du namespace team-a.
Pour cela, nous allons vous montrer comment déployer une politique mutate.
La mutation d'une ressource intervient avant sa validation ; les règles de validation ne doivent donc pas contredire les modifications effectuées par la section de mutation.
Créez une nouvelle politique dans un fichier policy-add-label.yaml :
Pour déployer la politique Kyverno dans le cluster, exécutez la commande suivante afin d'appliquer le fichier YAML :
Après avoir appliqué la politique, vérifiez qu'elle a bien été appliquée sur le cluster :
Vous pouvez maintenant créer un nouveau namespace team-a, y déployer un nouveau Pod, puis vérifier que le nouveau label a bien été ajouté automatiquement :
Plus haut dans ce guide, nous vous avons montré la création d'un Pod dans un fichier nommé my-pod.yaml ; vous pouvez donc le réutiliser à cette étape.
Vous devriez obtenir les résultats suivants :
Débogage/validation
Plus haut dans ce guide, nous vous avons montré comment installer la CLI kyverno. Avec cette CLI, vous pouvez appliquer, tester et valider des politiques.
Dans ce tutoriel, nous voulons vous montrer que cette CLI est idéale pour un usage sur votre machine locale (pour des usages de développement/test) et dans vos pipelines CI/CD, afin de tester et valider que les politiques que vous souhaitez déployer en production sont correctes.
Vous pouvez par exemple vérifier que les politiques créées sont valides avec la commande kyverno validate :
Vous devriez obtenir des résultats similaires à ceux-ci :
Dépannage
Si vous rencontrez un problème avec Kyverno, par exemple si vous avez déployé une politique et ne comprenez pas pourquoi elle ne fonctionne pas, vous pouvez consulter la page de dépannage de Kyverno.
Et ensuite ?
Vous disposez désormais d'une gestion des politiques sur votre cluster Kubernetes, et vous avez déployé plusieurs politiques pour tester le comportement de Kyverno.
Pour voir davantage d'exemples de politiques, consultez le dépôt de politiques Kyverno. Ce dépôt contient des politiques Kyverno pour un large éventail d'usages sur diverses ressources et sujets de l'écosystème Kubernetes.
Si vous avez des questions ou rencontrez des difficultés avec Kyverno, vous pouvez également consulter la communauté Slack Kyverno.
Disposer d'une gestion des politiques est une bonne pratique à suivre. Cela vous aidera à garder votre cluster propre et sécurisé.
Un prochain tutoriel vous présentera une nouvelle méthode pour sécuriser vos clusters OVHcloud Managed Kubernetes.
Suppression (nettoyage)
Pour commencer, supprimez les ClusterPolicies déployées dans ce guide :
Pour désinstaller Kyverno, puisque vous l'avez installé via Helm, vous pouvez utiliser la commande helm uninstall afin de supprimer le chart Helm installé de Kyverno :
Aller plus loin
-
Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.
-
Échangez avec notre communauté d'utilisateurs.