When I use Deployment in Kubernetes, what's the differences between apps/v1beta1 and extensions/v1beta1?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
extensions/v1beta1 and apps/v1beta1 were older Kubernetes Deployment APIs used before the stable apps/v1 version became standard. Today, both beta versions are deprecated and removed in modern clusters. Understanding the differences still matters when migrating legacy manifests and debugging old repositories.
Historical Context
Deployment resource history in simplified order:
- early Deployment definitions in
extensions/v1beta1 - migration into
appsAPI group as Kubernetes API domains matured - stabilization in
apps/v1
From Kubernetes 1.16 onward, many beta APIs including these Deployment variants were removed from default availability. In practical terms, modern clusters should use only apps/v1 for Deployments.
Why Two Beta API Groups Existed
The extensions group originally hosted several evolving resources. As Kubernetes matured, resources were reorganized into purpose-specific groups. Deployment moved under the apps group to align with other workload controllers.
This shift was not only naming; it signaled API stabilization direction and clearer ownership of workload APIs.
Practical Difference for Migration
The most important migration concern is not choosing between two beta APIs today. It is moving from either beta API to apps/v1 correctly.
A critical apps/v1 requirement is explicit selector behavior:
spec.selectormust be defined- selector labels must match pod template labels
- mismatches cause validation errors or rollout issues
Legacy Manifest Example
Older style manifests could look like this:
This may fail on modern clusters because apiVersion is obsolete.
Modern apps/v1 Manifest Example
This is the expected format for current Kubernetes versions.
Migration Workflow
A safe migration checklist:
- update apiVersion to
apps/v1 - add
spec.selector.matchLabels - ensure selector labels exactly match template labels
- validate with server-side dry run
- deploy to staging first
Validation command example:
Server dry run catches schema incompatibilities early.
Tooling Notes
If using Helm or Kustomize, ensure templates no longer render beta Deployment APIs. Old charts can still carry stale apiVersions even when cluster supports only stable APIs.
Also review CI linters and policy checks so deprecated APIs are blocked before merge.
Migration Validation Commands
After updating manifests, verify both schema and rollout behavior. Useful checks include:
This sequence confirms API compatibility, shows expected object changes, and validates that the updated Deployment reaches a healthy state.
Operational Impact of Staying on Old APIs
If you keep obsolete manifests in source control:
- cluster upgrades can fail deployment pipelines suddenly
- new team members may copy invalid examples
- security and compliance scanning becomes noisier
Cleaning legacy apiVersions is a reliability task, not only style work.
Common Pitfalls
- Treating
apps/v1beta1as valid on modern clusters. - Migrating apiVersion but forgetting explicit selector rules.
- Having selector labels different from pod template labels.
- Updating manifests manually without server-side validation.
- Leaving old examples in docs and templates after migration.
Summary
- Both
extensions/v1beta1andapps/v1beta1are legacy Deployment APIs. - Modern Kubernetes should use
apps/v1for Deployments. - Migration success depends on correct selector and label alignment.
- Validate manifests with server-side dry runs before rollout.
- Remove stale beta examples from charts and repository templates.

