
👀 Un sanitizer de ressources de cluster Kubernetes
Popeye est un utilitaire qui analyse les clusters Kubernetes en direct et signale les problèmes potentiels liés aux ressources et configurations déployées. À mesure que le paysage Kubernetes s'agrandit, il devient difficile pour un humain de suivre la multitude de manifestes et de politiques qui orchestrent un cluster. Popeye scanne votre cluster en fonction de ce qui est déployé, et non de ce qui se trouve sur le disque. En nettoyant votre cluster, il détecte les mauvaises configurations, les ressources obsolètes et vous aide à vous assurer que les bonnes pratiques sont en place, évitant ainsi de futurs maux de tête. Il vise à réduire la surcharge cognitive à laquelle on est confronté lors de l'exploitation d'un cluster Kubernetes dans la nature. De plus, si votre cluster utilise un metric-server, il signale les éventuelles sous/sur-allocations de ressources et tente de vous avertir si votre cluster manque de capacité.
Popeye est un outil en lecture seule, il n'altère en aucune façon vos ressources Kubernetes !
Vous pouvez exporter le rapport d'analyse au format HTML.
Popeye publie des métriques Prometheus. Nous avons fourni un exemple de tableau de bord Popeye pour vous aider à démarrer dans ce dépôt.
Popeye est disponible sur les plateformes Linux, OSX et Windows.
Les binaires pour Linux, Windows et Mac sont disponibles sous forme d'archives dans la page des versions.
Pour OSX/Unix avec Homebrew/LinuxBrew ```shell brew install derailed/popeye/popeye
Utilisation de go install
go install github.com/derailed/popeye@latest
Construction à partir des sources Popeye a été construit avec go 1.21+. Pour construire Popeye à partir des sources, vous devez :
Clonez le dépôt
Ajoutez la commande suivante dans votre fichier go.mod
replace (
github.com/derailed/popeye => MY_POPEYE_CLONED_GIT_REPO
)
Compilez et exécutez l'exécutable
go run main.go
Recette rapide pour les impatients : ```shell
git clone https://github.com/derailed/popeye cd popeye
make build
popeye
Popeye utilise le mode terminal 256 couleurs. Sur les systèmes `Nix, assurez-vous que TERM est défini en conséquence.
export TERM=xterm-256color
Vous pouvez utiliser Popeye en mode ouvert ou en utilisant un fichier de configuration spinach yaml pour ajuster vos linters. Les détails sur le fichier de configuration Popeye sont ci-dessous.```shell
popeye version
popeye
fred namespacepopeye -n fred
popeye -A
popeye -f spinach.yaml
popeye --context olive
popeye -n ns1 -s pod,svc --logs none
popeye -n ns1 --logs /tmp/fred.log -v4
popeye help
---
## Analyseurs
Popeye scanne votre cluster à la recherche des meilleures pratiques et des problèmes potentiels.
Actuellement, Popeye ne vérifie qu'un ensemble donné de ressources Kubernetes sélectionnées.
D'autres arriveront bientôt !
Nous espérons que les amis de Kubernetes contribueront à rendre Popeye encore meilleur.
L'objectif des analyseurs est de détecter les mauvaises configurations, par exemple
les incompatibilités de ports, les ressources mortes ou inutilisées, l'utilisation des métriques,
les sondes, les images de conteneurs, les règles RBAC, les ressources nues, etc...
Popeye n'est pas un autre outil d'analyse statique. Il s'exécute et inspecte les ressources Kubernetes sur
des clusters en direct et analyse les ressources telles qu'elles sont en production !
Voici une liste de certains des analyseurs disponibles :
| | Ressource | Vérifications | Alias |
|----|--------------------------|-------------------------------------------------------------------------------|-------------|
| 🛀 | Nœud | | no |
| | | Conditions, par exemple non prêt, manque de mémoire/disque, réseau, pids, etc | |
| | | Tolérances de pod référençant les teintures de nœud | |
| | | Métriques d'utilisation CPU/MEM, déclenche si dépassement des limites (défaut 80% CPU/MEM) | |
| 🛀 | Espace de noms | | ns |
| | | Inactif | |
| | | Espaces de noms morts | |
| 🛀 | Pod | | po |
| | | Statut du pod | |
| | | Statuts des conteneurs | |
| | | Présence du ServiceAccount | |
| | | CPU/MEM sur les conteneurs au-dessus d'une limite définie (défaut 80% CPU/MEM)| |
| | | Image de conteneur sans tag | |
| | | Image de conteneur utilisant le tag `latest` | |
| | | Présence des demandes/limites de ressources | |
| | | Présence des sondes de vivacité/préparation | |
| | | Ports nommés et leurs références | |
| 🛀 | Service | | svc |
| | | Présence des points de terminaison | |
| | | Correspondance des étiquettes de pods | |
| | | Ports nommés et leurs références | |
| 🛀 | ServiceAccount | | sa |
| | | Inutilisé, détecte les SA potentiellement inutilisés | |
| 🛀 | Secrets | | sec |
| | | Inutilisé, détecte les secrets ou clés associées potentiellement inutilisés | |
| 🛀 | ConfigMap | | cm |
| | | Inutilisé, détecte les cm ou clés associées potentiellement inutilisés | |
| 🛀 | Déploiement | | dp, deploy |
| | | Inutilisé, validation du modèle de pod, utilisation des ressources | |
| 🛀 | StatefulSet | | sts |
| | | Inutilisé, validation du modèle de pod, utilisation des ressources | |
| 🛀 | DaemonSet | | ds |
| | | Inutilisé, validation du modèle de pod, utilisation des ressources | |
| 🛀 | Volume persistant | | pv |
| | | Inutilisé, vérifier le volume lié ou l'erreur de volume | |
| 🛀 | Réclamation de volume persistant | | pvc |
| | | Inutilisé, vérifier la liaison ou l'erreur de montage de volume | |
| 🛀 | Autoscaler horizontal de pods | | hpa |
| | | Inutilisé, Utilisation, Vérifications des pics max | |
| 🛀 | Budget de perturbation de pods | | pdb |
| | | Inutilisé, Vérifier la configuration de minAvailable | |
| 🛀 | Rôle de cluster | | cr |
| | | Inutilisé | |
| 🛀 | Liaison de rôle de cluster | | crb |
| | | Inutilisé | |
| 🛀 | Rôle | | ro |
| | | Inutilisé | |
| 🛀 | Liaison de rôle | | rb |
| | | Inutilisé | |
| 🛀 | Ingress | | ing |
| | | Valide | |
| 🛀 | Politique réseau | | np |
| | | Valide, Obsolète, Gardée | |
| 🛀 | Politique de sécurité de pods | | psp |
| | | Valide | |
| 🛀 | CronJob | | cj |
| | | Valide, Suspendu, Exécutions | |
| 🛀 | Tâche | | job |
| | | Vérifications du pod | |
| 🛀 | Classe de passerelle | | gwc |
| | | Valide, Inutilisé | |
| 🛀 | Passerelle | | gw |
| | | Valide, Inutilisé | |
| 🛀 | Route HTTP | | gwr |
| | | Valide, Inutilisé | |
Vous pouvez également voir la [liste complète des codes](https://github.com/derailed/popeye/blob/HEAD/docs/codes.md)
---
## Enregistrement des analyses
Pour enregistrer le rapport Popeye dans un fichier, passez l'option `--save` à la commande.
Par défaut, il créera un répertoire temporaire et y stockera votre rapport d'analyse.
Le chemin du répertoire temporaire sera affiché sur STDOUT.
Si vous avez besoin de spécifier le répertoire de sortie du rapport,
vous pouvez utiliser la variable d'environnement `POPEYE_REPORT_DIR`. Le chemin final sera `<POPEYE_REPORT_DIR>/<cluster>/<contexte>`.
Par défaut, le nom du fichier de sortie suit le format suivant : `lint_<nom-cluster>_<temps-UnixNano>.<extension-sortie>` (ex. : "lint-mycluster-1594019782530851873.html").
Si vous souhaitez également spécifier le nom du fichier de sortie du rapport, vous pouvez passer l'option `--output-file` avec le nom de fichier souhaité comme paramètre.
Exemple pour enregistrer le rapport dans le répertoire de travail :```shell
POPEYE_REPORT_DIR=$(pwd) popeye --save
Exemple pour enregistrer le rapport dans le répertoire de travail au format HTML sous le nom « report.html » :```shell POPEYE_REPORT_DIR=$(pwd) popeye --save --out html --output-file report.html
### Enregistrer dans un stockage d'objets S3
Alternativement, vous pouvez envoyer les rapports générés vers un stockage d'objets AWS S3 ou Minio en fournissant le drapeau `--s3-bucket`.
Pour les paramètres, vous devez fournir le nom du compartiment S3 où vous souhaitez stocker le rapport.
Pour enregistrer le rapport dans un sous-répertoire du compartiment, fournissez le paramètre du compartiment sous la forme `bucket/path/to/report`.
Exemple pour enregistrer le rapport dans S3 :```shell
# AWS S3
# NOTE: You must provide env vars for AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
# This will create bucket my-popeye if not present and upload a popeye json report to /fred/scan.json
popeye --s3-bucket s3://my-popeye/fred --s3-region us-west-2 --out json --save --output-file scan.json
# Minio Object Store
# NOTE: You must provide env vars for AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY and a minio server URI
# This will create bucket my-popeye if not present and upload a popeye json report to /fred/scan.json
popeye --s3-bucket minio://my-popeye/fred --s3-region us-east --s3-endpoint localhost:9000 --out json --save --output-file scan.json
Vous pouvez également exécuter Popeye dans un conteneur en l'exécutant directement depuis le dépôt docker officiel sur Quay.
La commande par défaut lorsque vous exécutez le conteneur docker est popeye, vous pouvez donc personnaliser l'analyse en utilisant les indicateurs CLI pris en charge.
Pour accéder à vos clusters, mappez votre répertoire kubeconfig local dans le conteneur avec -v :```shell
docker run --rm -it -v $HOME/.kube:/root/.kube quay.io/derailed/popeye --context foo -n bar
Exécuter la commande docker ci-dessus avec `--rm` signifie que le conteneur est supprimé lorsque Popeye se termine.
Lorsque vous utilisez `--save`, il écrit dans /tmp dans le conteneur puis supprime le conteneur lorsque Popeye se termine, ce qui signifie que vous perdez la sortie ;(
Pour contourner ce problème, mappez /tmp vers /tmp du conteneur.
> REMARQUE : Vous pouvez remplacer l'emplacement du répertoire de sortie par défaut en définissant la variable d'environnement `POPEYE_REPORT_DIR`.```shell
docker run --rm -it \
-v $HOME/.kube:/root/.kube \
-e POPEYE_REPORT_DIR=/tmp/popeye \
-v /tmp:/tmp \
quay.io/derailed/popeye --context foo -n bar --save --output-file my_report.txt
# Docker has exited, and the container has been deleted, but the file
# is in your /tmp directory because you mapped it into the container
cat /tmp/popeye/my_report.txt
<snip>
Popeye peut générer des rapports de linting dans divers formats. Vous pouvez utiliser l'option -o en ligne de commande et choisir votre poison.
Popeye peut publier des métriques Prometheus directement depuis une analyse. Vous aurez besoin d'accéder à un pushgateway Prometheus et d'avoir des identifiants.
NOTE! Ceci est susceptible de changer en fonction des retours des utilisateurs et de l'usage!!
Pour publier des métriques, des arguments CLI supplémentaires doivent être présents.```shell
popeye --push-gtwy-url http://localhost:9091
popeye -o html --save --push-gtwy-url http://localhost:9091
### Métriques PopProm
Les métriques Prometheus suivantes de Popeye sont publiées :
* `popeye_severity_total` [gauge] suit les différents comptages basés sur la sévérité.
* `popeye_code_total` [gauge] suit les comptages par codes de linter de Popeye.
* `popeye_linter_tally_total` [gauge] suit les comptages par linter.
* `popeye_report_errors_total` [gauge] suit les totaux d'erreurs d'analyse.
* `popeye_cluster_score` [gauge] suit les scores des rapports d'analyse.
### PopGraf
Un exemple de tableau de bord [Grafana](https://grafana.com) se trouve dans ce dépôt pour vous aider à démarrer.
> NOTE! Travail en cours, n'hésitez pas à contribuer si vous avez des compétences en UX/grafana/promql.
---
## SpinachYAML
Un fichier de configuration YAML spinach peut être spécifié via l'option `-f` pour configurer davantage les linters. Ce fichier peut spécifier le seuil d'utilisation des conteneurs et des configurations de linter spécifiques ainsi que des ressources et des codes qui seront exclus du linter.
> NOTE! Ce fichier changera au fur et à mesure que Popeye évolue !
Sous la clé `excludes`, vous pouvez configurer l'exclusion de certaines ressources ou codes de linter.
Les linters de Popeye sont nommés d'après les noms des ressources k8s.
Par exemple, le linter PodDisruptionBudget est nommé `poddisruptionbudgets` et scanne `policy/v1/poddisruptionbudgets`.
> NOTE! Le linter utilise la forme plurielle du `kind` de la ressource et tout est écrit en minuscules.
Un nom de ressource pleinement qualifié, aussi appelé `FQN`, est utilisé dans le fichier spinach pour identifier un nom de ressource, c'est-à-dire `namespace/resource_name`.
Par exemple, le FQN d'un pod nommé `fred-1234` dans le namespace `blee` sera `blee/fred-1234`. Cela permet de différencier `fred/p1` et `blee/p1`.
Pour les ressources à l'échelle du cluster, le FQN est équivalent au nom.
Les règles d'exclusion peuvent être soit une correspondance exacte de chaîne, soit une expression régulière. Dans ce dernier cas, l'expression régulière doit être spécifiée via le préfixe `rx:`.
> NOTE! Soyez prudent avec votre regex car des ressources supplémentaires pourraient être exclues du rapport avec une règle regex *lâche*.
> Lorsque vos ressources de cluster changent, cela pourrait conduire à des analyses sous-optimales.
> Ainsi, nous recommandons d'exécuter Popeye `wide open` de temps en temps pour vous assurer de détecter tout nouveau problème qui pourrait être apparu dans vos clusters…
Voici un exemple de fichier spinach tel qu'il se présente dans cette version.
Il existe un fichier spinach plus complet basé sur eks et aks dans ce dépôt sous `spinach`.
(Au fait : pour les nouveaux arrivants dans le projet, cela pourrait être un excellent moyen de contribuer en ajoutant des PRs de fichiers spinach spécifiques à un cluster...)```yaml
# spinach.yaml
# A Popeye sample configuration file
popeye:
# Checks resources against reported metrics usage.
# If over/under these thresholds a linter warning will be issued.
# Your cluster must run a metrics-server for these to take place!
allocations:
cpu:
underPercUtilization: 200 # Checks if cpu is under allocated by more than 200% at current load.
overPercUtilization: 50 # Checks if cpu is over allocated by more than 50% at current load.
memory:
underPercUtilization: 200 # Checks if mem is under allocated by more than 200% at current load.
overPercUtilization: 50 # Checks if mem is over allocated by more than 50% usage at current load.
# Excludes excludes certain resources from Popeye scans
excludes:
# [NEW!] Global exclude resources and codes globally of any linters.
global:
fqns: [rx:^kube-] # => excludes all resources in kube-system, kube-public, etc..
# [NEW!] Exclude resources for all linters matching these labels
labels:
app: [bozo, bono] #=> exclude any resources with labels matching either app=bozo or app=bono
# [NEW!] Exclude resources for all linters matching these annotations
annotations:
fred: [blee, duh] # => exclude any resources with annotations matching either fred=blee or fred=duh
# [NEW!] Exclude scan codes globally via straight codes or regex!
codes: ["300", "206", "rx:^41"] # => exclude issue codes 300, 206, 410, 415 (Note: regex match!)
# [NEW!] Configure individual resource linters
linters:
# Configure the namespaces linter for v1/namespaces
namespaces:
# [NEW!] Exclude these codes for all namespace resources straight up or via regex.
codes: ["100", "rx:^22"] # => exclude codes 100, 220, 225, ...
# [NEW!] Excludes specific namespaces from the scan
instances:
- fqns: [kube-public, kube-system] # => skip ns kube-pulbic and kube-system
- fqns: [blee-ns]
codes: [106] # => skip code 106 for namespace blee-ns
# Skip secrets in namespace bozo.
secrets:
instances:
- fqns: [rx:^bozo]
# Configure the pods linter for v1/pods.
pods:
instances:
# [NEW!] exclude all pods matching these labels.
- labels:
app: [fred,blee] # Exclude codes 102, 105 for any pods with labels app=fred or app=blee
codes: [102, 105]
resources:
# Configure node resources.
node:
# Limits set a cpu/mem threshold in % ie if cpu|mem > limit a lint warning is triggered.
limits:
# CPU checks if current CPU utilization on a node is greater than 90%.
cpu: 90
# Memory checks if current Memory utilization on a node is greater than 80%.
memory: 80
# Configure pod resources
pod:
# Restarts check the restarts count and triggers a lint warning if above threshold.
restarts: 3
# Check container resource utilization in percent.
# Issues a lint warning if about these threshold.
limits:
cpu: 80
memory: 75
# [New!] overrides code severity
overrides:
# Code specifies a custom severity level ie critical=3, warn=2, info=1
- code: 206
severity: 1
# Configure a list of allowed registries to pull images from.
# Any resources not using the following registries will be flagged!
registries:
- quay.io
- docker.io
Popeye est conteneurisé et peut être exécuté directement dans vos clusters Kubernetes en tant que tâche unique ou CronJob.
Voici un exemple de configuration, veuillez modifier selon vos besoins/souhaits. Les manifests correspondants se trouvent dans le répertoire k8s de ce dépôt.```shell kubectl apply -f k8s/popeye
## KitPloitTools
Maîtrisez l'art de la cybersécurité en un seul endroit. Améliorez votre expertise avec des outils essentiels, gardez une longueur d'avance sur les menaces émergentes et explorez les dernières innovations du monde de la sécurité sur [KitPloit](https://www.kitploit.com/).```yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: popeye
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: popeye
namespace: popeye
spec:
schedule: "* */1 * * *" # Fire off Popeye once an hour
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
serviceAccountName: popeye
restartPolicy: Never
containers:
- name: popeye
image: derailed/popeye:vX.Y.Z
imagePullPolicy: IfNotPresent
args:
- -o
- yaml
- --force-exit-zero
resources:
limits:
cpu: 500m
memory: 100Mi
La valeur --force-exit-zero doit être définie. Sinon, les pods se retrouveront dans un état d'erreur.
NOTE ! Popeye se termine avec un code d'erreur non nul si des erreurs de lint sont détectées.
Pour que Popeye puisse faire son travail, l'utilisateur connecté doit disposer de suffisamment d'oomph RBAC pour obtenir/lister les ressources mentionnées ci-dessus.
Exemples de règles RBAC pour Popeye (veuillez noter qu'elles sont susceptibles d'être modifiées.)
NOTE ! Veuillez les vérifier et les adapter selon les politiques de votre cluster.```yaml
apiVersion: v1 kind: ServiceAccount metadata: name: popeye namespace: popeye
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: popeye rules:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: popeye subjects:
---
## Morphologie du rapport
Le rapport de lint affiche chaque groupe de ressources scanné et leurs problèmes potentiels.
Le rapport est codé par couleur/emoji selon les niveaux de sévérité du linter :
| Niveau | Icône | Jurassic | Couleur | Description |
|--------|-------|----------|-----------|-------------------------|
| OK | ✅ | OK | Vert | Heureux ! |
| Info | 🔊 | I | BleuVert | Pour info |
| Avertissement | 😱 | W | Jaune | Problème potentiel |
| Erreur | 💥 | E | Rouge | Action requise |
La section d'en-tête de chaque ressource Kubernetes scannée fournit un nombre récapitulatif
pour chacune des catégories ci-dessus.
La section Résumé fournit un **Score Popeye** basé sur le passage du linter sur le cluster donné.
---
## Problèmes connus
Cette version initiale est fragile. Popeye risque fort de planter quand…
* Vous utilisez des versions plus anciennes de Kubernetes. Popeye fonctionne mieux avec Kubernetes 1.25.X.
* Vous n'avez pas assez de puissance RBAC pour gérer votre cluster (voir la section RBAC)
---
## Avertissement
Ceci est un travail en cours ! Si la communauté Kubernetes montre suffisamment d'intérêt,
nous améliorerons selon vos recommandations/contributions.
Et si vous appréciez cet effort, faites-le nous savoir aussi !
---
## Bravo les filles/garçons !
Popeye repose sur de nombreux projets et bibliothèques open source. Nos *sincères*
remerciements à tous les contributeurs OSS qui travaillent nuits et week-ends
pour concrétiser ce projet !
### Coordonnées
1. **Email** : [email protected]
2. **Twitter** : [@kitesurfer](https://twitter.com/kitesurfer?lang=en)
---
<img src="https://raw.githubusercontent.com/derailed/popeye/master/assets/imhotep_logo.png" width="32" height="auto"/> © 2025 Imhotep Software LLC.
Tous les documents sont sous licence [Apache v2.0](http://www.apache.org/licenses/LICENSE-2.0)
| Format | Description | Default | Credits |
|---|
| standard | La sortie complète avec icônes et couleurs | oui | |
| jurassic | Sans icônes ni couleurs, comme en 1979 | ||
| yaml | En YAML | ||
| html | En HTML | ||
| json | En JSON | ||
| junit | Pour les mélancoliques du Java | ||
| prometheus | Exporte le rapport sous forme de métriques Prometheus | dardanel | |
| score | Retourne un score unique de linting du cluster (0-100) | kabute |