What this checks
Paste a manifest and choose the version you're upgrading to. Each object's
apiVersion and kind are compared with a dataset built from the
official Deprecated API Migration Guide and the lifecycle data in the
Kubernetes source.
How to read the results
- Removed: no longer served at your target, so the API server rejects it.
- Not yet available: newer than your target, so the API server rejects it.
- Deprecated: still served. The row shows when it's removed, or that no removal is scheduled.
- OK: a built-in API that your target serves.
- Not in dataset: a custom resource or unknown API. It wasn't checked, so this isn't a pass.
Each problem row shows the best version your target serves, and when it became available. Objects are checked one by one, so one broken document doesn't stop the rest.
Removed vs deprecated
A deprecated API still works, but it's going away. Since 1.19, the API server returns a warning when you use one, and kubectl prints it. A removed API is no longer served, so applying the manifest fails with an error like this:
no matches for kind "Ingress" in version "extensions/v1beta1" Under the deprecation policy, a beta version must stay served for at least 9 months or 3 minor releases after deprecation, whichever is longer. A GA version can be deprecated, but must not be removed within a major version.
Example: migrating an Ingress
extensions/v1beta1 Ingress was removed in 1.22. Before:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: storefront
spec:
rules:
- host: shop.example.com
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 80 After:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: storefront
spec:
rules:
- host: shop.example.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: web
port:
number: 80
The apiVersion changes, serviceName becomes
service.name, and a numeric servicePort becomes
service.port.number. pathType is now required, and
ImplementationSpecific matches the old behavior.
Checking a live cluster
This page only sees what you paste. A cluster can also receive requests from controllers and scripts, and reading objects back doesn't help, because the API server converts them between versions. These show what a cluster is really receiving:
- Metrics:
apiserver_requested_deprecated_apislists the deprecated APIs that were requested, and itsremoved_releaselabel says when each one stops being served. It counts requests since that API server started, so on a control plane with several API servers, check each one. - Audit logs: these requests carry the annotation
"k8s.io/deprecated":"true", which identifies the client. - Pluto finds deprecated versions in code repositories and Helm releases.
- kubent checks a running cluster, using collectors for its objects, Helm releases and files.
kubectl get --raw /metrics | grep apiserver_requested_deprecated_apis Limitations
- Custom resources show as Not in dataset. Check the project that provides the CRD.
- Helm templates aren't valid YAML until rendered. Run
helm templatefirst, and paste the output. - Alpha APIs show as Not in dataset, as they can be removed without notice.
-
Only
apiVersionandkindare checked. An object marked OK can still fail for other reasons, such as an invalid field. - Input is limited to 1 MB and 20,000 documents.
FAQ
Does my manifest leave my browser?
No. The check runs in your browser, and the page's security policy stops scripts from sending data with fetch, XHR, WebSockets, beacons or form posts. The privacy page shows how to confirm it.
Which versions can I check against?
Every minor release from 1.16 through 1.37.
Can a cluster still serve a Removed API?
For one release, on clusters where you run the API server yourself. An admin can set
KUBE_APISERVER_SERVE_REMOVED_APIS_FOR_ONE_RELEASE=true, which keeps the API served
in the release where its removal takes effect. The source is
deleted_kinds.go
. Managed services generally don't expose this, so Removed means removed by default.
Does it fix my manifests?
No. The kubectl convert
plugin can, though it isn't installed by default and may use non-ideal default values, so review
what it produces.