Kubernetes 1.31 圆梦之路: 十年了, OCI 镜像借着 AI 的风终于加入 Volume 的大家庭 ~

科技   2024-08-13 19:20   上海  

预计太平洋时间 2024 年 8 ⽉ 13 ⽇,主题为 Elli 的 Kubernetes v1.31 将正式发布。

此版本距离上版本发布时隔 4 个⽉,是 2024 年的第⼆个版本。

与之前的版本类似,Kubernetes v1.31 版本引⼊了多项新的稳定、Beta 和 Alpha 版本的功能。⼀贯交付⾼质量版本的承诺凸显了 Kubernetes 社区的开发周期实⼒和社区的活跃⽀持。

此版本包含 45 项改进。在这些改进功能中,有 11 项已晋升为稳定版,另外有 22 项正在进⼊ Beta 阶段,以及最后的 12 项为 Alpha 阶段。

01

发布主题和 Logo

Kubernetes v1.31 的发布主题是“Elli”。


Kubernetes v1.31 的 Elli 是⼀只可爱⼜快乐的狗,⼼地善良,戴着⼀顶漂亮的⽔⼿帽,向庞大⽽多样化的 Kubernetes 贡献者⼤家庭发出俏⽪的眨眼。

让我们庆祝本次 v1.31 的发布,感谢社区伙伴在本次的里程碑中所作出的努力和贡献。和发布团队一样,我们也祝愿大家能在社区里找到属于自己的位置,一起构建更好的 Kubernetes 世界。

Kubernetes v1.31 标志着该项⽬成功庆祝第⼀个 10 周[1]后的⾸次发布。⾃成⽴以来,Kubernetes 已经⾛过了漫⻓的道路,⽽且随着每次发布,它仍在朝着令⼈兴奋的新⽅向前进。⼗年过去了,回顾⽆数 Kubernetes 贡献者的努⼒、奉献、技能、智慧和⾟勤⼯作,令⼈敬畏,正是他们让这⼀切成为现实。

然⽽,尽管运⾏该项⽬需要付出巨⼤的努⼒,但还是不乏⼈⼀次⼜⼀次地出现,他们满怀热情、⾯带微笑,为⾃⼰的贡献和成为社区⼀员⽽感到⾃豪。我们从新⽼贡献者身上看到的这种“精神”是⼀个充满活⼒的社区的标志,如果我们可以这样称呼它的话,这是⼀个“快乐”的社区

Kubernetes v1.31 的 Elli 就是为了庆祝这种美好的精神!让我们为 Kubernetes 的下⼀个⼗年⼲杯!

02

GA 和稳定的功能

GA 全称 General Availability,即正式发布。Kubernetes 的进阶路线通常是 Alpha、Beta、Stable (即 GA)、Deprecation/Removal,这四个阶段。

  • KEP-3762 持久卷的最新阶段转换时间功能, 记录 PersistentVolume 最后⼀次转换到不同阶段的时间戳https://kep.k8s.io/3762

  • KEP-2305 监控指标动态基数强制限制功能,限制标签允许值的数量来缓解基数爆炸,和缓解内存问题:https://kep.k8s.io/2305

  • KEP-3836 提⾼ Kube-proxy 服务的⼊⼝连接的可靠性:https://kep.k8s.io/3836

  • KEP-4009 设备插件的 API 添加对 CDI 设备的⽀持,允许设备插件提供⽅使⽤ CDI 定义容器化环境所需的修改:https://kep.k8s.io/4009

  • KEP-0024 AppArmor 支持:https://kep.k8s.io/24

  • KEP-3017 PDB 添加对不健康的 Pod 驱逐策略的⽀持,通过⽤户提供的配置信息,来防⽌被保护的应⽤程序受到不可⽤和服务中断的影响:https://kep.k8s.io/3017

  • KEP-3329 扩展了 Job 的字段,以配置⽤于处理 Pod 故障的作业策略。它允许⽤户确定由基础结构错误引起的某些 pod 故障,并在不增加对 backoffLimit 的计数器的情况下重试它们。此外,它还允许⽤户确定由软件错误引起的某些 pod 故障,并提前终⽌关联的作业:https://kep.k8s.io/3329

  • KEP-3715 允许改变 Indexed 类 Job 的 spec.completions,前提是更新后的值等于 spec.parallelism:https://kep.k8s.io/3715

  • KEP-3335 控制 StatefulSet 启动副本序号,允许在不中断底层应⽤程序的情况下迁移 StatefulSet:https://kep.k8s.io/3335

  • KEP-2185 ReplicaSet 控制器的缩减 Pod 受害者选择算法的随机⽅法,以减轻故障域之间的 ReplicaSet 不平衡:https://kep.k8s.io/2185
