Kubernetes v1.28 发布

Planternetes

Kubernetes v1.28 发布

作者:Kubernetes v1.28 发布团队[1]

宣布 Kubernetes v1.28 Planternetes 的发布,这是 2023 年的第二个版本!

此版本包含 45 个增强功能。其中,19 个进入 Alpha 阶段,14 个升级为 Beta 阶段,12 个升级为稳定版(Stable)。

发布主题和标志

Kubernetes v1.28: Planternetes

Kubernetes v1.28 的主题是 Planternetes。

Kubernetes v1.28 发布

每个 Kubernetes 版本的发布都是我们社区成员数千人辛勤工作的结晶。参与此次发布的人员来自各种背景,有些是行业老兵,有些是家长,还有些是学生和开源新手。我们结合自己独特的经验,创造了一个具有全球影响力的集体作品。

就像一个花园一样,我们的发布经历了不断变化的成长、挑战和机遇。这个主题庆祝了为了使发布达到当前的状态而进行的细致关怀、意图和努力。我们和谐地共同成长。

新特性(主要主题)

支持控制平面和节点版本之间的偏差变化

这使得可以通过将核心节点和控制平面组件之间的支持偏差从 n-2 增加到 n-3 来进行测试和扩展,以便最旧支持的次要版本的节点组件(kubelet 和 kube-proxy)能够与最新支持的次要版本的控制平面组件(kube-apiserver、kube-scheduler、kube-controller-manager、cloud-controller-manager)配合使用。

对于最终用户来说,这非常有价值,因为控制平面升级会比节点升级快一些,而运行负载几乎总是需要更长的时间。

Kubernetes 的年度支持期已经使得年度升级成为可能。用户可以升级到最新的补丁版本以获取安全修复,并在每年进行 3 个连续的次要版本升级,以“赶上”最新支持的次要版本。

然而,由于当前节点和控制平面之间的测试/支持偏差仅限于 2 个版本,如果进行 3 个版本的升级,就需要将节点升级两次以保持在支持的偏差范围内。

正式发布:从非优雅节点关机中恢复

如果节点意外关机或进入不可恢复状态(可能是由于硬件故障或无响应的操作系统),Kubernetes 允许你进行后续清理,并允许有状态的工作负载在不同的节点上重新启动。对于 Kubernetes v1.28,这现在是一个稳定的功能。

这使得有状态的工作负载在原来节点关闭或处于不可恢复状态(如硬件故障或损坏的操作系统)后成功切换到其他节点。

早于 v1.20 版本的 Kubernetes 缺乏对 Linux 节点关机的处理,kubelet 与 systemd 集成并实现优雅的节点关机(测试版,并且默认启用)。然而,即使是有意义的关机也可能无法得到很好处理,可能是因为:

  • 节点运行 Windows
  • 节点运行 Linux,但使用不同的 init(非 systemd)
  • 关机未触发系统抑制锁机制
  • 由于节点级配置错误(例如未为 shutdownGracePeriod 和 shutdownGracePeriodCriticalPods 设置适当的值)。

当节点关机或故障,并且 kubelet 未检测到关机时,作为 StatefulSet 的一部分的 Pod 将停留在关闭的节点上处于终止状态。如果已停止的节点重新启动,该节点上的 kubelet 可以完成清理(删除)Kubernetes API 仍然认为绑定到该节点的 Pod。然而,如果节点保持停止状态 – 或者在重启后 kubelet 无法启动 – 那么 Kubernetes 可能无法创建替代的 Pod。当关闭的节点上的 kubelet 不可用以删除旧的 Pod 时,相关的 StatefulSet 无法创建新的 Pod(具有相同的名称)。

与存储相关的问题也存在。如果 Pod 使用了卷,现有的 VolumeAttachment 不会与原来的(现在已关闭的)节点解除关联,因此这些 Pod 使用的 PersistentVolumes 无法连接到其他健康的节点。结果,运行在受影响的 StatefulSet 上的应用程序可能无法正常工作。如果原来已关闭的节点重新启动,那么其 kubelet 将删除这些 Pod,并且可以在其他运行的节点上创建新的 Pod。如果原来节点不重新启动(在不可变基础架构[2]设计中常见),那么这些 Pod 将永远停留在关闭的节点上处于终止状态。

有关如何在非优雅节点关机后触发清理的更多信息,请阅读非优雅节点关机[3]

CustomResourceDefinition 验证规则的改进

