前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(译)Kubernetes Pod 对象也能淘汰么?

(译)Kubernetes Pod 对象也能淘汰么?

作者头像
崔秀龙
发布2021-11-02 14:49:22
5060
发布2021-11-02 14:49:22
举报
文章被收录于专栏:伪架构师伪架构师

随着时间的推移,所有的软件项目都会加入新的功能和 API,与此相对地,也会有功能和 API 被移除。Kubernetes 这样的大型项目也并无不同,但是核心 API 的废弃和删除,始终有些含混,Kubernetes 中的核心对象或者说是 API,例如 Pod、Deployment 和 Service,是不是可以删除呢?如果答案是肯定的,那么该如何进行呢?

长话短说

GA 状态的核心 API,例如 v1 API 中的对象也是可能淘汰的。Kubernetes 中的的淘汰话题需要分为 API、CLI 以及 FeatureGate 这三个方面,每方面又会有自己的成熟阶段,例如 Alpha、Beta 或者 GA,这些成熟度的定义,就代表了在什么时间、什么条件下进行淘汰操作—— Pod 这样的东西也不能例外。因此本文尝试对这一问题进行进一步的探讨,看看过往的例子和一些未来的假设。

分而治之

不同的对象或功能有不同的规则,所以在讨论淘汰规则之前,首先对这些淘汰目标进行分类:

  • REST 对象: 这是绝大多数人最多打交道的东西,因此也是最引人关注的方向,这里包括了 Pod 或者 Deployment 这样的顶层对象,也包含了它们的成员字段,例如 containersvolumes 或者 env; 另外还有一些常量,例如 imagePullPolicy 使用的 AlwaysIfNotPresent 等。
  • CLI 和命令行参数: 这一部分内容是针对客户端的。 最容易想到的可能就是 kubectl,其实还包含了 kubeletkube-apiserver 或者 kube-scheduler 及其子命令和选项等。
  • 功能和行为: 各种不同成熟度的试验特性是无法用 API 或者 CLI 来表达的,但是它们也应该有自己的淘汰过程和节奏。
  • 指标: 最后 Kubernetes 的各个组件还在 /metrics 端点中提供了大量指标。 这些指标可能会在监控等系统中使用,因此也不能直接删除,而需要有一定的淘汰规则。

REST 对象

REST API 需要遵守一个普遍规则——官宣淘汰之时,API 版本至少要支持:

  • GA: 12 个月或者 3 次发版(取最长时间)
  • Beta: 9 个月或者 3 次发版(取最长时间)
  • Alpha: 0 次发版

看起来好像非常清晰,其实里面包含了很多其它(可能很难理解)的规则,所以我们先进入示例环节来进行澄清。假设有一个叫做 Task 的 API 对象(有趣的事实:这是 Pod 的原名,请参见 First Commit of Kubernetes)。这个对象处于 GA 状态,其 API 版本为 v1,淘汰需要经过什么过程呢?

Kubernetes 版本

API 版本

推荐

行为

X

v1

v1

此时 Task 对象处于 GA 状态,并没有进入淘汰周期

X+1

v2alpha1, v1

v1

引入 v2alpha1,宣布 Task 开始淘汰,此时 v2alpha1 中并不包含 Task

X+2

v2alpha2,v1

v1

用 v2alpha2 替代 v2alpha1

X+3

v2beta1, v1

v1

v2alpha2 被 v2beta1 替换

X+4

v2beta2、v2beta1、v1

v1

引入 v2beta2,v2beta1 依旧存在,但是开始淘汰

X+5

v2、v2beta2、v2beta1、v1

v1

引入 v2,包括首选使用的 v1 在内的所有其他版本进入淘汰周期

X+6

v2、v2beta2、v2beta1、v1

v2

没有移除任何 API,但是 v2 已经成为首选版本

X+7

v2、v2beta2、v1

v2

移除 v2beta1

X+8

v2、v1

v2

移除 v2beta2

X+9

v2、v1

v2

没有什么变化,按照规则,v1 必须继续存活一个版本

X+10

v2

v2

最终删除了 v1,其中的 Task 对象也宣告终结

从上表来看,如果在 v2alpha1 开始淘汰 Task 对象,就需要 9 个版本才能最终完成。读者需要注意的是,根据当下的发布节奏,每年发版三次,整个淘汰流程可能需要三年多。

有些对象虽然没进入 GA,但是用户已经将其视为 GA 并进行使用。例如 1.19 中才进入 GA 的 Ingress,或者 1.21 的 CronJob。这种 beta 甚至是 alpha 的版本,淘汰节奏就不会这么宽松了。要检查资源所属的分类,可以运行 kubectl api-resources | grep beta,读取所有集群中的所有 beta API 对象类型。