03

进入 Beta 阶段的功能

Beta 阶段的功能是指那些已经经过 Alpha 阶段的功能, 且在 Beta 阶段中添加了更多的测试和验证, 通常情况下是默认启用的。

  • KEP-2589 Portworx 卷/持久卷支持 CSI 迁移:https://kep.k8s.io/2589
  • KEP-2644 始终遵守 PersistentVolume 回收策略,防止 PersistentVolume 删除后,存储系统中的数据卷依然存在的情况:https://kep.k8s.io/2644
  • KEP-3633 将 MatchLabelKeys 和 MismatchLabelKeys 引入 PodAffinity 和 PodAntiAffinity,能够在现有 LabelSelector 之上精细控制 Pod 预期共存 (PodAffinity) 或不共存 (PodAntiAffinity) 的范围:https://kep.k8s.io/2644
  •  KEP-3866 Kube-proxy 基于 nftables(Linux Kernel 社区对 iptables 的替代)实现了新的后端,旨在解决 iptables 现存的性能问题:https://kep.k8s.io/3866
  • KEP-4358 自定义资源字段选择器,允许为自定义资源类型设置预定义的字段选择配置,客户端可以使用前面预设的字段选择器来过滤资源:https://kep.k8s.io/4358
  • KEP-4420 当生成的名称与现有资源名称冲突时,Kube-apiserver 会自动重试使用 generateName 的创建请求,最多重试 7 次:https://kep.k8s.io/4420
  • KEP-4444 服务流量分配, 在 Service 中实现了一个新字段,作为底层实现在制定路由决策时要考虑的偏好或提示:https://kep.k8s.io/4444
  • KEP-4006 将 Kubernetes 客户端的双向流协议从 SPDY/3.1 转换为 WebSockets:https://kep.k8s.io/4006
  • KEP-4193 改进绑定的服务帐户令牌, 自动将 Pod 关联的节点的 name 和 uid (通过 spec.nodeName )嵌入到生成的令牌中,并允许用户获取专门与 Node 对象生命周期相关的令牌:https://kep.k8s.io/4193
  • KEP-4033 增加了容器运行时指示 kubelet 使用哪个 cgroup 驱动程序的能力,无需在 kubelet 配置中指定 cgroup 驱动程序,并消除 kubelet 和运行时之间 cgroup 驱动程序配置不一致的可能性:https://kep.k8s.io/4033
  • KEP-4622 向 kubelet 添加一个配置选项,允许在 TopologyManager 中配置 maxAllowableNUMANodes 的值:https://kep.k8s.io/4622
  • KEP-1880 管理 Kubernetes Service 的 IP 范围 (因依赖 Beta API, 默认关闭):https://kep.k8s.io/1880
  • KEP-4568 启用弹性监视缓存初始化以避免控制平面过载:https://kep.k8s.io/4568
  • KEP-4292 在 kubectl debug 命令中的预定义配置文件之上添加了新的自定义配置文件功能,使kubectl debug pod/node 或临时容器规范可配置:https://kep.k8s.io/4292
  • KEP-3751 允许用户在配置/绑定持久卷后动态修改卷属性,例如 IOP 和吞吐量,可变卷属性名及值规范来自存储系统,不同存储系统间可能不通用 (因依赖 Beta API,默认关闭):https://kep.k8s.io/3751
  • KEP-4265 允许用户选择退出 Linux 容器的 CRI 屏蔽 /proc (因依赖默认关闭的 Beta 功能 UserNamespacesSupport,导致默认关闭):https://kep.k8s.io/4265
  • KEP-3857 递归的只读挂载:https://kep.k8s.io/3857
  • KEP-3998 Job 添加自定义的 Job 成功策略的支持,一旦 Job 满足成功策略,其余的 Pod 将被终止:https://kep.k8s.io/3998
  • KEP-1029 使用文件系统配额监控本地临时存储的利用率:https://kep.k8s.io/1029

这是有关 Beta 的更新总览,下文择取了部分特性详述。如果对其他特性感兴趣,请移步至具体的 KEP 页面了解进展和详情。

KEP-2589 Portworx 卷/持久卷支持 CSI 迁移