CEL[4](Common Expression Language,通用表达式语言)可以用于验证自定义资源[5]。主要目标是允许大多数验证用例,以前可能需要你作为 CustomResourceDefinition(CRD)作者设计和实现 webhook。相反,作为一项测试功能,你可以直接将验证表达式添加到 CRD 的模式中。

CRD 需要直接支持非平凡验证。尽管准入 webhook 支持 CRD 验证,但它们显著增加了 CRD 的开发和可操作性的复杂性。

在 1.28 中,添加了两个可选字段 reason 和 fieldPath,以允许用户在验证失败时指定失败原因和字段路径。

要了解更多信息,请阅读 CRD 文档中的验证规则[6]

ValidatingAdmissionPolicies 升级为 beta

用于准入控制的 CEL 是对验证准入 webhook 的替代方法,可在 Kubernetes API 服务器上进行定制化、内部验证请求。

这建立在 CRD 验证规则功能的基础上,该功能在 1.25 中升级为 beta,但重点放在验证准入场控制的策略执行能力上。

这将降低实施可定制策略的基础设施障碍,并提供有助于社区建立和遵守 K8s 及其扩展的最佳实践的基本功能。

要使用ValidatingAdmissionPolicies[7],你需要在集群的控制平面中启用 admissionregistration.k8s.io/v1beta1 API 组和 ValidatingAdmissionPolicy 功能门。

准入 webhook 的匹配条件

Kubernetes v1.27 允许你为准入 webhook 指定匹配条件,从而可以缩小 Kubernetes 在准入时进行远程 HTTP 调用的范围。ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 的 matchCondition 字段是一个 CEL 表达式,必须对准入请求进行评估为 true 以将其发送到 webhook。

在 Kubernetes v1.28 中,该字段移至 beta,并且默认启用。

要了解更多信息,请参阅 Kubernetes 文档中的matchConditions[8]

Linux 上启用 swap 空间的测试支持(beta)

这以可控、可预测的方式向节点添加了对 swap 空间的支持,以便 Kubernetes 用户可以进行测试并提供数据,以继续在 swap 空间的基础上构建群集功能。

swap 空间有两种不同类型的用户,它们可能重叠:

  • 节点管理员可能希望 swap 空间可用于节点级性能调优、稳定性和降低噪声问题。
  • 应用程序开发人员编写的应用程序可能受益于使用 swap 内存。

混合版本代理(alpha 版)

当集群具有多个混合版本的 API 服务器(例如在升级/降级期间或运行时配置更改和部署发生时),并非每个 API 服务器都能为每个版本的每个资源提供服务。

在 Kubernetes v1.28,你可以在 API 服务器的聚合层中启用混合版本代理。混合版本代理会查找本地 API 服务器无法识别但控制平面中的另一个 API 服务器能够支持的请求。找到合适的对等体后,聚合层将请求代理到兼容的 API 服务器;对于客户端来说,这是透明的。

当对集群进行升级或降级时,一段时间内控制平面中的 API 服务器可能处于不同的版本;在这种情况下,不同的 API 服务器子集能够提供不同的内置资源集(不同的组、版本和资源都是可能的)。这种新的 alpha 机制允许你将这种差异对客户端隐藏起来。

控制平面组件的源代码重组织

Kubernetes 的贡献者已经开始对 kube-apiserver 的代码进行重新组织,构建一个基于新的暂存库的版本,该版本使用k/apiserver[9],但具有更大且经过精心选择的 kube-apiserver 功能子集,以便可重用。

这是一个渐进的重组织过程;最终将会有一个从 Kubernetes 的 API 服务器中抽象出来的通用功能的新的 git 仓库。

对容器的 CDI 注入的支持(alpha 版)

CDI 提供了一种标准化的方式,将复杂设备注入容器(即逻辑上需要多个/dev 节点才能使其正常工作的设备)。这个新功能允许插件开发者利用在 1.27 版本中添加到 CRI 的 CDIDevices 字段,直接将 CDI 设备传递给支持 CDI 的运行时(如 containerd 和 crio-o 在最近的发布中)。

对边车容器的 API 感知(alpha 版)

Kubernetes 1.28 引入了一个 alpha 版的 restartPolicy 字段,用于指示init 容器[10]同时也是边车容器的情况。它将以所定义的顺序启动具有 restartPolicy: Always 的 init 容器,以及其他 init 容器。与在启动 Pod 的主容器之前等待边车容器完成不同,kubelet 只会等待边车 init 容器启动。

