随着 Kubernetes API 的演化,API 会周期性地被重组或升级。 当 API 演化时,老的 API 会被弃用并被最终删除。 本页面包含你在将已弃用 API 版本迁移到新的更稳定的 API 版本时需要了解的知识。
v1.32 发行版本将停止提供以下已弃用的 API 版本:
FlowSchema 和 PriorityLevelConfiguration 的 flowcontrol.apiserver.k8s.io/v1beta3 API 版本将不再在 v1.32 中提供。
spec.limited.nominalConcurrencyShares
字段仅在未指定时默认为 30,并且显式值 0 时不会更改为 30。v1.29 发行版本停止支持以下已弃用的 API 版本:
从 v1.29 版本开始不再提供 flowcontrol.apiserver.k8s.io/v1beta2 API 版本的 FlowSchema 和 PriorityLevelConfiguration。
spec.limited.assuredConcurrencyShares
字段已被重命名为 spec.limited.nominalConcurrencyShares
,仅在未指定时默认为 30, 并且显式值 0 不会更改为 30。spec.limited.assuredConcurrencyShares
字段已被更名为 spec.limited.nominalConcurrencyShares
。v1.27 发行版本停止支持以下已弃用的 API 版本:
从 v1.27 版本开始不再提供 storage.k8s.io/v1beta1 API 版本的 CSIStorageCapacity。
v1.26 发行版本中将去除以下已弃用的 API 版本:
从 v1.26 版本开始不再提供 flowcontrol.apiserver.k8s.io/v1beta1 API 版本的 FlowSchema 和 PriorityLevelConfiguration。
从 v1.26 版本开始不再提供 autoscaling/v2beta2 API 版本的 HorizontalPodAutoscaler。
targetAverageUtilization
被替换为 target.averageUtilization
和 target.type: Utilization
。 请参阅基于多项度量指标和自定义度量指标自动扩缩。v1.25 发行版本将停止提供以下已废弃 API 版本:
从 v1.25 版本开始不再提供 batch/v1beta1 API 版本的 CronJob。
从 v1.25 版本开始不再提供 discovery.k8s.io/v1beta1 API 版本的 EndpointSlice。
nodeName
字段而不是已被弃用的 topology["kubernetes.io/hostname"]
字段;zone
字段而不是已被弃用的 topology["kubernetes.io/zone"]
字段;topology
字段被替换为 deprecatedTopology
,并且在 v1 版本中不可写入。从 v1.25 版本开始不再提供 events.k8s.io/v1beta1 API 版本的 Event。
type
字段只能设置为 Normal
和 Warning
之一;involvedObject
字段被更名为 regarding
;action
、reason
、reportingController
和 reportingInstance
字段 在创建新的 events.k8s.io/v1 版本 Event 时都是必需的字段;eventTime
而不是已被弃用的 firstTimestamp
字段 (该字段已被更名为 deprecatedFirstTimestamp
,且不允许出现在新的 events.k8s.io/v1 Event 对象中);series.lastObservedTime
而不是已被弃用的 lastTimestamp
字段 (该字段已被更名为 deprecatedLastTimestamp
,且不允许出现在新的 events.k8s.io/v1 Event 对象中);series.count
而不是已被弃用的 count
字段 (该字段已被更名为 deprecatedCount
,且不允许出现在新的 events.k8s.io/v1 Event 对象中);reportingController
而不是已被弃用的 source.component
字段 (该字段已被更名为 deprecatedSource.component
,且不允许出现在新的 events.k8s.io/v1 Event 对象中);reportingInstance
而不是已被弃用的 source.host
字段 (该字段已被更名为 deprecatedSource.host
,且不允许出现在新的 events.k8s.io/v1 Event 对象中)。从 v1.25 版本开始不再提供 autoscaling/v2beta1 API 版本的 HorizontalPodAutoscaler。
targetAverageUtilization
被替换为 target.averageUtilization
和 target.type: Utilization
。 请参阅基于多项度量指标和自定义度量指标自动扩缩。从 v1.25 版本开始不再提供 policy/v1beta1 API 版本的 PodDisruptionBudget。
policy/v1
版本的 PodDisruptionBudget 中将 spec.selector
设置为空({}
)时会选择名字空间中的所有 Pod(在 policy/v1beta1
版本中,空的 spec.selector
不会选择任何 Pod)。如果 spec.selector
未设置,则在两个 API 版本下都不会选择任何 Pod。从 v1.25 版本开始不再提供 policy/v1beta1 API 版本中的 PodSecurityPolicy, 并且 PodSecurityPolicy 准入控制器也会被删除。
迁移到 Pod 安全准入或第三方准入 Webhook。 有关迁移指南,请参阅从 PodSecurityPolicy 迁移到内置 PodSecurity 准入控制器。 有关弃用的更多信息,请参阅 PodSecurityPolicy 弃用:过去、现在和未来。
从 v1.25 版本开始不再提供 node.k8s.io/v1beta1 API 版本中的 RuntimeClass。
v1.22 发行版本停止提供以下已废弃 API 版本:
admissionregistration.k8s.io/v1beta1 API 版本的 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 不在 v1.22 版本中继续提供。
webhooks[*].failurePolicy
在 v1 版本中默认值从 Ignore
改为 Fail
webhooks[*].matchPolicy
在 v1 版本中默认值从 Exact
改为 Equivalent
webhooks[*].timeoutSeconds
在 v1 版本中默认值从 30s
改为 10s
webhooks[*].sideEffects
的默认值被删除,并且该字段变为必须指定; 在 v1 版本中可选的值只能是 None
和 NoneOnDryRun
之一webhooks[*].admissionReviewVersions
的默认值被删除,在 v1 版本中此字段变为必须指定(AdmissionReview 的被支持版本包括 v1
和 v1beta1
)webhooks[*].name
必须在通过 admissionregistration.k8s.io/v1
创建的对象列表中唯一apiextensions.k8s.io/v1beta1 API 版本的 CustomResourceDefinition 不在 v1.22 版本中继续提供。
值得注意的变更:
spec.scope
的默认值不再是 Namespaced
,该字段必须显式指定spec.version
在 v1 版本中被删除;应改用 spec.versions
spec.validation
在 v1 版本中被删除;应改用 spec.versions[*].schema
spec.subresources
在 v1 版本中被删除;应改用 spec.versions[*].subresources
spec.additionalPrinterColumns
在 v1 版本中被删除;应改用 spec.versions[*].additionalPrinterColumns
spec.conversion.webhookClientConfig
在 v1 版本中被移动到 spec.conversion.webhook.clientConfig
中spec.conversion.conversionReviewVersions
在 v1 版本中被移动到 spec.conversion.webhook.conversionReviewVersions
spec.versions[*].schema.openAPIV3Schema
在创建 v1 版本的 CustomResourceDefinition 对象时变成必需字段,并且其取值必须是一个 结构化的 Schemaspec.preserveUnknownFields: true
在创建 v1 版本的 CustomResourceDefinition 对象时不允许指定;该配置必须在 Schema 定义中使用 x-kubernetes-preserve-unknown-fields: true
来设置additionalPrinterColumns
的条目中的 JSONPath
字段被更名为 jsonPath
(补丁 #66531)apiregistration/v1beta1 API 版本的 APIService 不在 v1.22 版本中继续提供。
authentication.k8s.io/v1beta1 API 版本的 TokenReview 不在 v1.22 版本中继续提供。
authorization.k8s.io/v1beta1 API 版本的 LocalSubjectAccessReview、 SelfSubjectAccessReview、SubjectAccessReview、SelfSubjectRulesReview 不在 v1.22 版本中继续提供。
spec.group
在 v1 版本中被更名为 spec.groups
(补丁 #32709)certificates.k8s.io/v1beta1 API 版本的 CertificateSigningRequest 不在 v1.22 版本中继续提供。
certificates.k8s.io/v1
中需要额外注意的变更:spec.signerName
现在变成必需字段(参阅 已知的 Kubernetes 签署者), 并且通过 certificates.k8s.io/v1
API 不可以创建签署者为 kubernetes.io/legacy-unknown
的请求spec.usages
现在变成必需字段,其中不可以包含重复的字符串值, 并且只能包含已知的用法字符串status.conditions
中不可以包含重复的类型status.conditions[*].status
字段现在变为必需字段status.certificate
必须是 PEM 编码的,而且其中只能包含 CERTIFICATE
数据块coordination.k8s.io/v1beta1 API 版本的 Lease 不在 v1.22 版本中继续提供。
extensions/v1beta1 和 networking.k8s.io/v1beta1 API 版本的 Ingress 不在 v1.22 版本中继续提供。
spec.backend
字段被更名为 spec.defaultBackend
serviceName
字段被更名为 service.name
servicePort
字段被更名为 service.port.number
servicePort
字段被更名为 service.port.name
pathType
都成为必需字段。 可选项为 Prefix
、Exact
和 ImplementationSpecific
。 要匹配 v1beta1
版本中未定义路径类型时的行为,可使用 ImplementationSpecific
networking.k8s.io/v1beta1 API 版本的 IngressClass 不在 v1.22 版本中继续提供。
rbac.authorization.k8s.io/v1beta1 API 版本的 ClusterRole、ClusterRoleBinding、 Role 和 RoleBinding 不在 v1.22 版本中继续提供。
scheduling.k8s.io/v1beta1 API 版本的 PriorityClass 不在 v1.22 版本中继续提供。
storage.k8s.io/v1beta1 API 版本的 CSIDriver、CSINode、StorageClass 和 VolumeAttachment 不在 v1.22 版本中继续提供。
v1.16 发行版本停止提供以下已废弃 API 版本:
extensions/v1beta1 API 版本的 NetworkPolicy 不在 v1.16 版本中继续提供。
extensions/v1beta1 和 apps/v1beta2 API 版本的 DaemonSet 在 v1.16 版本中不再继续提供。
spec.templateGeneration
字段被删除spec.selector
现在变成必需字段,并且在对象创建之后不可变更; 可以将现有模板的标签作为选择算符以实现无缝迁移。spec.updateStrategy.type
的默认值变为 RollingUpdate
(extensions/v1beta1
API 版本中的默认值是 OnDelete
)。extensions/v1beta1、apps/v1beta1 和 apps/v1beta2 API 版本的 Deployment 在 v1.16 版本中不再继续提供。
spec.rollbackTo
字段被删除spec.selector
字段现在变为必需字段,并且在 Deployment 创建之后不可变更; 可以使用现有的模板的标签作为选择算符以实现无缝迁移。spec.progressDeadlineSeconds
的默认值变为 600
秒 (extensions/v1beta1
中的默认值是没有期限)spec.revisionHistoryLimit
的默认值变为 10
(apps/v1beta1
API 版本中此字段默认值为 2
,在extensions/v1beta1
API 版本中的默认行为是保留所有历史记录)。maxSurge
和 maxUnavailable
的默认值变为 25%
(在 extensions/v1beta1
API 版本中,这些字段的默认值是 1
)。apps/v1beta1 和 apps/v1beta2 API 版本的 StatefulSet 在 v1.16 版本中不再继续提供。
spec.selector
字段现在变为必需字段,并且在 StatefulSet 创建之后不可变更; 可以使用现有的模板的标签作为选择算符以实现无缝迁移。spec.updateStrategy.type
的默认值变为 RollingUpdate
(apps/v1beta1
API 版本中的默认值是 OnDelete
)。extensions/v1beta1、apps/v1beta1 和 apps/v1beta2 API 版本的 ReplicaSet 在 v1.16 版本中不再继续提供。
spec.selector
现在变成必需字段,并且在对象创建之后不可变更; 可以将现有模板的标签作为选择算符以实现无缝迁移。extensions/v1beta1 API 版本的 PodSecurityPolicy 在 v1.16 版本中不再继续提供。
你可以通过在启动 API 服务器时禁用特定的 API 版本来模拟即将发生的 API 移除,从而完成测试。在 API 服务器启动参数中添加如下标志:
--runtime-config=<group>/<version>=false
例如:
--runtime-config=admissionregistration.k8s.io/v1beta1=false,apiextensions.k8s.io/v1beta1,...
使用 1.19 及更高版本中可用的客户端警告、指标和审计信息 来定位在何处使用了已弃用的 API。
更新自定义的集成组件和控制器,调用未被弃用的 API
更改 YAML 文件引用未被弃用的 API
你可以用 kubectl-convert
命令自动转换现有对象:
kubectl convert -f <file> --output-version <group>/<version>
例如,要将较老的 Deployment 版本转换为 apps/v1
版本,你可以运行:
kubectl convert -f ./my-deployment.yaml --output-version apps/v1
这个转换可能使用了非理想的默认值。要了解更多关于特定资源的信息, 请查阅 Kubernetes API 参考文档。