如果您的集群中使用了 Portworx 树内卷, 那么在升级到 Kubernetes 1.31 版本前, 您需要注意以下事项:

  • 可以通过将 CSIMigrationPortworx 功能门控设置为 false 来禁用 Portworx 卷的 CSI 迁移。

  • 在测试集群上安装 Portworx CSI 驱动程序[2],并测试已有的 Portworx 卷是否可以正常工作。Kubernetes e2e 测试不包含此部分, 但通过了本地测试和 Portworx 的支持团队确认。为了确保您的集群在升级后不会受到影响, 请在升级之前自行测试您的集群。

KEP-2644 始终遵守 PersistentVolume 回收策略

当 PersistentVolume 的状态为 Bound 时, 若 PersistentVolume 先于 PersistentVolumeClaim 被删除, 依然会根据 PersistentVolume 的回收策略来处理 PersistentVolume。在 Kubernetes 1.31 版本中, 当 PersistentVolume 的回收策略为 Delete 时, 也会删除存储系统中的数据卷。

这里需要注意的是:

  1. 不管制备方式是静态还是动态, 都会遵守 PersistentVolume 的回收策略。

  2. 若 PersistentVolume 的状态不是 Bound (即它未被任何 PersistentVolumeClaim 绑定), 不管回收策略是什么, 都不会删除存储系统中的数据卷。

  3. 对于 CSI 类型的 PersistentVolume, 需将 CSI 驱动程序 external-provsioner 升级到支持此功能的版本 v5.0.2+。

更多关于 PersistentVolume 删除保护的信息, 请参考 Kubernetes 文档[3]

KEP-4622 向 kubelet 添加一个配置选项

--max-allowable-numa-nodes 是一个新的 kubelet 配置选项,用于配置 TopologyManager 中的 maxAllowableNUMANodes 的值。默认情况下,maxAllowableNUMANodes 的值为 8。这个值是在 4 年前作为权宜之计添加的,用于缓解在尝试枚举可能的 NUMA 关联并生成其提示时发生的状态爆炸。

通过使此设置可配置,我们使用户能够在适当时增加此限制。管理员现在可以允许具有 8 个以上 NUMA 节点的节点在启用 TopologyManager 的情况下运行。当然, 它会减慢节点上的 Pod 准入/启动时间, 这是因为 kubelet 的 TopoolgyManager 在决定 cpu 和设备可以以对齐方式分配到哪里时需要考虑更多组合。该功能在节点级别, 减速仅影响配置了该功能的节点,不会对集群产生任何影响。

04

进入 Alpha 阶段的功能

  • KEP-2340 监视缓存提供一致的数据视图, 提高 Kubernetes 对于 Get 和 List 请求的可扩展性和性能 尝试升至 Beta 后, 因性能问题被回退至 Alpha 阶段:https://kep.k8s.io/2340

  • KEP-4601 授权属性将扩展为包括列表、监视和删除集合中的字段选择器和标签选择器。这将允许授权者在做出授权决定时使用这些选择器:https://kep.k8s.io/4601

  • KEP-4633 仅允许对配置的端点进行匿名身份验证:https://kep.k8s.io/4633

  • KEP-3063 使用控制平面控制器进行动态资源分配 (DRA):https://kep.k8s.io/3063

  • KEP-4176 一种新的静态策略,优先分配同一插槽上不同 CPU 的核心:https://kep.k8s.io/4176

  • KEP-4381 借助结构化参数,kube-scheduler 和 Cluster Autoscaler 可以自行处理和模拟声明分配,而无需依赖第三方驱动程序:https://kep.k8s.io/4381

  • KEP-4639 新增基于 OCI 镜像的只读卷:https://kep.k8s.io/4639

  • KEP-3619 细粒度的补充组控制:https://kep.k8s.io/3619

  • KEP-4192 移动存储版本迁移器到主库:https://kep.k8s.io/4192

  • KEP-4680 将资源运行状况状态添加到设备插件和 DRA 的 Pod 状态:https://kep.k8s.io/4680

  • KEP-4368 支持 Job 的 ManagedBy 字段:https://kep.k8s.io/4368

这是有关 Alpha 的更新总览,下文择取了部分特性详述。如果对其他特性感兴趣,请移步至具体的 KEP 页面了解进展和详情。

KEP-3063/KEP-4381 DRA 和结构化参数