启动完成的条件是启动探针成功(或者如果没有定义启动探针)并且 postStart 处理程序完成。这个条件用 ContainerStatus 类型的 Started 字段表示。有关选择此信号的考虑,请参阅“Pod 启动完成条件”部分。

对于 init 容器,你可以省略 restartPolicy 字段,或者将其设置为 Always。省略该字段意味着你希望一个真正的 init 容器在应用程序启动之前运行到完成。

边车容器不会阻塞 Pod 的完成:如果所有常规容器都完成了,该 Pod 中的边车容器将被终止。

对于边车容器来说,重启行为比 init 容器更复杂。对于 restartPolicy 设置为 Never 的 Pod,如果在 Pod 启动期间边车容器失败,它将不会重新启动,整个 Pod 将被视为失败。如果 Pod 的 restartPolicy 是 Always 或 OnFailure,无法启动的边车容器将重试。

一旦边车容器启动(进程正在运行,postStart 成功,并且任何配置的启动探针通过),然后发生故障,即使 Pod 的整体 restartPolicy 是 Never 或 OnFailure,该边车容器也将重新启动。此外,无论是在 Pod 终止期间还是在正常退出期间,边车容器都将重新启动。

要了解更多信息,请阅读有关边车容器的 API[11]

自动、回溯地分配默认的 StorageClass 升级到稳定版

如果你没有提供 PersistentVolumeClaim(PVC)的 storageClassName 值,Kubernetes 会自动为其设置 storageClassName。控制平面还会为任何没有定义 storageClassName 的现有 PVC 设置 StorageClass。之前的 Kubernetes 版本也具有此行为;对于 Kubernetes v1.28,它是自动的并且始终处于活动状态;该功能已经升级到稳定版(GA)。

要了解更多信息,请阅读 Kubernetes 文档中的StorageClass[12]

作业的 Pod 替换策略(alpha 版)

Kubernetes 1.28 为 Job API 添加了一个新字段,允许你指定控制平面在上一个 Pod 开始终止时立即创建新的 Pod(现有行为),或者只有在现有的 Pod 完全终止后才创建新的 Pod(新的、可选行为)。

许多常见的机器学习框架,如 Tensorflow 和 JAX,需要每个索引一个唯一的 Pod。在旧的行为下,如果属于索引作业的 Pod 进入终止状态(由于抢占、驱逐或其他外部因素),会创建一个替代的 Pod,但由于与尚未关闭的旧 Pod 的冲突,它立即无法启动。

在前一个 Pod 完全终止之前出现替代 Pod,也会在资源稀缺或预算资源紧张的集群中造成问题。这些资源可能很难获得,因此只有在现有的 Pod 被终止后,Pod 可能才能找到节点。如果启用了集群自动缩放器,提前创建替代 Pod 可能会导致不必要的扩容。

要了解更多信息,请阅读作业文档中关于延迟创建替代 Pod[13]的内容。

作业重试的退避限制,按索引分配(alpha 版)

这扩展了 Job API,以支持按索引分配退避限制的索引作业,并且即使其中一些索引失败,作业也可以继续执行。

目前,索引作业的索引共享一个共享的退避限制。当作业达到此共享的退避限制时,作业控制器将标记整个作业为失败,并清理资源,包括尚未完成运行的索引。

因此,现有的实现不能涵盖工作量真正易并行[14]的情况:每个索引完全独立于其他索引。

例如,如果索引作业被用作长时间运行的集成测试套件的基础,那么每个测试运行只能找到单个测试失败。

要了解更多信息,请阅读 Kubernetes 文档中有关处理 Pod 和容器故障[15]的内容。

CRI 容器和 pod 统计数据,不需要 cAdvisor

这涉及到两个相关的工作(kubelet 的/metrics/cadvisor 端点的更改和替代 summary API 的改进)。

消费者用于收集运行容器和 pod 统计数据的主要 API 有两个:summary API 和/metrics/cadvisor。Kubelet 负责实现 summary API,cadvisor 负责满足/metrics/cadvisor 的需求。

这将增强 CRI 实现,使其能够满足 Kubernetes 的所有统计需求。从高层来看,主要有两个方面:

  • 它通过增强 CRI API 的指标来直接从 CRI 补充 summary API 中的 pod 和容器字段。
  • 它增强了 CRI 实现,以广播所需的指标,满足/metrics/cadvisor 端点中的 pod 和容器字段。

