本文发表已超过一年。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已失效。

Kubernetes v1.27:悠然自得

公布 Kubernetes v1.27 发布,这是 2023 年的第一个版本!

此版本包含 60 项增强。其中 18 项增强进入 Alpha 阶段,29 项升级到 Beta,13 项升级到 Stable。

Kubernetes v1.27:悠然自得

Kubernetes v1.27 的主题是 Chill Vibes

这可能有点傻,但这个版本中发生了一些重要的转变,激发了这个主题。在典型的 Kubernetes 发布周期中,特性需要满足多个截止日期才能被包含在内。如果某个特性错过了其中任何一个截止日期,都可以走例外处理流程。处理这些例外是发布的正常一部分。但 v1.27 是有史以来第一个在增强冻结后没有收到任何例外请求的版本。即使随着发布的进行,事情也比我们习惯的要平静得多。

这次发布之所以能如此平静,有一个特定的原因,那就是大家在幕后为改进发布管理方式所付出的努力。这个主题正是为了庆祝这一点,感谢那些努力让社区变得更好的人们。

特别感谢Britnee Laverack 设计了徽标。Britnee 也为Kubernetes 1.24: Stargazer 设计了徽标。

新特性(主要主题)

冻结 k8s.gcr.io 镜像仓库

registry.k8s.io 替换旧的镜像仓库 k8s.gcr.io,后者已正式发布数月。Kubernetes 项目创建并运行 registry.k8s.io 镜像仓库,该仓库完全由社区控制。这意味着旧仓库 k8s.gcr.io 将被冻结,Kubernetes 及相关子项目的镜像将不再发布到旧仓库。

这项变化对贡献者意味着什么?

  • 如果你是子项目的维护者,你需要更新你的 Manifest 和 Helm Chart 以使用新的仓库。更多信息请参考 此项目

这项变化对最终用户意味着什么?

  • Kubernetes v1.27 版本将不会发布到 k8s.gcr.io 仓库。

  • v1.24v1.25v1.26 的补丁版本在四月之后将不再发布到旧仓库。

  • 从 v1.25 版本开始,默认镜像仓库已设置为 registry.k8s.io。此值可在 kubeadm 和 kubelet 中覆盖,但四月之后,对于新版本,将其设置为 k8s.gcr.io 将会失败,因为新版本将不会存在于旧仓库中。

  • 如果你想提高集群的可靠性并移除对社区拥有的仓库的依赖,或者你正在外部流量受限的网络中运行 Kubernetes,你应该考虑托管本地镜像仓库镜像。一些云厂商可能会为此提供托管解决方案。

SeccompDefault 升级到 Stable

要使用 seccomp profile 默认设置,你必须在想要使用它的每个节点上运行 kubelet 时启用 --seccomp-default 命令行标志。如果启用,kubelet 默认将使用由容器运行时定义的 RuntimeDefault seccomp profile,而不是使用 Unconfined(seccomp 禁用)模式。默认 profile 旨在提供一套强大的安全默认设置,同时保留工作负载的功能。不同的容器运行时及其发布版本之间的默认 profile 可能有所不同。

你可以在相关的 Kubernetes Enhancement Proposal (KEP) 中找到关于可能的升级和降级策略的详细信息:默认启用 seccomp

Jobs 的可变调度指令升级到 GA

此功能在 v1.22 中引入,最初是 Beta 级别,现在已达到 Stable。在大多数情况下,并行 Job 会希望 Pod 在满足约束的情况下运行,例如都在同一个区域,或者都在 GPU 模型 x 或 y 上,但不能混用。suspend 字段是实现这些语义的第一步。suspend 允许自定义队列控制器决定 Job 何时开始。然而,一旦 Job 取消暂停,自定义队列控制器对 Job 的 Pod 实际落在何处没有影响。

此功能允许在 Job 启动之前更新其调度指令,这使得自定义队列控制器能够在影响 Pod 位置的同时,将实际的 Pod 到节点分配任务卸载给 kube-scheduler。这只允许对之前从未取消暂停过的、处于暂停状态的 Job 进行。Job 的 Pod 模板中可以更新的字段包括节点亲和性、节点选择器、容忍度、标签、注解和 调度门(scheduling gates)。更多详情请参阅 KEP:允许更新 Job 的调度指令

DownwardAPIHugePages 升级到 Stable

在 Kubernetes v1.20 中,downward API 添加了对 requests.hugepages-<pagesize>limits.hugepages-<pagesize> 的支持,以便与 cpu、内存和临时存储等其他资源保持一致。此功能在此版本中升级到 Stable。你可以在 KEP 中找到更多详情:Downward API HugePages

Pod Scheduling Readiness 进入 Beta

Pod 创建后即可调度。Kubernetes 调度器会尽职地寻找节点来放置所有待处理的 Pod。然而,在实际场景中,某些 Pod 可能会长时间处于“缺少必要资源” (missing-essential-resources) 的状态。这些 Pod 实际上会不必要地搅动调度器(以及下游集成者,如 Cluster Autoscaler)。

通过指定/移除 Pod 的 .spec.schedulingGates,你可以控制 Pod 何时准备好被调度器考虑。

schedulingGates 字段包含一个字符串列表,每个字符串字面量被视为 Pod 在被视为可调度之前必须满足的条件。此字段只能在 Pod 创建时初始化(由客户端或在准入期间变动)。创建后,每个调度门可以按任意顺序移除,但不允许添加新的调度门。

通过 Kubernetes API 访问节点日志

此功能通过允许集群管理员查询服务日志来帮助他们调试在节点上运行的服务问题。要使用此功能,请确保该节点上启用了 NodeLogQuery Feature Gate,并且 kubelet 配置选项 enableSystemLogHandlerenableSystemLogQuery 都设置为 true。在 Linux 上,我们假定服务日志可以通过 journald 获取。在 Windows 上,我们假定服务日志在应用日志提供程序中可用。你还可以分别从 Linux 和 Windows 上的 /var/log/C:\var\log 目录中获取日志。

集群管理员可以在其集群的所有节点或部分节点上试用此 Alpha 功能。

ReadWriteOncePod PersistentVolume 访问模式进入 Beta

Kubernetes v1.22PersistentVolumes (PVs) 和 PersistentVolumeClaims (PVCs) 引入了一个新的访问模式 ReadWriteOncePod。此访问模式允许你将卷访问限制到集群中的单个 Pod,确保在任何时候只有一个 Pod 可以写入该卷。这对于需要单写入者存储访问的有状态工作负载特别有用。

ReadWriteOncePod Beta 版本增加了对使用 ReadWriteOncePod PVC 的 Pod 进行调度器抢占的支持。调度器抢占允许高优先级 Pod 抢占低优先级 Pod。例如,当一个带有 ReadWriteOncePod PVC 的 Pod (A) 被调度时,如果发现另一个 Pod (B) 正在使用相同的 PVC 且 Pod (A) 优先级更高,调度器将返回 Unschedulable 状态并尝试抢占 Pod (B)。更多背景信息,请参阅 KEP:ReadWriteOncePod PersistentVolume 访问模式

滚动升级后尊重 PodTopologySpread

matchLabelKeys 是用于选择计算散布目标 Pod 的 Pod 标签键列表。这些键用于从 Pod 标签中查找值。这些键值标签与 labelSelector 进行 AND 运算,以选择现有 Pod 组,并基于此组计算新 Pod 的散布。Pod 标签中不存在的键将被忽略。Null 或空列表意味着仅与 labelSelector 匹配。

有了 matchLabelKeys,用户无需在不同修订版本之间更新 pod.spec。控制器/操作符只需要为不同修订版本设置相同 label 键的不同值。调度器将根据 matchLabelKeys 自动推断出这些值。例如,如果用户使用 Deployment,他们可以使用 Deployment 控制器自动添加的、以 pod-template-hash 为键的标签,来区分同一个 Deployment 中的不同修订版本。

使用挂载加速 SELinux 卷重打标签

在此版本中,SELinux 标签应用于 Pod 使用的卷的方式已进入 Beta 阶段。此功能通过挂载带有正确 SELinux 标签的卷来加速容器启动,而不是递归地更改卷上的每个文件。支持 SELinux 的 Linux 内核允许通过 -o context= 挂载选项在卷的首次挂载时为整个卷设置 SELinux 标签。这样,所有文件将在恒定时间内获得指定的标签,而无需递归遍历整个卷。

context 挂载选项不能应用于绑定挂载或已挂载卷的重新挂载。对于 CSI 存储,CSI 驱动程序执行卷的首次挂载,因此必须由 CSI 驱动程序实际应用此挂载选项。我们在 CSIDriver 对象中添加了一个新字段 SELinuxMount,以便驱动程序可以宣布它们是否支持 -o context 挂载选项。

如果 Kubernetes 知道 Pod 的 SELinux 标签,并且负责 Pod 卷的 CSI 驱动程序宣布 SELinuxMount: true,并且该卷的访问模式为 ReadWriteOncePod,则它会要求 CSI 驱动程序使用 context= 挂载选项挂载该卷,并且会告诉容器运行时不要对卷的内容重新打标签(因为所有文件都已经有正确的标签)。从 KEP 中获取更多信息:使用挂载加速 SELinux 卷重打标签

更健壮的 VolumeManager 重建进入 Beta

这是一个卷管理器重构,允许 Kubelet 在 Kubelet 启动期间填充有关现有卷如何挂载的附加信息。总的来说,这使得卷清理更加健壮。如果在节点上启用 NewVolumeManagerReconstruction 特性门控,则在 Kubelet 启动期间会获得增强的已挂载卷发现能力。

在 Kubernetes v1.25 之前,Kubelet 在启动期间发现已挂载卷时使用了不同的默认行为。如果禁用此特性门控(默认已启用),则选择旧版发现行为。

在 Kubernetes v1.25 和 v1.26 中,此行为切换是 SELinuxMountReadWriteOncePod 特性门控的一部分。

可变 Pod 调度指令进入 Beta

这允许修改因调度就绪门控而受阻的 Pod,使其具有更受限的节点亲和性/选择器。它提供了在 Pod 获准调度之前修改其调度指令的能力,并允许外部资源控制器影响 Pod 放置,同时将实际的 Pod 到节点分配任务交给 kube-scheduler 处理。

这为向 Kubernetes 添加调度功能打开了新的途径。具体来说,构建实现 kube-scheduler 不支持的功能的轻量级调度器,同时依靠现有的 kube-scheduler 来支持所有上游功能并处理 Pod 到节点的绑定。如果自定义功能不需要实现调度插件(这需要重建和维护自定义 kube-scheduler 二进制文件),则此模式应为首选。

Kubernetes v1.27 中的特性升级和废弃

升级到 Stable

此版本共有 9 项增强功能晋升到 Stable

废弃和移除

此版本进行了多项移除

发布说明

Kubernetes v1.27 发布的完整详细信息可在我们的发布说明中找到。

可用性

Kubernetes v1.27 已可在 GitHub 上下载。要开始使用 Kubernetes,你可以使用 minikubekind 等工具运行本地 Kubernetes 集群。你也可以使用 kubeadm 轻松安装 v1.27。

发布团队

Kubernetes 的成功离不开社区的支持、投入和辛勤工作。每个发布团队都由专注的社区志愿者组成,他们协同工作,构建构成你所依赖的 Kubernetes 版本所需的许多组件。这需要来自社区各个角落、具有专业技能的人员,从代码本身到文档和项目管理。

特别感谢我们的发布负责人 Xander Grzywinski,他指导我们顺利完成了发布周期,以及所有发布团队成员相互支持、努力工作为社区带来了 v1.27 版本。

生态系统更新

  • KubeCon + CloudNativeCon Europe 2023 将于 2023 年 4 月 17 日至 21 日在荷兰阿姆斯特丹举行!有关会议和注册的更多信息,请访问活动网站
  • cdCon + GitOpsCon 将于 2023 年 5 月 8 日和 9 日在加拿大温哥华举行!有关会议和注册的更多信息,请访问活动网站

项目进展速度

CNCF K8s DevStats 项目汇总了与 Kubernetes 和各种子项目的进展速度相关的一些有趣数据点。这包括从个人贡献到贡献公司数量的所有内容,并说明了演进这个生态系统所需的投入的深度和广度。

在运行了 14 周(1 月 9 日至 4 月 11 日)的 v1.27 发布周期中,我们看到了来自 1020 家公司1603 名个人的贡献。

即将举行的发布网络研讨会

美国太平洋时间 2023 年 4 月 14 日星期五上午 10 点,加入 Kubernetes v1.27 发布团队成员,了解此版本的主要特性以及废弃和移除内容,以帮助规划升级。更多信息和注册,请访问 CNCF 在线项目网站上的活动页面

参与其中

参与 Kubernetes 的最简单方法是加入众多与你兴趣相关的特别兴趣小组 (SIG)。

有什么想向 Kubernetes 社区广播的吗?在我们的每周社区会议上和通过以下渠道分享你的声音