DRA 相关的 API 定义在 v1alpha3 对 API 进行了彻底的改造。因此不再支持从 v1alpha2 过渡到 v1alpha3,所以 1.29 和 1.30 中该 API 的往返测试数据将被删除。
一些主要变化如下:
  • 删除 CRD 支持。供应商配置参数仍支持作为树内类型的原始扩展字段。
  • 移除了对即时分配的支持。它对于结构化参数毫无意义, 对于经典 DRA 的论证也很薄弱。
  • 移除 claim.status.sharable字段, 当多个 Pod 引用它们时,可以共享所有声明。但共享程度不得超过“reserverFor”数组的大小限制。
  • 删除了 “设备模型” 的概念以及仅适用于此类模型的选择机制。
  • ResourceClaim 不再是一个关联一个 ResourceClaimClass (已移除),而是 ResourceClaim 内部的各个设备请求现在引用一个 DeviceClass。
  • 支持 “匹配属性”。
  • 支持 “管理员访问权限”。
  • 支持 “分区设备”。
  • 每个请求支持多个设备(“全部” 和固定数量)。
  • 支持容器从 Claim 的某个请求中选择设备,而不是选择 Claim 公开的所有设备。
  • 支持具有结构化参数的网络连接设备。
  • 重命名 ResourceSlice 为 ResourcePool, 引入了池的概念。

社区提供了一个示例 DRA 驱动程序,它旨在演示如何构造 DRA 资源驱动程序并将其包装在 helm 图表中的最佳实践。开发人员可以对其进行分叉和修改,以开始编写自己的驱动程序。仓库地址为 https://github.com/kubernetes-sigs/dra-example-driver。

关于 DRA 的更多信息,请参考 Kubernetes 文档[4]

KEP-4639 新增基于 OCI 镜像的只读卷

早在 2014 年, 社区就有人提出了类似想法, 但直到 2024 年, 借着 AI 的需求才正式加入到 Kubernetes 中。相关讨论见 Kubernetes Issue #831[5]
需要在 kube-apiserver 和 kubelet 上启用特性门控 ImageVolume 才能正常运行, 并且容器运行时支持该功能(如 CRI-O ≥ v1.31), 则可以创建如下所示的示例 pod.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
    - name: test
      image: registry.k8s.io/e2e-test-images/echoserver:2.3
      volumeMounts:
        - name: volume
          mountPath: /volume
  volumes:
    - name: volume
      image:
        reference: quay.io/crio/artifact:v1
        pullPolicy: IfNotPresent
数据科学家、MLOps 工程师或 AI 开发人员可以将大型语言模型权重或机器学习模型权重与模型服务器一起安装在 Pod 中,以便他们可以有效地提供它们,而无需将它们包含在模型服务器容器映像中。他们可以将这些内容打包到 OCI 对象中,以利用 OCI 分发并确保高效的模型部署。这使他们能够将模型规格/内容与处理它们的可执行文件分开。
  • 如果提供了 :latest 标签作为引用, 则 pullPolicy 将默认为 Always, 而在任何其他情况下,如果未设置,它将默认为 IfNotPresent
  • 卷作为只读 (ro) 和非可执行文件 (noexec) 挂载
  • 不支持容器的子路径挂载 (spec.containers[*].volumeMounts.subpath)
  • 字段 spec.securityContext.fsGroupChangePolicy 对此卷类型没有影响
  • 若启用了特性门控 ImageVolume 和 AlwaysPullImages 准入插件, 那么 image 卷的拉取策略将受 AlwaysPullImages 准入插件的影响
更多关于只读卷的信息, 请参考 Kubernetes 文档[6]

05

删除和废弃

  • KEP-4569 对 cgroup v1 的支持移至维护模式, 弃用路径与当初的 Dockershim 基本相似:https://kep.k8s.io/4569
  • KEP-4004 弃用 v1.Node 的 status.nodeInfo.kubeProxyVersion 字段:https://kep.k8s.io/4004
  • GODEBUG 和对 SHA-1 证书的支持将 在 2025 年上半年发布的 go 1.24 版本中完全消失, 如果你依赖 SHA-1 证书,请开始放弃使用它们:https://github.com/kubernetes/kubernetes/issues/125689
  • 删除 kubelet --keep-terminated-pod-volumes 命令行标志
  • 删除 CephFS、Ceph RBD 卷插件
  • kube-scheduler 中非 CSI 卷限制插件的弃用 (AzureDiskLimits、CinderLimits、EBSLimits 及 GCEPDLimits), 如果已在调度器配置中显式使用已弃用的插件, 请用 NodeVolumeLimits 插件替换它们
  • 删除云驱动集成的树内支持的最后剩余部分。这并不意味着你无法与某云驱动集成,只是你现在必须使用推荐的外部集成方法。一些集成组件是 Kubernetes 项目的一部分,其余集成组件则是第三方软件