Kubernetes v1.28 中的功能升级和弃用

升级为稳定版的功能

此版本中有总共 12 个升级为稳定版的增强功能:

  • kubectl events
  • 追溯默认的 StorageClass 分配
  • 非优雅节点关闭
  • 支持第三方设备监视插件
  • 获取自身用户属性的 Auth API
  • 代理终止端点
  • 扩展 DNS 配置
  • 清理 IPTables 链的所有权
  • 减少 iptables-restore 输入大小
  • 将 kubelet pod 资源端点升级为 GA
  • 扩展 podresources API 以报告可分配资源
  • 将 EndpointSlice Reconciler 移至 Staging

弃用和删除

删除:

  • 删除 GCE PD 的 CSI 迁移

弃用:

  • Ceph RBD in-tree 插件
  • Ceph FS 内 in-tree 插件

发布说明

有关 Kubernetes v1.28 发布的完整详细信息,请参阅我们的发布说明[16]

下载

Kubernetes v1.28 可在GitHub[17]上下载。要开始使用 Kubernetes,你可以使用minikube[18]kind[19]等本地 Kubernetes 集群运行。你也可以使用kubeadm[20]轻松安装 v1.28。

发布团队

Kubernetes 只有在其社区的支持、承诺和辛勤工作下才得以实现。每个发布团队都由专注的社区志愿者组成,他们共同努力构建组成你所依赖的 Kubernetes 发布的众多组成部分。这需要来自社区各个角落的人们的专业技能,从代码本身到其文档和项目管理。

我们要感谢整个发布团队为确保我们为社区提供一个稳定的 Kubernetes v1.28 版本而付出的辛勤工作。

特别感谢我们的发布负责人 Grace Nguyen,在整个平稳成功的发布周期中为我们提供指导。

生态系统更新

  • KubeCon + CloudNativeCon China 2023 将于 2023 年 9 月 26 日至 28 日在中国上海举行!你可以在活动网站[21]上找到关于会议和注册的更多信息。
  • KubeCon + CloudNativeCon North America 2023 将于 2023 年 11 月 6 日至 9 日在美国伊利诺伊州芝加哥举行!你可以在活动网站[22]上找到关于会议和注册的更多信息。

项目速度

CNCF K8s DevStats[23]项目汇总了与 Kubernetes 和各个子项目的发展速度有关的一些有趣数据。这包括从个人贡献到贡献的公司数量等各个方面的内容,展示了这个生态系统不断发展所需的广泛努力的深度和广度。

为期 14 周[24](5 月 15 日至 8 月 15 日)的 v1.28 发布周期中,我们看到来自911 家公司[25]1440 名个人[26]的贡献。

即将举行的网络研讨会

在 2023 年 9 月 14 日星期五上午 10 点(时区:PDT),加入 Kubernetes v1.28 发布团队的成员,了解此版本的主要功能,以及弃用和删除功能,为升级计划提供帮助。有关更多信息和注册,请访问 CNCF Online Programs 网站上的活动页面[27]

参与其中

参与 Kubernetes 最简单的方法,是加入与你的兴趣相吻合的许多特别兴趣小组[28](SIG)之一。

你有什么想要向 Kubernetes 社区广播的事情吗?在我们的每周社区会议[29]和以下渠道上分享你的声音:

  • Kubernetes 贡献者网站[30]上了解更多关于为 Kubernetes 做贡献的信息。
  • 在 Twitter 上关注我们的最新动态@Kubernetesio[31]
  • Discuss[32]加入社区讨论。
  • Slack[33]上加入社区。
  • Server Fault[34]上发布问题(或回答问题)。
  • 分享[35]你的 Kubernetes 故事。
  • 博客[36]上了解更多关于 Kubernetes 的最新动态。
  • 了解更多关于Kubernetes 发布团队[37]的信息。

参考资料

[1]Kubernetes v1.28 发布团队: https://github.com/kubernetes/sig-release/blob/master/releases/release-1.28/release-team.md

[2]不可变基础架构: https://glossary.cncf.io/immutable-infrastructure/

[3]非优雅节点关机: https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#non-graceful-node-shutdown

[4]CEL: https://github.com/google/cel-go

[5]自定义资源: https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/custom-resources/

[6]验证规则: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#validation-rules

[7]ValidatingAdmissionPolicies: https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/

[8]matchConditions: https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#matching-requests-matchconditions

[9]k/apiserver: https://github.com/kubernetes/apiserver

