Aller au contenu
Conteneurs & Orchestration medium

Pluto : détecter les API Kubernetes obsolètes

21 min de lecture

logo pluto

Ce guide vous permet de détecter en quelques secondes les API Kubernetes dépréciées dans vos manifests YAML, charts Helm et clusters en production. Vous apprendrez à scanner vos fichiers locaux, analyser vos releases Helm déployées et anticiper les problèmes avant une mise à jour de Kubernetes. Pluto est un outil indispensable pour éviter les échecs de déploiement lors des montées de version.

  • Comprendre pourquoi Kubernetes déprécie certaines API
  • Installer Pluto sur Linux, macOS ou Windows
  • Scanner des manifests YAML pour détecter les API obsolètes
  • Analyser les releases Helm d’un cluster en production
  • Cibler une version précise de Kubernetes pour anticiper les migrations
  • Intégrer Pluto dans vos pipelines CI/CD

Prérequis : connaissance de base de Kubernetes et des manifests YAML. Un cluster Kubernetes n’est pas obligatoire pour les premiers exemples.

Pluto est un outil en ligne de commande développé par Fairwinds qui détecte automatiquement les versions d’API Kubernetes dépréciées ou supprimées. Son nom fait référence à la planète naine déclassée du système solaire : tout comme Pluton a perdu son statut de planète, certaines API Kubernetes perdent leur statut de version supportée.

Concrètement, Pluto analyse trois types de sources :

  • Fichiers locaux : vos manifests YAML stockés dans un dépôt Git
  • Charts Helm : avant de les déployer, pour éviter les mauvaises surprises
  • Clusters en production : les releases Helm déjà déployées et les ressources actives

L’outil produit un rapport clair indiquant quelles ressources utilisent des API obsolètes, quand elles ont été dépréciées, quand elles seront supprimées et par quoi les remplacer.

SituationSans PlutoAvec Pluto
Mise à jour K8sÉchec surprise du déploiementAnticipation des changements nécessaires
Audit des manifestsRecherche manuelle dans les fichiersScan automatique en quelques secondes
Pipeline CI/CDAPI obsolète déployée en productionBlocage préventif avant le déploiement
DocumentationConsultation du changelog KubernetesRapport détaillé avec versions concernées

Kubernetes évolue rapidement : environ trois versions majeures par an. Cette évolution implique des changements d’API pour améliorer la stabilité, les performances et la sécurité. Comprendre ce cycle vous aide à mieux utiliser Pluto.

Une API Kubernetes suit généralement ce parcours :

  1. Introduction en alpha (v1alpha1)

    L’API est expérimentale, susceptible de changer sans préavis. Elle n’est pas activée par défaut et ne doit pas être utilisée en production.

  2. Passage en beta (v1beta1)

    L’API est considérée comme stable mais peut encore évoluer. Kubernetes la garde généralement pendant 9 mois minimum avant dépréciation.

  3. Version stable (v1)

    L’API est mature et garantie sur le long terme. Les changements incompatibles sont rares et toujours annoncés longtemps à l’avance.

  4. Dépréciation de l’ancienne version

    Kubernetes annonce que l’ancienne API (beta) ne sera plus maintenue. Elle reste fonctionnelle mais génère des avertissements.

  5. Suppression définitive

    L’API supprimée n’est plus reconnue par l’API server. Les manifests qui l’utilisent échouent immédiatement.

L’histoire de Kubernetes est jalonnée de dépréciations qui ont causé des problèmes à de nombreuses équipes :

Version K8sAPI suppriméeImpact
v1.16extensions/v1beta1 pour DeploymentDes milliers de Deployments cassés
v1.22networking.k8s.io/v1beta1 pour IngressMigration massive vers v1
v1.25policy/v1beta1 pour PodSecurityPolicyRemplacement par Pod Security Standards
v1.32flowcontrol.apiserver.k8s.io/v1beta2Migration vers v1beta3

C’est lors du passage de la v1.16 que j’ai personnellement découvert l’importance d’un outil comme Pluto. Des centaines de Deployments avaient cessé de fonctionner car ils utilisaient encore extensions/v1beta1 au lieu de apps/v1. Cette expérience m’a convaincu qu’un scan automatique était indispensable.

Pluto est disponible sous forme de binaire autonome pour Linux, macOS et Windows. L’installation prend moins d’une minute quelle que soit la méthode choisie.

La méthode la plus simple utilise le téléchargement direct du binaire :

