Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Gérer les dépréciations d'API Kubernetes

14 min de lecture

logo kubernetes

Les API Kubernetes évoluent : certaines versions sont dépréciées puis supprimées lors des mises à jour. Si vos manifests utilisent une API supprimée, vos déploiements échoueront après la mise à jour du cluster. Ce guide vous explique le cycle de vie des API, comment détecter les versions obsolètes, et comment migrer vos ressources avant qu’il ne soit trop tard.

  • Comprendre le cycle de vie des API Kubernetes (alpha → beta → stable)
  • Distinguer une API dépréciée (avertissement) d’une API supprimée (erreur)
  • Détecter les API obsolètes dans vos fichiers YAML, charts Helm et cluster
  • Migrer vos ressources avec kubectl convert et les outils appropriés
  • Automatiser la détection dans votre pipeline CI/CD

Prérequis : savoir écrire des manifests Kubernetes et comprendre le versioning sémantique.

Kubernetes suit un processus rigoureux pour faire évoluer ses API sans casser brutalement les utilisateurs. Chaque nouvelle fonctionnalité passe par plusieurs phases de maturité avant d’être stabilisée — ou abandonnée.

┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────────┐ ┌─────────┐
│ Alpha │ ──▶ │ Beta │ ──▶ │ Stable │ ──▶ │ Deprecated │ ──▶ │ Removed │
│ v1alpha1│ │ v1beta1 │ │ v1 │ │ v1 │ │ - │
└─────────┘ └─────────┘ └─────────┘ └────────────┘ └─────────┘
Expérimental Pré-stable Stable Obsolète Supprimé
PhaseCaractéristiquesDurée typique
Alpha (v1alpha1)Désactivé par défaut, peut changer ou disparaître sans préavisVariable
Beta (v1beta1)Activé par défaut, testé mais peut encore évoluer9+ mois minimum
Stable (v1)Garanti compatible, pas de changements cassantsIndéfini
DeprecatedToujours fonctionnel mais marqué obsolète, warnings dans les logs12+ mois
RemovedSupprimé, les manifests échouent-

Quand une API est supprimée :

Fenêtre de terminal
kubectl apply -f deployment-old.yaml
error: resource mapping not found for name: "my-app" namespace: ""
from "deployment-old.yaml": no matches for kind "Deployment" in version "extensions/v1beta1"
ensure CRDs are installed first

Votre manifest devient inapplicable. Le cluster ne reconnaît plus cette combinaison apiVersion + kind.

Ces suppressions ont cassé des milliers de déploiements. Apprenez de l’histoire pour ne pas la répéter.

Les API extensions/v1beta1 et apps/v1beta1 ont été supprimées après des années de dépréciation :

RessourceAncienne API (supprimée)Nouvelle API
Deploymentextensions/v1beta1apps/v1
DaemonSetextensions/v1beta1apps/v1
ReplicaSetextensions/v1beta1apps/v1
StatefulSetapps/v1beta1apps/v1
RessourceAncienne API (supprimée)Nouvelle API
Ingressextensions/v1beta1networking.k8s.io/v1
Ingressnetworking.k8s.io/v1beta1networking.k8s.io/v1
CertificateSigningRequestcertificates.k8s.io/v1beta1certificates.k8s.io/v1
ValidatingWebhookConfigurationadmissionregistration.k8s.io/v1beta1admissionregistration.k8s.io/v1
RessourceAncienne API (supprimée)Remplacement
PodSecurityPolicypolicy/v1beta1Pod Security Standards (PSS)
PodDisruptionBudgetpolicy/v1beta1policy/v1
EndpointSlicediscovery.k8s.io/v1beta1discovery.k8s.io/v1

Depuis Kubernetes 1.19, kubectl affiche des warnings pour les API dépréciées :

Fenêtre de terminal
kubectl apply -f old-ingress.yaml
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+;
use networking.k8s.io/v1 Ingress
ingress.extensions/my-ingress created

Limitation : Vous ne voyez le warning qu’au moment de l’apply. Pas pratique pour auditer tous vos manifests.

Listez les versions d’API supportées par votre cluster :

Fenêtre de terminal
# Toutes les API disponibles
kubectl api-versions
# Vérifier si une API existe
kubectl api-versions | grep networking.k8s.io

Pour voir quelle version est préférée pour une ressource :

Fenêtre de terminal
kubectl api-resources | grep -i ingress

Pluto est un outil CLI dédié à la détection des API obsolètes.

  1. Installer Pluto

    Fenêtre de terminal
    brew install FairwindsOps/tap/pluto
  2. Scanner un répertoire de manifests

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

    Sortie :

    NAME KIND VERSION REPLACEMENT REMOVED DEPRECATED
    my-ingress Ingress extensions/v1beta1 networking.k8s.io/v1 true true
    my-psp PSP policy/v1beta1 N/A (Pod Security Standards) true true
  3. Scanner les releases Helm déployées

    Fenêtre de terminal
    pluto detect-helm -owide
  4. Cibler une version Kubernetes spécifique

    Utile pour anticiper une mise à jour :

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

kubent analyse votre cluster en temps réel :