[10]init 容器: https://github.com/kubernetes/website/blob/main/content/en/docs/concepts/workloads/pods/init-containers.md

[11]边车容器的 API: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#api-for-sidecar-containers

[12]StorageClass: https://kubernetes.io/docs/concepts/storage/storage-classes/

[13]延迟创建替代 Pod: https://kubernetes.io/docs/concepts/workloads/controllers/job/#delayed-creation-of-replacement-pods

[14]易并行: https://en.wikipedia.org/wiki/Embarrassingly_parallel

[15]处理 Pod 和容器故障: https://kubernetes.io/docs/concepts/workloads/controllers/job/#handling-pod-and-container-failures

[16]发布说明: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.28.md

[17]GitHub: https://github.com/kubernetes/kubernetes/releases/tag/v1.28.0

[18]minikube: https://minikube.sigs.k8s.io/docs/

[19]kind: https://kind.sigs.k8s.io/

[20]kubeadm: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

[21]活动网站: https://www.lfasiallc.com/kubecon-cloudnativecon-open-source-summit-china/

[22]活动网站: https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/

[23]CNCF K8s DevStats: https://k8s.devstats.cncf.io/d/12/dashboards?orgId=1&refresh=15m

[24]为期 14 周: https://github.com/kubernetes/sig-release/tree/master/releases/release-1.28

[25]911 家公司: https://k8s.devstats.cncf.io/d/9/companies-table?orgId=1&var-period_name=v1.27.0%20-%20now&var-metric=contributions

[26]1440 名个人: https://k8s.devstats.cncf.io/d/66/developer-activity-counts-by-companies?orgId=1&var-period_name=v1.27.0%20-%20now&var-metric=contributions&var-repogroup_name=Kubernetes&var-repo_name=kubernetes%2Fkubernetes&var-country_name=All&var-companies=All

[27]活动页面: https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cncf-live-webinar-kubernetes-v128-release/

[28]特别兴趣小组: https://github.com/kubernetes/community/blob/master/sig-list.md

[29]每周社区会议: https://github.com/kubernetes/community/tree/master/communication

[30]Kubernetes 贡献者网站: https://www.kubernetes.dev/

[31]@Kubernetesio: https://twitter.com/kubernetesio

[32]Discuss: https://discuss.kubernetes.io/

[33]Slack: https://communityinviter.com/apps/kubernetes/community

[34]Server Fault: https://serverfault.com/questions/tagged/kubernetes

[35]分享: https://docs.google.com/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform

[36]博客: https://kubernetes.io/blog/

[37]Kubernetes 发布团队: https://github.com/kubernetes/sig-release/tree/master/release-team

转载请注明出处:https://www.cloudnative-tech.com/trends/5908.html

(0)
上一篇 2023年8月4日 下午4:42
下一篇 2023年8月18日 下午7:00

相关推荐

  • 解析云原生CNCF定义与核心概念

    云原生计算基金会(CNCF)是一个旨在推动云原生技术发展和应用的开源组织。本文将解析CNCF的定义和核心概念,包括云原生计算的含义、原则和核心组件。通过了解CNCF的目标和理念,读者可以更好地理解云原生计算的重要性和实践。

    2023年5月26日
    0
  • Kubeflow将MLOps引入CNCF孵化器

    Kubeflow进入CNCF孵化

    2023年8月4日
    0
  • 容器云OCI全球排名揭秘

    在全球容器云市场中,有许多公司和平台提供了各种各样的容器解决方案。其中,OCI(Open Container Initiative)是一个全球性的开放标准组织,致力于推动容器相关技术的标准化和互操作性。本文将揭秘OCI全球排名,并介绍Alauda ACP作为一款优秀的容器云平台的特点。

    2023年6月2日
    0
  • 云原生应用的12要素是什么?

    云原生应用的“12要素”是一组追求现代化软件开发的指导原则。它们旨在帮助开发人员构建高效、可扩展、可靠和易于管理的应用程序,在云环境下获得最佳效果。以下是这12个要素:

    2023年5月22日
    0
  • 什么是云原生安全?

    云原生安全是指在云原生环境中保护应用程序和基础设施免受安全威胁的一系列措施和实践。随着越来越多的组织将应用程序迁移到云原生架构中,安全性成为一个关键问题。云原生安全旨在确保应用程序在云环境中的安全性、保护用户数据的机密性和完整性,同时防止恶意攻击和数据泄露。

    2023年5月22日
    0