Kubernetes 1.22,颠覆你的想象:可启用Swap,推出PSP替换方案,还有……

​太平洋时间 2021 年 8 月 4 日,Kubernetes 1.22 正式发布,这是 2021 年的第二个版本。此版本包含 53 项增强功能「1.21版本 51 个、1.20 版本 43 个」:13 项增强功能已升级到稳定版,24 项增强功能正在进入 beta 版,16 项增强功能正在进入 Alpha 版,还有 3 项功能已经被弃用。值得注意的是,从今年 4 月开始,Kubernetes 的发布节奏正式从每年 4 次发布变为每年 3 次发布。1.21 版本是与该更改相关的第一个较长周期的版本。随着 Kubernetes 项目的成熟,每个周期的增强功能数量会增加。这在贡献者社区和发布工程团队中体现为从版本到版本的更多工作,并且它会给最终用户社区带来压力,要求他们及时了解包含越来越多功能的版本。
将发布节奏从每年四个版本更改为三个版本可以在许多方面平衡项目,包括如何管理贡献和版本,以及社区规划升级和保持最新状态的能力。

您可以在官方博客文章 Kubernetes Release Cadence Change: Here’s What You Need To Know 中阅读更多内容。

🔗官方博客文章:https://kubernetes.io/blog/2021/07/20/new-kubernetes-release-cadence/

Kubernetes 1.22版本在多个方面实现重大突破,主要围绕以下主题进行:

01
重要功能

>>>

1.1. 支持启用节点 Swap

在 Kubernetes 1.22 之前,节点不支持使用内存交换,如果在节点上检测到交换,kubelet 将默认无法启动。每个系统管理员或 Kubernetes 用户在设置和使用 Kubernetes 方面都采用同一种方式:禁用交换空间。从 1.22 开始,可以在每个节点上启用内存交换 alpha功能支持。此更改允许管理员选择在 Linux 节点上配置交换,将块存储的一部分视为额外的虚拟内存。要在节点上启用交换,必须在 kubelet 上启用 NodeSwap 功能门,并且 –fail-swap-on 命令行标志或 failSwapOn 配置设置必须设置为 false。
启用 swap 支持可以提高节点稳定性、换出启动内存的长时间运行的应用程序、提高内存灵活性、充分利用具有快速存储的本地开发和系统、以及降低低使用率系统的内存开销。

1.2. PodSecurity admission(替换 PodSecurityPolicy)

云原生环境的安全性一直是被关心的话题。云原生安全的重要性不言而喻。自 Kubernetes v1.21 起,PSP 已弃用,未来会在 1.25 中移除。因此在 Kubernetes 1.22 引入一个新的准入控制器 PodSecurity admission,用于在命名空间中的 Pod 上实施 Pod 安全标准,以替换废弃的 PSP。
PodSecurity admission 可以定义 Pod 的不同隔离级别。新标准会以更清晰统一的方式对 Pod 的行为进行限制。
🔗 PodSecurity admission:https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/2579-psp-replacement

1.3.  ProbeTerminationGracePeriod 进入 beta 

允许用户覆盖 Pod level 的 terminationGracePeriod,该功能在 Kubernetes 1.21 进入 alpha,kubernetes 1.22 版本进入 beta。
Pod spec 和容器探针上的 TerminationGracePeriodSeconds 不应为负数。TerminationGracePeriodSeconds 的负值将被视为默认值 “1s”。不可变字段验证将放宽以更新负值。

1.4. 支持内存资源的分配和隔离

内存作为不可压缩资源,在节点内存不足时会触发 OOM Killer,在节点内存紧张时可能会导致 Pod 申请内存速度慢。而Kubernetes 最初使用 v1 cgroups API,它不能限制 Pod 内存申请速度,也不能做到真正的预留,无法解决此类Memory QoS 问题,因此 Pod 的 QoS 类仅适用于 CPU 资源(例如 cpu_shares)。而 Kubernetes v1.22 现在可以使用 cgroups v2 API 来控制内存申请速度、预留和隔离。
此功能在 1.22 为 alpha 版, 旨在内存资源争用时提高工作负载和节点可用性,并提高容器生命周期的可预测性。此功能可以通过功能门 MemoryQoS 启用。

1.5.  服务器端应用(Server-Side Apply)升级到 GA

服务器端应用(Server-Side Apply) 是一种新的对象合并算法,以及字段所有权的跟踪,运行在 Kubernetes API 服务器上。服务器端应用协助用户、控制器通过声明式配置的方式管理他们的资源。客户端可以发送完整描述的目标(A fully specified intent), 声明式地创建和/或修改对象。在经过几个版本的 bata 版本之后,服务器端应用现在可以稳定使用。

1.6. etcd 升级至 3.5.0

Kubernetes 默认后端存储—— etcd 有一个新版本: 3.5.0。新版本改进了安全性、性能、监控和开发人员体验。有许多错误修复和一些关键的新功能,例如迁移到结构化日志记录和内置日志轮换。该版本附带了详细的未来路线图,包含了流量过载的解决方案。完整和详细的更改列表可以在 etcd 3.5.0 发布公告 中阅读。
🔗 etcd 3.5.0:https://etcd.io/blog/2021/announcing-etcd-3.5/

1.7. External credential providers 升为稳定版本

Kubernetes client credential plugins 自 1.11 以来一直处于 beta 阶段,随着 Kubernetes 1.22 的发布,现在进入稳定版本。GA 功能集包括对提供交互式登录流程的插件的改进支持,以及许多问题修复。如果感兴趣,查看示例项目 sample-exec-plugin 开始构建属于您的插件。
🔗 sample-exec-plugin:https://github.com/ankeesler/sample-exec-plugin

1.8. Windows 增强功能

为了继续支持不断发展的开发者社区,SIG Windows 发布了他们的开发环境。 这些新工具支持多个 CNI 提供者并且可以在多个平台上运行。通过编译 Windows kubelet 和 kube-proxy,然后将它们与其他 Kubernetes 组件的日常构建一起使用,这是一种从头开始运行前沿 Windows 功能的新方法。
CSI 对 Windows 节点的支持在 1.22 版本中移至 GA。在 Kubernetes v1.22 中,Windows 特权容器是一项 alpha 功能。为了允许在 Windows 节点上使用 CSI 存储,CSIProxy 允许将 CSI 节点插件部署为非特权 pod,使用代理在节点上执行特权存储操作。

1.9. seccomp 默认配置文件

Kubelet 中添加了默认 seccomp 配置文件(alpha) 功能,以及新的命令行标志和配置。使用时,此新功能提供集群范围的 seccomp 默认值,使用 RuntimeDefault seccomp 配置文件而不是默认情况下 Unconfined。这增强了 Kubernetes 部署的默认安全性。要了解有关该功能的更多信息,请参阅官方 seccomp 教程。
🔗 seccomp 教程:https://kubernetes.io/docs/tutorials/clusters/seccomp/#enable-the-use-of-runtimedefault-as-the-default-seccomp-profile-for-all-workloads

1.10. 使用 kubeadm 实现更安全的控制平面

RootlessControlPlane alpha 功能允许以非 root 用户身份运行 kubeadm 控制平面组件。这是 kubeadm 中长期要求的安全措施。要尝试此功能,则必须启用 kubeadm 特定的 RootlessControlPlane 功能门。当您使用此 RootlessControlPlane alpha 功能部署集群时,您的控制平面以较低的权限运行。

02
其他所需了解的功能

  • [security]绑定 Service Account Token 卷功能 GA
  • [security]CSI Service Account Token GA
  • [storage]在 Windows 中支持 CSI 插件功能 GA
  • [api-machinery]使用已弃用 API 的警告机制升至 GA
  • [scheduling]Pod Disruption Budget 驱逐功能 GA
  • [apps]CronJobControllerV2 GA
  • [node]Memory Manager 升至 bata 版本,保证 QoS 级别的 pod 提供多 NUMA 保证内存分配。
  • [storage]通用数据填充器 DataSource,不再仅限于PVC 和 snapshot
  • [apps]kubeadm 将配置类型从 v1beta2 升级到 v1beta3
  • [instrumentation]API Server 追踪,对 kube-apiserver 请求使用分布式跟踪。
  • [node]Rootless 模式容器,允许在主机上以非 root 用户身份运行整个 Kubernetes 组件(kubelet、CRI、OCI、CNI 和所有 kube-*)。

03
DaoCloud 主要参与功能

本次发布中,DaoCloud 重点贡献了 sig-node 和 kubeadm 相关的内容,具体功能点如下:
01: TerminationGracePeriodSeconds 功能添加验证项,不允许使用负值, 同时升级之前更新/删除 probe terminationGracePeriods < 1 的任何 Workloads/Pods
02: 默认情况下,非核心 Kubernetes 组件中不再提供 JSON 日志记录格式,并且需要所有者选择加入。03: 将 Cronjobs 存储版本提升到 batch/v104: safe sysctl 相关:将 net.ipv4.ip_unprivileged_port_start 标记为安全的 sysctl05: 默认禁用 StreamingProxyRedirects 。

06: 在 “kubeadm init/join/upgrade” 期间,始终将 KubeletConfiguration 中的 “cgroupDriver” 值默认为 “systemd”,除非用户明确设置该值

07: kube-apiserver manifest 移除 –insecure-port 标志

08: 向 kubeadm 添加对 imagePullPolicy 的支持

09: 将 CoreDNS 更新到 1.8.4, 授予CoreDNS 权限义 “list” 和 “watch” En do pointSli ce对象以适应双栈支持。

10: 升级 etcd 版本

此外,DaoCloud 还参与了20 多个问题修复,在1.22 发布过程中总计贡献 120 个提交,详情请见贡献列表(在该版本中有 16 位贡献者)
🔗 贡献列表:https://www.stackalytics.io/cncf?project_type=cncf-group&release=all&metric=commits&start_date=1617897600&end_date=1628006400&module=github.com%2fkubernetes%2fkubernetes&date=118&company=daocloud

04
版本标志

在当前的全球疫情和自然灾害下,Kubernetes 1.22 版本,带着 53 个增强功能,终于艰难而生了。这一成就之所以成为可能,是因为发布团队成员勤奋工作、充满热情,以及 Kubernetes 生态系统的杰出贡献者。
发布徽标提醒我们不断达到新的里程碑并创造新的记录。它献给所有发布团队成员、贡献者!
徽标由 MathWorks 的 Mac/Linux 管理员 Boris Zotkin 设计。
🔗 图像链接地址: https://github.com/kubernetes/website/tree/main/static/images/blog/2021-08-04-kubernetes-release-1.22/kubernetes-1.22.png

05
社区贡献排名

「2021.4.9 – 2021.8.3」

06
注意事项

  • 如果启用了 CSIMigrationvSphere 功能门,用户不应升级到 Kubernetes v1.22。vSphere CSI 驱动程序尚不支持 Kubernetes v1.22,因为它使用 v1beta1 CRD API。后续版本将添加对 v1.22 的支持。检查 vSphere 文档,
  • 了解给定 vSphere CSI 驱动程序版本支持的 Kubernetes版本。
  • storageos、quobyte 和 flocker 存储卷插件已弃用,将在以后的版本中删除。
  • In-tree Volume Plugin scaleio 已从 Kubernetes 中被完全删除。
  • In-tree 验证插件 azure 和 gcp 已被弃用。
  • Kubeadm:不再允许标志 –cri-socket 与标志 –config 混合使用。请使用 kubeadm configuration 为节点设置 CRI socket。
  • Kubeadm:移除 Docker 对 cgroup 驱动程序的自动检测和匹配。对于新集群,如果您没有明确配置 cgroup 驱动程序,可能会在驱动程序不匹配而导致 kubelet 失败(kubeadm 集群应该使用“systemd”驱动程序)。详情请参阅 kubeadm cgroup 配置文档。
  • 审计日志文件权限更改:现在以 0600 模式创建审计日志文件。不会更改现有文件权限。如果需要非 root 用户可以读取审计文件,则可以使用所需的权限预先创建该文件。
🔗 vSphere 文档:https://vsphere-csi-driver.sigs.k8s.io/compatiblity_matrix.html
🔗 kubeadm cgroup 配置文档:https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
 

07
参考文档

Kubernetes 1.22 CHANGELOG
「🔗:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.22.md」
Kubernetes 1.22 Release blog
「🔗:https://kubernetes.io/blog/2021/08/04/kubernetes-1-22-release-announcement/」
 
作者简介

刘梦姣
DaoCloud 开源/AD 团队工程师
Kubernetes Website「Docs SIG」, Chinese language Reviewer