Fenêtre de terminal
# Installation
sh -c "$(curl -sSL https://git.io/install-kubent)"
# Scanner le cluster
kubent
>>> Deprecated APIs removed in 1.25 <<<
-----------------------------------------
KIND NAMESPACE NAME API_VERSION
PodSecurityPolicy <cluster> restricted policy/v1beta1

Le plugin kubectl convert transforme les manifests vers une nouvelle API :

  1. Installer le plugin

    Fenêtre de terminal
    # Télécharger
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl-convert"
    # Rendre exécutable et déplacer
    chmod +x kubectl-convert
    sudo mv kubectl-convert /usr/local/bin/
  2. Convertir un manifest

    Fenêtre de terminal
    kubectl convert -f old-ingress.yaml --output-version networking.k8s.io/v1 > new-ingress.yaml
  3. Vérifier le résultat

    Le fichier converti peut nécessiter des ajustements manuels. Par exemple, l’Ingress v1 exige le champ pathType :

    # Avant (v1beta1) - pas de pathType
    - path: /api
    # Après (v1) - pathType obligatoire
    - path: /api
    pathType: Prefix # ou Exact, ImplementationSpecific

Pour les migrations complexes, suivez ce processus :

  1. Sauvegarder la ressource actuelle

    Fenêtre de terminal
    kubectl get ingress my-ingress -o yaml > backup-ingress.yaml
  2. Consulter la documentation de migration

    Kubernetes publie des guides de migration pour chaque version majeure :

  3. Adapter le manifest

    Exemple pour Ingress v1beta1 → v1 :

    # Avant
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
    name: my-ingress
    spec:
    rules:
    - host: example.com
    http:
    paths:
    - path: /api
    backend:
    serviceName: api-service
    servicePort: 80
    # Après
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: my-ingress
    spec:
    rules:
    - host: example.com
    http:
    paths:
    - path: /api
    pathType: Prefix # NOUVEAU: obligatoire
    backend:
    service: # NOUVEAU: structure imbriquée
    name: api-service
    port:
    number: 80
  4. Appliquer et valider

    Fenêtre de terminal
    kubectl apply -f new-ingress.yaml
    kubectl describe ingress my-ingress
.github/workflows/api-deprecation.yaml
name: Check Kubernetes API deprecations
on:
pull_request:
paths:
- 'manifests/**'
- 'charts/**'
jobs:
pluto:
runs-on: ubuntu-latest
permissions: {}
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Install Pluto
run: |
curl -L https://github.com/FairwindsOps/pluto/releases/latest/download/pluto_linux_amd64.tar.gz | tar xz
sudo mv pluto /usr/local/bin/
- name: Check manifests
run: pluto detect-files -d ./manifests/ --target-versions k8s=v1.30.0
- name: Check Helm charts
run: |
for chart in ./charts/*/; do
helm template test "$chart" | pluto detect -
done

Utilisez les codes de sortie pour bloquer ou avertir :

CodeSignificationAction CI/CD
0Aucune API obsolète✅ Continuer
2API dépréciées trouvées⚠️ Warning (optionnel)
3API supprimées trouvées❌ Bloquer le merge
- name: Check and fail on removed APIs
run: |
pluto detect-files -d ./manifests/ --target-versions k8s=v1.30.0
EXIT_CODE=$?
if [ $EXIT_CODE -eq 3 ]; then
echo "::error::Removed APIs detected! Migration required."
exit 1
fi
.gitlab-ci.yml
api-deprecation-check:
stage: validate
image: alpine:latest
before_script:
- apk add --no-cache curl tar
- curl -L https://github.com/FairwindsOps/pluto/releases/latest/download/pluto_linux_amd64.tar.gz | tar xz
- mv pluto /usr/local/bin/
script:
- pluto detect-files -d ./manifests/ --target-versions k8s=v1.30.0 -o markdown > deprecation-report.md
artifacts:
paths:
- deprecation-report.md
when: always
allow_failure: false
  1. Scanner tous les manifests avec Pluto ou kubent
  2. Cibler la version cible : --target-versions k8s=v1.X.0
  3. Migrer et tester en environnement staging
  4. Mettre à jour les charts Helm si vous en utilisez
  5. Mettre à jour le cluster seulement après migration
FréquenceAction
À chaque PRScanner les manifests modifiés
MensuelScanner tout le repo avec la version K8s actuelle + 2
Avant upgradeRapport complet sur la version cible

Consultez toujours la documentation officielle :

  • Les API Kubernetes suivent un cycle : alpha → beta → stable → deprecated → removed
  • Une API dépréciée fonctionne encore (avec warnings), une API supprimée casse vos déploiements
  • Kubernetes garantit 12 mois minimum entre dépréciation et suppression pour les API stables
  • Utilisez Pluto ou kubent pour détecter les API obsolètes dans vos manifests et votre cluster
  • kubectl convert migre les manifests simples, mais les changements structurels nécessitent une réécriture manuelle
  • Automatisez la détection dans votre CI/CD pour bloquer les PR avec des API supprimées
  • Scannez avant chaque upgrade de cluster avec la version cible

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
8 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

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.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn