此版本距离上版本发布时隔 4 个⽉,是 2024 年的第⼆个版本。
与之前的版本类似,Kubernetes v1.31 版本引⼊了多项新的稳定、Beta 和 Alpha 版本的功能。⼀贯交付⾼质量版本的承诺凸显了 Kubernetes 社区的开发周期实⼒和社区的活跃⽀持。
此版本包含 45 项改进。在这些改进功能中,有 11 项已晋升为稳定版,另外有 22 项正在进⼊ Beta 阶段,以及最后的 12 项为 Alpha 阶段。
发布主题和 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 的下⼀个⼗年⼲杯!
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
进入 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 时, 也会删除存储系统中的数据卷。
这里需要注意的是:
不管制备方式是静态还是动态, 都会遵守 PersistentVolume 的回收策略。
若 PersistentVolume 的状态不是 Bound (即它未被任何 PersistentVolumeClaim 绑定), 不管回收策略是什么, 都不会删除存储系统中的数据卷。
对于 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 和结构化参数
删除 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 镜像的只读卷
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
如果提供了 :latest 标签作为引用, 则 pullPolicy 将默认为 Always, 而在任何其他情况下,如果未设置,它将默认为 IfNotPresent 卷作为只读 (ro) 和非可执行文件 (noexec) 挂载 不支持容器的子路径挂载 (spec.containers[*].volumeMounts.subpath) 字段 spec.securityContext.fsGroupChangePolicy 对此卷类型没有影响 若启用了特性门控 ImageVolume 和 AlwaysPullImages 准入插件, 那么 image 卷的拉取策略将受 AlwaysPullImages 准入插件的影响
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 社区贡献
【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
发行说明
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
https://kubernetes.io/zh-cn/blog/2024/06/06/10-years-of-kubernetes/
https://docs.portworx.com/portworx-enterprise/operations/operate-kubernetes/storage-operations/csi
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolume-deletion-protection-finalizer
https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/
https://issue.k8s.io/831
https://kubernetes.io/docs/concepts/storage/volumes/#image
https://events.linuxfoundation.org/kubecon-cloudnativecon-open-source-summit-ai-dev-china/
本文作者
「DaoCloud 道客」开源工程师
Kubernetes SIG storage reviewer、Kubernetes-csi reviewer、Karmada reviewer
热门推荐
访问以下网址,或点击文末【阅读原文】立即体验
DaoCloud 公司简介
网址:www.daocloud.io
邮件:info@daocloud.io
电话:400 002 6898