06

DaoCloud 社区贡献

在 v1.31 的发布周期中,范宝发(carlory)成为了 Kubeadm Reviewer,他同时也是 SIG-Storage 和 CSI Reviewer
2024 年 8 月 21 日, 香港将举办为期三天的 KubeCon + CloudNativeCon + Open Source Summit + AI_dev China 2024 盛会[7], 以下是我司 Kubernetes 社区相关的几个主题:
  • 【Kubernetes 子项目 KWOK】主论坛演讲:
    支持在 Kubernetes 中使用 KWOK 进行大规模和可靠性测试 - Yuan Chen, NVIDIA & Shiming Zhang, DaoCloud
  • 【Kubernetes 子项目 Kubespray】Kubespray 大放异彩:
    在 Kubernetes 中为 LLM 和 RAG 部署裸金属服务 - Kay Yan, DaoCloud & Alan Leung, Equinix
  • 【Kubernetes 维护者主题】Kubernetes 维护者圆桌
    十年演变与未来趋势 - Paco Xu & Mengjiao Liu, DaoCloud; Qiming Teng, Freelance; Klaus Ma, Nvidia; Pengfei Ni, Microsoft

07

发行说明

上述内容就是 Kubernetes v1.31 的主要更新和内容啦,更多的发布说明可以查看 Kubernetes v1.31 版本的完整详细信息:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md。
我们下次版本发布时再见!

08

历史文档


点击文字可直接跳转至对应文档。

09

参考

  • Kubernetes 增强特性:https://kep.k8s.io/
  • Kubernetes 1.31 发布团队:https://github.com/kubernetes/sig-release/blob/master/releases/release-1.31
  • Kubernetes 1.31 变更日志:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md
  • Kubernetes 1.31 主题讨论:kubernetes/sig-release#2526

其他参考链接:
[1] Kubernetes 的十年:
https://kubernetes.io/zh-cn/blog/2024/06/06/10-years-of-kubernetes/
[2] Portworx CSI 驱动程序:
https://docs.portworx.com/portworx-enterprise/operations/operate-kubernetes/storage-operations/csi
[3] Kubernetes 文档(关于 PersistentVolume 删除保护):
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolume-deletion-protection-finalizer
[4] Kubernetes 文档(关于 DRA):
https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/
[5] Kubernetes Issue #831:
https://issue.k8s.io/831
[6] Kubernetes 文档(关于只读卷):
https://kubernetes.io/docs/concepts/storage/volumes/#image
[7] 香港 KubeCon 2024:
https://events.linuxfoundation.org/kubecon-cloudnativecon-open-source-summit-ai-dev-china/



 本文作者 



范宝发

「DaoCloud 道客」开源工程师

Kubernetes SIG storage reviewer、Kubernetes-csi reviewer、Karmada reviewer




热门推荐

            

访问以下网址,或点击文末【阅读原文】立即体验

d.run,让算力更自由
https://d.run/




DaoCloud 公司简介

「DaoCloud 道客」,云原生领域的创新领导者,成立于 2014 年底,凭借其自主知识产权的核心技术,成功打造了新一代云原生操作系统 DaoCloud Enterprise 5.0,致力于推动企业数字化、智能化转型。依托在云原生领域的技术积淀与持续创新,「DaoCloud 道客」推出 d.run 算力一体化解决方案,作为专业的技术提供商参与并推动多个区域算力枢纽中心的建设,为各行各业提供稳定、高效的算力支持。成立迄今,公司已在金融科技、先进制造、智能汽车、零售网点、城市大脑等多个领域深耕,标杆客户包括交通银行、浦发银行、上汽集团、格力集团、京东方、屈臣氏集团等。公司总部位于上海,并在新加坡、北京、深圳、成都、南京、武汉等地设立多家分公司及合资公司,总员工人数超过 300 人,是国家级“专精特新”小巨人企业、上海市高新技术企业,并入选了科创板培育企业名单。


网址:www.daocloud.io

邮件:info@daocloud.io

电话:400 002 6898



道客船长
分享云原生技术相关信息,助力开发者和企业云海扬帆!本公众号由 DaoCloud 负责运营
 最新文章