REST 对象字段成员、常量以及对象结构,淘汰规则跟对象是一致的。也就是说,imagePullPolicy 中使用的 AlwaysIfNotPresentNever 不会随机变化也不会从一节挪到另一节。

例如 PodSecurityPolicy 可能是近期的一个最大变化。这个 API 对象会从 v1beta1 转向 EOL,在 v1.21 中开始淘汰,在 v1.25 中被移除。详情可参见 KEP_2579

另一个进行中的重要淘汰就是 selfLink 字段,这是 KEP-1164 中的一部分,这一变更的过程记录在 Github Issue 之中。

如果你有兴趣了解其它的淘汰过程,希望了解其中的逻辑关系以及整个流程,可以在 kubernetes/enhancements repository 搜索包含 deprecate 关键字的 KEP。

客户端和参数

和 REST 对象类似,kubectlkubelet 的子命令及其参数也是有自己的淘汰策略的。

这部分的规则比前面的案例要简单,对于 kubectl 这样的面对客户的组件来说:

  • GA: 12 个月或者两次发版(取最长时间)
  • Beta: 3 个月或者 1 次发版(取最长时间)
  • Alpha: 0 次发版

对于 kubeletkube-apiserver 或者 kube-scheduler 这样的面向管理员的组件:

  • GA: 12 个月或者两次发版(取最长时间)
  • Beta: 3 个月或者 1 次发版(取最长时间)
  • Alpha: 0 次发版

近期这方面的最知名案例应该算是 kubelet 中的 dockershim 了。在 KEP-2221 中讲到,在 v1.20 中设置淘汰,在 v1.24 中进行删除。

这方面的另一个显著目标就是 seccomp Profile 即将 GA,这一过程在 KEP-135 中进行跟进。这个特性并不会真正地对参数和 CLI 产生影响,但是它的 GA 过程会要求淘汰 kubelet--seccomp-profile-root,详情请参见 SIG Node 文档。

所以这一节的淘汰过程是比较较宽松的,但是如果你正在自动化过程中使用 kubectl alpha,最好在升级集群和 CLI 之前检查一下它的淘汰情况。

Feature Gate

Kubernetes 每个版本中都会包含很多的实验性功能。这些功能被称为 Feature Gate,它们使用 Key/Value 形式的开关进行控制。

这些特性既然是用于试验的,其淘汰策略自然和其它的 Kubernetes 对象有所不同。随着特性的逐步成熟,它的 Feature Gate 也会发生变化。Alpha 阶段的功能,其 Feature Gate 会被缺省关闭;而 Beta 阶段的功能则会缺省打开;如果该功能进入 GA,对应的 Feature Gate 就不再需要了,会被淘汰,无法操作。

Alpha 功能可能随时消失;Beta 功能可能会在 1 次发版以后删除;进入 GA 的功能则会在两次发版后删除。

这方面的最好例子就是官方的 Feature Gate 列表。以其中包含的 AffinityInAnnotations 为例,它就是从 Alpha 淘汰的;而 BlockVolumeDryRun 或者 EndpointSlice 则已经进入了 GA。我还没有看到过有从 Beta 被淘汰的 Feature Gate。

如果打开了某些 Feature Gate,在集群升级之前一定要检查一下,防止一些特性因升级被删除。

指标

最后一个需要关注的就是监控指标,可能会有监控工具对指标进行聚合和消费,因此其淘汰过程也是需要多加小心的。和前面章节中的内容不同,指标只分成两类——稳定和 Alpha,声明淘汰之后,稳定指标可以在 3 次发版之后移除,Alpha 可以随时移除。

例如 rest_client_request_latency_seconds 就是一个值得观察的指标淘汰案例,这个过程在 v1.17 的版本说明里体现。

如果想要了解更多监控指标生命周期的问题,可以查看一下系统指标的相关文档。

结论

现今很多项目会采用“有破坏性的快速演进”方法来进行淘汰工作,其中往往会包含繁杂的手工操作,所以 Kubernetes 这样的大项目提出了如此深思熟虑的启用过程,让用户有时间来进行有计划的迁移,这是让人非常愉快的。

那么这篇文章的要点在哪里:

  • 所有东西都可能淘汰? 是的?
  • 需要担心吗? 显然不用。

看看淘汰的时间线长度,就知道无需担心突然袭击了。但是为长远计,应该检查版本说明,注意其中是否有你正在使用的 Alpha 功能。还应该阅读 淘汰 API 指南,其中会列出所有未来将要移除的 API 对象。最后要说明的是,外部供应商的 CRD 的生命周期是自行负责的,可能和官方策略并不一致。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 伪架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 长话短说
  • 分而治之
  • REST 对象
  • 客户端和参数
  • Feature Gate
  • 指标
  • 结论
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档