本文发表已超过一年。较早的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

1.16 移除弃用 API:你需要知道的一切

随着 Kubernetes API 的演进,API 会定期重组或升级。当 API 演进时,旧的 API 将被弃用并最终移除。

v1.16 版本将停止提供以下弃用的 API 版本,转而支持更新更稳定的 API 版本:

  • extensions/v1beta1 API 版本中的 NetworkPolicy 不再提供服务。
    • 请迁移到使用 networking.k8s.io/v1 API 版本,该版本自 v1.8 起可用。现有的持久化数据可以通过新版本检索/更新。
  • extensions/v1beta1 API 版本中的 PodSecurityPolicy
    • 请迁移到使用 policy/v1beta1 API,该 API 自 v1.10 起可用。现有的持久化数据可以通过新版本检索/更新。
  • extensions/v1beta1apps/v1beta2 API 版本中的 DaemonSet 不再提供服务。
    • 请迁移到使用 apps/v1 API 版本,该版本自 v1.9 起可用。现有的持久化数据可以通过新版本检索/更新。
    • 重要变更
      • spec.templateGeneration 已移除
      • spec.selector 现在是必需的,并且创建后不可变;请使用现有的模板标签作为选择器,以实现无缝升级。
      • spec.updateStrategy.type 现在默认值为 RollingUpdate (在 extensions/v1beta1 中默认值为 OnDelete)。
  • extensions/v1beta1apps/v1beta1apps/v1beta2 API 版本中的 Deployment 不再提供服务。
    • 请迁移到使用 apps/v1 API 版本,该版本自 v1.9 起可用。现有的持久化数据可以通过新版本检索/更新。
    • 重要变更
      • spec.rollbackTo 已移除
      • spec.selector 现在是必需的,并且创建后不可变;请使用现有的模板标签作为选择器,以实现无缝升级。
      • spec.progressDeadlineSeconds 现在默认值为 600 秒 (在 extensions/v1beta1 中默认值为无期限)。
      • spec.revisionHistoryLimit 现在默认值为 10 (在 apps/v1beta1 中默认值为 2,在 extensions/v1beta1 中默认值为保留所有)。
      • maxSurgemaxUnavailable 现在默认值为 25% (在 extensions/v1beta1 中默认值为 1)。
  • apps/v1beta1apps/v1beta2 API 版本中的 StatefulSet 不再提供服务。
    • 请迁移到使用 apps/v1 API 版本,该版本自 v1.9 起可用。现有的持久化数据可以通过新版本检索/更新。
    • 重要变更
      • spec.selector 现在是必需的,并且创建后不可变;请使用现有的模板标签作为选择器,以实现无缝升级。
      • spec.updateStrategy.type 现在默认值为 RollingUpdate (在 apps/v1beta1 中默认值为 OnDelete)。
  • extensions/v1beta1apps/v1beta1apps/v1beta2 API 版本中的 ReplicaSet 不再提供服务。
    • 请迁移到使用 apps/v1 API 版本,该版本自 v1.9 起可用。现有的持久化数据可以通过新版本检索/更新。
    • 重要变更
      • spec.selector 现在是必需的,并且创建后不可变;请使用现有的模板标签作为选择器,以实现无缝升级。

v1.22 版本将停止提供以下弃用的 API 版本,转而支持更新更稳定的 API 版本:

  • extensions/v1beta1 API 版本中的 Ingress 将不再提供服务。
    • 请迁移到使用 networking.k8s.io/v1beta1 API 版本,该版本自 v1.14 起可用。现有的持久化数据可以通过新版本检索/更新。

应对措施

Kubernetes 1.16 定于 2019 年 9 月发布,请务必立即审计你的配置和集成!

  • 修改 YAML 文件,引用新的 API
  • 更新自定义集成和控制器,调用新的 API
  • 更新第三方工具(Ingress Controller、持续交付系统),调用新的 API

迁移到新的 Ingress API 只需更改 API 路径 - API 字段保持不变。然而,迁移其他资源(例如 Deployment)需要根据更改的字段进行一些更新。你可以使用 kubectl convert 命令自动转换现有对象:kubectl convert -f <文件> --output-version <组>/<版本>

例如,要将旧的 Deployment 转换为 apps/v1,你可以运行:kubectl convert -f ./my-deployment.yaml --output-version apps/v1 请注意,这可能会使用非理想的默认值。要了解特定资源的更多信息,请查阅 Kubernetes API 参考

你可以通过启动一个 apiserver,并禁用上述资源来测试你的集群,模拟即将到来的移除。将以下标志添加到 apiserver 启动参数中:

--runtime-config=apps/v1beta1=false,apps/v1beta2=false,extensions/v1beta1/daemonsets=false,extensions/v1beta1/deployments=false,extensions/v1beta1/replicasets=false,extensions/v1beta1/networkpolicies=false,extensions/v1beta1/podsecuritypolicies=false

想了解更多?

弃用信息在 Kubernetes 发布说明中宣布。你可以在 1.141.15 的发布说明中查看这些公告。

你可以在我们的弃用策略文档中阅读更多关于 Kubernetes API 及其他 Kubernetes 组件的弃用策略。弃用策略因组件(例如,主要 API 与管理 CLI)和成熟度(alpha、beta 或 GA)而异。

这些详细信息之前也已在 kubernetes-dev 邮件列表中宣布,同时发布了 Kubernetes 1.14 和 1.15。来自 Jordan Liggitt。

In case you missed it in the 1.15.0 release notes, the timelines for deprecated resources in the extensions/v1beta1, apps/v1beta1, and apps/v1beta2 API groups to no longer be served by default have been updated:

* NetworkPolicy resources will no longer be served from extensions/v1beta1 by default in v1.16. Migrate to the networking.k8s.io/v1 API, available since v1.8. Existing persisted data can be retrieved/updated via the networking.k8s.io/v1 API.
* PodSecurityPolicy resources will no longer be served from extensions/v1beta1 by default in v1.16. Migrate to the policy/v1beta1 API, available since v1.10. Existing persisted data can be retrieved/updated via the policy/v1beta1 API.
* DaemonSet, Deployment, StatefulSet, and ReplicaSet resources will no longer be served from extensions/v1beta1, apps/v1beta1, or apps/v1beta2 by default in v1.16. Migrate to the apps/v1 API, available since v1.9. Existing persisted data can be retrieved/updated via the apps/v1 API.

To start a v1.15.0 API server with these resources disabled to flush out dependencies on these deprecated APIs, and ensure your application/manifests will work properly against the v1.16 release, use the following --runtime-config argument:

--runtime-config=apps/v1beta1=false,apps/v1beta2=false,extensions/v1beta1/daemonsets=false,extensions/v1beta1/deployments=false,extensions/v1beta1/replicasets=false,extensions/v1beta1/networkpolicies=false,extensions/v1beta1/podsecuritypolicies=false