How to Manage Kubernetes API Versions and Deprecations
Handle Kubernetes API version changes and deprecations. Migrate resources to stable APIs and ensure cluster upgrade compatibility.
π‘ Quick Answer: Use kubectl-convert plugin to migrate deprecated APIs:
kubectl convert -f old-manifest.yaml --output-version apps/v1. Run pluto or kubent to scan your cluster for deprecated resources before upgrades. Check deprecations withkubectl api-resources | grep -i <resource>.Key command:
pluto detect-files -d ./manifests/orkubentto find deprecated APIs cluster-wide.Gotcha: APIs are removed ~3 versions after deprecationβplan migrations before upgrading clusters.
Kubernetes deprecates APIs over time. Learn to identify deprecated resources, migrate to stable APIs, and prepare for cluster upgrades.
Check API Versions
# List all API versions
kubectl api-versions
# List resources with their API groups
kubectl api-resources
# Check specific resource API
kubectl api-resources | grep -i ingress
# Get resource with API version
kubectl get ingresses.networking.k8s.ioDetect Deprecated APIs
# Install kubent (Kube No Trouble)
brew install kubent # macOS
# Or download from GitHub
# Scan cluster for deprecated APIs
kubent
# Sample output:
# __________________________________________________________________________________________
# | NAME | NAMESPACE | KIND | VERSION | REPLACEMENT |
# |-------------|-----------|-----------|-----------------|--------------------------|
# | my-ingress | default | Ingress | extensions/v1beta1 | networking.k8s.io/v1 |
# | my-psp | default | PodSecurityPolicy | policy/v1beta1 | N/A (removed) |Pluto - Another Detection Tool
# Install pluto
brew install FairwindsOps/tap/pluto
# Scan manifests in directory
pluto detect-files -d ./manifests/
# Scan Helm releases
pluto detect-helm -o wide
# Scan running cluster
pluto detect-api-resources
# Check against specific K8s version
pluto detect-files -d ./manifests/ --target-versions k8s=v1.29.0Common Deprecations
# Ingress (removed in 1.22)
# OLD: extensions/v1beta1, networking.k8s.io/v1beta1
# NEW: networking.k8s.io/v1
# Before (deprecated)
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
# After (current)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
ingressClassName: nginx # New field
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix # Required in v1
backend:
service:
name: my-service
port:
number: 80 # Changed structureHorizontalPodAutoscaler Migration
# OLD: autoscaling/v1 (limited)
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
spec:
targetCPUUtilizationPercentage: 80
# NEW: autoscaling/v2 (full features)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80CronJob Migration
# OLD: batch/v1beta1 (removed in 1.25)
# NEW: batch/v1
apiVersion: batch/v1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "0 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: job
image: busybox
command: ["echo", "hello"]
restartPolicy: OnFailurePodSecurityPolicy to Pod Security Standards
# PodSecurityPolicy removed in 1.25
# Replace with Pod Security Admission
# Label namespace with security level
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restrictedConvert Resources with kubectl
# Convert deprecated resource to new API
kubectl convert -f old-ingress.yaml --output-version networking.k8s.io/v1
# Note: kubectl convert was removed in 1.24
# Use kubectl-convert plugin instead:
kubectl krew install convert
kubectl convert -f old-resource.yamlHelm Chart API Updates
# Check Helm releases for deprecated APIs
helm mapkubeapis --dry-run my-release
# Update release metadata
helm mapkubeapis my-release
# Or reinstall chart
helm upgrade my-release ./chart --version x.y.zCI/CD Deprecation Checks
# GitHub Actions workflow
name: Check Deprecated APIs
on: [pull_request]
jobs:
check-deprecations:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Pluto
run: |
curl -L -o pluto.tar.gz https://github.com/FairwindsOps/pluto/releases/download/v5.18.0/pluto_5.18.0_linux_amd64.tar.gz
tar -xzf pluto.tar.gz
- name: Check for deprecated APIs
run: |
./pluto detect-files -d ./manifests/ \
--target-versions k8s=v1.29.0 \
--output-format=jsonPre-Upgrade Checklist
# 1. Check deprecated APIs in cluster
kubent
# 2. Scan Helm releases
pluto detect-helm
# 3. Review release notes
# https://kubernetes.io/docs/reference/using-api/deprecation-guide/
# 4. Test in staging
# - Upgrade staging cluster
# - Deploy all applications
# - Run integration tests
# 5. Update manifests
# - Change apiVersion
# - Add required new fields
# - Remove deprecated fields
# 6. Update Helm charts
# - Pin to versions supporting new APIs
# - Update values if neededStorage Class Migration
# v1beta1 removed, use v1
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
allowVolumeExpansion: trueAPI Version Discovery
# Check if API version exists
kubectl get --raw /apis/networking.k8s.io/v1
# List all API groups
kubectl get --raw /apis | jq '.groups[].name'
# Check resource in API group
kubectl get --raw /apis/apps/v1 | jq '.resources[].name'
# Get preferred version
kubectl get --raw /apis/autoscaling | jq '.preferredVersion'Custom Resource Migrations
# When CRD API changes, update CR manifests
# Check CRD served versions
kubectl get crd certificates.cert-manager.io -o jsonpath='{.spec.versions[*].name}'
# Update Custom Resources
apiVersion: cert-manager.io/v1 # Not v1alpha2
kind: Certificate
metadata:
name: my-certSummary
Kubernetes deprecates APIs following a predictable timeline. Use kubent or pluto to detect deprecated resources in your cluster and manifests. Common migrations include Ingress to networking.k8s.io/v1, HPA to autoscaling/v2, and CronJob to batch/v1. PodSecurityPolicy is replaced by Pod Security Admission. Run deprecation checks in CI/CD pipelines before cluster upgrades. Review Kubernetes deprecation guide before upgrading. Test migrations in staging before production. Use kubectl api-versions and kubectl api-resources to verify available APIs.
π Go Further with Kubernetes Recipes
Love this recipe? Thereβs so much more! This is just one of 100+ hands-on recipes in our comprehensive Kubernetes Recipes book.
Inside the book, youβll master:
- β Production-ready deployment strategies
- β Advanced networking and security patterns
- β Observability, monitoring, and troubleshooting
- β Real-world best practices from industry experts
βThe practical, recipe-based approach made complex Kubernetes concepts finally click for me.β
π Get Your Copy Now β Start building production-grade Kubernetes skills today!

Recommended
Kubernetes Recipes β The Complete Book100+ production-ready patterns with detailed explanations, best practices, and copy-paste YAML. Everything in one place.
Get the Book βLearn by Doing
CopyPasteLearn β Hands-on Cloud & DevOps CoursesMaster Kubernetes, Ansible, Terraform, and MLOps with interactive, copy-paste-run lessons. Start free.
Browse Courses βπ Deepen Your Skills β Hands-on Courses
Courses by CopyPasteLearn.com β Learn IT by Doing