Fenêtre de terminal
# Télécharger la dernière version
wget https://github.com/FairwindsOps/pluto/releases/download/v5.22.7/pluto_5.22.7_linux_amd64.tar.gz
# Extraire l'archive
tar -xzf pluto_5.22.7_linux_amd64.tar.gz
# Installer le binaire
sudo install pluto /usr/local/bin/
# Vérifier l'installation
pluto version

Résultat attendu :

Version:5.22.7 Commit:d3b74eba1b1a24e614b6daef9c613d5203c2b234

Pour les processeurs ARM (Raspberry Pi, Mac M1 sous Linux), utilisez pluto_5.22.7_linux_arm64.tar.gz.

Commençons par l’usage le plus courant : scanner un répertoire contenant des manifests YAML. C’est le cas typique d’un dépôt Git Infrastructure-as-Code.

Pour illustrer les exemples, créons quelques manifests avec des API dépréciées :

Fenêtre de terminal
# Créer un répertoire de test
mkdir -p /tmp/pluto-demo/manifests
# Créer un Ingress avec une ancienne API (dépréciée en v1.19, supprimée en v1.22)
cat > /tmp/pluto-demo/manifests/ingress.yaml << 'EOF'
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: mon-application
namespace: production
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
backend:
serviceName: app-service
servicePort: 80
EOF
# Créer un Deployment avec une très ancienne API (dépréciée en v1.9, supprimée en v1.16)
cat > /tmp/pluto-demo/manifests/deployment.yaml << 'EOF'
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ancien-deployment
namespace: production
spec:
replicas: 3
template:
metadata:
labels:
app: legacy
spec:
containers:
- name: app
image: nginx:1.27
EOF

Ces fichiers représentent un cas réel : des manifests créés il y a quelques années et jamais mis à jour.

La commande detect-files analyse tous les fichiers YAML d’un répertoire :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/

Résultat :

NAME KIND VERSION REPLACEMENT REMOVED DEPRECATED REPL AVAIL
ancien-deployment Deployment extensions/v1beta1 apps/v1 true true true
mon-application Ingress networking.k8s.io/v1beta1 networking.k8s.io/v1 true true true

Le tableau indique clairement :

  • NAME : le nom de la ressource concernée
  • KIND : le type de ressource Kubernetes
  • VERSION : l’API actuellement utilisée (obsolète)
  • REPLACEMENT : l’API à utiliser à la place
  • REMOVED : true si l’API a déjà été supprimée
  • DEPRECATED : true si l’API est dépréciée
  • REPL AVAIL : true si le remplacement est disponible dans la version cible

Dans notre exemple, les deux ressources sont marquées REMOVED: true. Cela signifie que ces manifests ne fonctionneront pas sur un cluster Kubernetes récent (v1.22+).

Pour corriger ces fichiers, il faut remplacer l’API par celle indiquée dans la colonne REPLACEMENT :

  • extensions/v1beta1apps/v1 pour le Deployment
  • networking.k8s.io/v1beta1networking.k8s.io/v1 pour l’Ingress

Pluto propose plusieurs formats de sortie adaptés à différents usages : affichage terminal, intégration dans des scripts ou génération de rapports.

Le format wide ajoute des colonnes avec les numéros de version précis :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/ -o wide

Résultat :

NAME NAMESPACE KIND VERSION REPLACEMENT DEPRECATED DEPRECATED IN REMOVED REMOVED IN REPL AVAIL REPL AVAIL IN
ancien-deployment production Deployment extensions/v1beta1 apps/v1 true v1.9.0 true v1.16.0 true v1.9.0
mon-application production Ingress networking.k8s.io/v1beta1 networking.k8s.io/v1 true v1.19.0 true v1.22.0 true v1.19.0

Ce format montre exactement dans quelle version de Kubernetes chaque API a été dépréciée (DEPRECATED IN) et supprimée (REMOVED IN). Très utile pour planifier une migration.

Le format JSON est idéal pour l’intégration dans des scripts ou des outils d’analyse :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/ -o json | jq .

Résultat :

{
"items": [
{
"name": "ancien-deployment",
"filePath": "/tmp/pluto-demo/manifests/deployment.yaml",
"namespace": "production",
"api": {
"version": "extensions/v1beta1",
"kind": "Deployment",
"deprecated-in": "v1.9.0",
"removed-in": "v1.16.0",
"replacement-api": "apps/v1",
"replacement-available-in": "v1.9.0",
"component": "k8s"
},
"deprecated": true,
"removed": true,
"replacementAvailable": true
}
],
"target-versions": {
"k8s": "v1.25.0"
}
}

La sortie JSON inclut le chemin du fichier (filePath), ce qui permet d’automatiser les corrections.

FormatOptionUsage
Normal-o normalAffichage par défaut, compact
Wide-o wideToutes les colonnes avec versions
JSON-o jsonIntégration scripts, API
YAML-o yamlFormat Kubernetes natif
CSV-o csvExport tableur, rapports
Markdown-o markdownDocumentation, issues Git

Exemple de sortie Markdown pour un rapport GitLab/GitHub :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/ -o markdown
| NAME | NAMESPACE | KIND | VERSION | REPLACEMENT | DEPRECATED | REMOVED |
|--------------------|------------|------------|----------------------|----------------------|------------|---------|
| ancien-deployment | production | Deployment | extensions/v1beta1 | apps/v1 | true | true |
| mon-application | production | Ingress | networking.k8s.io/v1beta1 | networking.k8s.io/v1 | true | true |

Par défaut, Pluto considère Kubernetes v1.25.0 comme version cible. Pour planifier une mise à jour vers une version spécifique, utilisez l’option --target-versions.

Imaginons que vous préparez une migration de v1.20 vers v1.25. Pour voir ce qui sera problématique :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/ --target-versions k8s=v1.21.0

Avec la cible v1.21.0, l’Ingress n’est pas encore supprimé (suppression en v1.22), donc seul le Deployment apparaît comme REMOVED: true.

Pour voir toutes les API dépréciées en vue de Kubernetes v1.32 :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/ --target-versions k8s=v1.32.0

Cette commande révèle les API qui seront supprimées dans les prochaines versions, vous donnant le temps de planifier les migrations.

Pluto connaît les dépréciations de plusieurs écosystèmes : Kubernetes (k8s), Istio, cert-manager. Pour cibler plusieurs composants :

Fenêtre de terminal
pluto detect-files -d /tmp/pluto-demo/manifests/ \
--target-versions k8s=v1.28.0,cert-manager=v1.6.0,istio=v1.15.0

Au-delà des fichiers locaux, Pluto peut analyser directement un cluster Kubernetes pour détecter les API obsolètes déjà déployées.

Si vous utilisez Helm pour déployer vos applications, Pluto peut scanner toutes les releases :

Fenêtre de terminal
# Scanner toutes les releases Helm
pluto detect-helm -o wide
# Scanner uniquement un namespace
pluto detect-helm -n mon-namespace -o wide

Cette commande analyse les secrets Helm stockés dans le cluster et détecte les manifests utilisant des API obsolètes.

Pour scanner les ressources actuellement déployées dans le cluster (pas seulement Helm) :

Fenêtre de terminal
pluto detect-api-resources -o wide

Cette commande utilise l’annotation kubectl.kubernetes.io/last-applied-configuration pour retrouver l’API utilisée lors de la création. Attention : cette méthode n’est pas toujours fiable si les ressources ont été modifiées avec kubectl patch.

Pour combiner les détections Helm et API resources :

Fenêtre de terminal
pluto detect-all-in-cluster -o wide

Cette commande donne une vue complète de toutes les API obsolètes présentes dans votre cluster, quelle que soit leur méthode de déploiement.

Avant de déployer un chart Helm, vous pouvez vérifier qu’il n’utilise pas d’API obsolètes :

Fenêtre de terminal
# Générer les manifests et les analyser
helm template mon-chart ./chart-directory | pluto detect -

Le tiret (-) indique à Pluto de lire depuis l’entrée standard (stdin). Cette technique fonctionne avec n’importe quelle commande qui génère des manifests YAML.

Pour un chart depuis un repository Helm :

Fenêtre de terminal
helm template ingress-nginx ingress-nginx/ingress-nginx | pluto detect -

Pluto est conçu pour s’intégrer dans les pipelines CI/CD. Ses codes de sortie permettent d’automatiser les décisions de déploiement.

CodeSignificationAction recommandée
0Aucune API obsolète détectéeContinuer le pipeline
1Erreur d’exécutionVérifier les logs
2API dépréciée trouvéeAvertissement, planifier migration
3API supprimée trouvéeBloquer le déploiement
4Remplacement non disponibleVérifier la version cible

Voici un job GitLab CI qui bloque le déploiement si des API supprimées sont détectées :

check-deprecated-apis:
stage: validate
image: us-docker.pkg.dev/fairwinds-ops/oss/pluto:v5.22.7
script:
- pluto detect-files -d manifests/ --target-versions k8s=v1.28.0
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
allow_failure: false

Pour autoriser les dépréciations mais bloquer uniquement les suppressions :

check-deprecated-apis:
stage: validate
script:
- pluto detect-files -d manifests/ --ignore-deprecations
allow_failure: false

Fairwinds fournit une GitHub Action officielle :

- name: Download Pluto
uses: FairwindsOps/pluto/github-action@master
- name: Check for deprecated APIs
run: pluto detect-files -d ./manifests --target-versions k8s=v1.28.0

Pour personnaliser le comportement dans un contexte CI :

OptionDescription
--ignore-deprecationsNe pas échouer sur les API dépréciées (code 2)
--ignore-removalsNe pas échouer sur les API supprimées (code 3)
--only-show-removedAfficher uniquement les API supprimées
--no-headersSupprimer les en-têtes pour faciliter le parsing

Pluto maintient une base de données interne de toutes les API Kubernetes et leurs cycles de dépréciation. Pour la consulter :

Fenêtre de terminal
pluto list-versions

Cette commande affiche toutes les API connues, leur date de dépréciation et de suppression. Utile pour comprendre ce que Pluto peut détecter.

Pour filtrer sur un composant spécifique :

Fenêtre de terminal
pluto list-versions --components k8s | grep Ingress

Si vous utilisez des CRD (Custom Resource Definitions) qui ont leurs propres cycles de dépréciation, vous pouvez les ajouter à Pluto.

Créez un fichier YAML avec vos versions personnalisées :

custom-versions.yaml
target-versions:
mycompany: v2.0.0
deprecated-versions:
- version: mycompany.io/v1alpha1
kind: MyCustomResource
deprecated-in: v1.5.0
removed-in: v2.0.0
replacement-api: mycompany.io/v1
component: mycompany

Puis utilisez-le avec l’option -f :

Fenêtre de terminal
pluto detect-files -d manifests/ -f custom-versions.yaml
ProblèmeCause probableSolution
”No deprecated APIs found” mais kubectl montre l’ancienne versionkubectl affiche toujours la version par défautPluto a raison, kubectl convertit l’API automatiquement
Pluto détecte toujours l’ancienne API après mise à jourAnciennes révisions Helm encore présentesSupprimer les anciens secrets Helm : kubectl delete secret sh.helm.release.v1.release-name.vX
Code de sortie 1 sans messageErreur de connexion au clusterVérifier kubeconfig et contexte avec kubectl cluster-info

La détection via detect-api-resources repose sur l’annotation kubectl.kubernetes.io/last-applied-configuration. Cette méthode a des limites :

  • Les ressources modifiées avec kubectl patch perdent l’annotation
  • Les ressources créées par des opérateurs peuvent ne pas avoir l’annotation
  • Certaines ressources très anciennes n’ont jamais eu cette annotation

Pour une détection fiable, préférez detect-helm si vous utilisez Helm, ou scannez vos fichiers sources avec detect-files.

  1. Scannez à chaque commit

    Ajoutez Pluto dans votre pipeline CI pour détecter les problèmes au plus tôt. Un développeur préférera corriger une API obsolète avant de merger plutôt qu’en urgence lors d’une mise à niveau de cluster.

  2. Ciblez la prochaine version

    Configurez votre pipeline pour cibler la prochaine version de Kubernetes que vous prévoyez d’adopter. Cela donne le temps à l’équipe de planifier les migrations.

  3. Bloquez uniquement les suppressions

    Utilisez --ignore-deprecations pour avertir sans bloquer sur les dépréciations. Ne bloquez le pipeline que pour les API déjà supprimées (REMOVED: true).

  4. Documentez les migrations

    Quand Pluto détecte une API obsolète, créez une issue ou un ticket de dette technique. La sortie Markdown facilite la documentation.

Le plus grand risque avec les API dépréciées est l’accumulation : quelques manifests obsolètes deviennent des dizaines, puis des centaines. Pour l’éviter :

  • Intégrez Pluto dès les premières lignes de code d’un projet
  • Traitez les avertissements de dépréciation comme des bugs à corriger
  • Planifiez des sprints de mise à jour d’API régulièrement
  • Pluto détecte les API Kubernetes dépréciées dans vos fichiers YAML, charts Helm et clusters en production
  • Version actuelle : v5.22.7 (décembre 2025), compatible jusqu’à Kubernetes v1.32
  • La commande detect-files scanne les fichiers locaux, detect-helm les releases Helm, detect-api-resources le cluster
  • Utilisez --target-versions k8s=vX.Y.Z pour cibler une version spécifique de Kubernetes
  • Les codes de sortie (2 = déprécié, 3 = supprimé) permettent l’automatisation CI/CD
  • Le format -o wide montre les versions exactes de dépréciation et suppression
  • Intégrez Pluto dans votre pipeline pour éviter l’accumulation de dette technique
  • Les API supprimées (REMOVED: true) casseront immédiatement vos déploiements

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.