美国时间 8 月 26 日,Kubernetes v1.19 正式发布,这是 2020 年的第二个新版本。受新冠疫情影响,本次版本更新距上次时隔 20 周,这让开发工作组和贡献者有更多时间来完成工作,也有更多精力专注于 Kubernetes 项目之外的生活,从而保持良好的心理状态。

在他们的努力下,Kubernetes v1.19 包含 33 个增强功能:其中 12 个增强功能已趋于稳定,18 个进入 beta,13 个进入 alpha。

Major Themes

新版本主要围绕以下主题:

将 Kubernetes 的支持周期延长到一年

2019 年初,Kubernetes 长期支持(LTS)工作组曾进行过一项调查。调查发现 Kubernetes 发布的版本通常只维护支持九个月,在维护周期内,很大一部分 Kubernetes 最终用户并没有升级。根据该调查以及调查的其他结果,工作组认为如果将新版本支持期限延长至 12-14 个月,会帮助 30% 的用户(无论是自建版还是商业发行版)在支持的版本上保留其部署。因此,延长 Kubernetes 版本支持周期可以让超过 80% 的用户使用受支持的版本,而不是现在的 50-60%。因此,从 Kubernetes v1.19 开始,新版本的支持周期将延长至一年,这可以为最终用户提供所需的缓冲,并且与用户通常采用的年度计划周期更加匹配。

储存容量追踪

Kubernetes 调度(Scheduling)一般基于以下假设:集群中的任何地方都可以使用附加的持久性存储,并具有无限容量。拓扑约束解决了上述第一个问题,但是到目前为止,第二个问题还时有发生:有时 Sheduler 会因为没有考虑剩余的存储容量可能不足以启动新的 Pod,认为它还有可用资源,使节点被拖死,集群发生雪崩。为了解决该问题,Kubernetes v1.19 推出了一项新的 Alpha 功能:存储容量跟踪。它能为 CSI 驱动程序添加 API 来报告存储容量,并在为 Pod 选择节点时在 Kubernetes 调度程序中使用该信息。这个功能是支持为本地卷和其他受容量限制更大的卷类型进行动态预配置的基石。

通用短暂卷

Kubernetes 提供了其生命周期与 Pod 绑定的卷插件,可用作临时空间(例如内置 emptydir 卷类型)或将某些数据加载到 Pod 中(例如内置 configmap 和 secret 卷类型,或“CSI 内联卷”)。Kubernetes v1.19 推出的新的通用临时卷 Alpha 功能允许将任何支持动态预配置的现有存储驱动程序用作临时卷,并将该卷的生命周期绑定到 Pod。它可用于提供与根磁盘不同的临时存储,例如永久性内存或该节点上的单独本地磁盘。支持所有用于卷配置的 StorageClass 参数。支持 PersistentVolumeClaims 支持的所有功能,例如存储容量跟踪、快照和还原以及卷大小调整。

CSI 卷运行状况监控

此外,Kubernetes v1.19 还发布了 Alpha 版本的 CSI 健康状况监控。这个功能使 CSI 驱动程序可以与 Kubernetes 共享来自底层存储系统的异常卷状况,以便将它们报告为 PVC 或 Pod 上的事件。该功能是 Kubernetes 进行程序检测和解决单个卷健康问题的基石。

Ingress API 升入 GA

在 Kubernetes v1.19 中,Ingress API 正式进入 GA。这个 API 本身已经在 Beta 中可用的时间已经很长,在用户使用和采用(用户以及负载平衡器/ Ingress 控制器提供商)上已经达到了事实上的 GA 状态,也变得不可或缺。显然,这是一个有用的 API,而且已经有了一些典型用例,因此工作组决定将当前的 API 声明为社区将支持的 V1,以整理其状态,同时对 V2 Ingress API 或功能类似的其他 API 更加谨慎。

结构化日志

在之前的版本中,登录 Kubernetes 控制平面无法保证日志消息和这些日志中对 Kubernetes 对象的引用具有任何统一的结构。这使得解析、处理、存储、查询和分析日志变得困难,并迫使管理员和开发人员在大多数情况下基于某些正则表达式依赖于即席解决方案。由于这些问题,基于这些日志的任何分析解决方案都难以实现和维护。

新的 Klog 方法

在 v1.19 中,Kubernetes 向 klog 库中引入了新的方法,该方法提供了更高结构化程度的接口用于格式化日志消息。现在每个现有的日志格式化方法(InfofErrof)都能与结构化方法(InfoSErrorS)进行匹配。新的日志记录方法将日志消息作为第一参数,将键值对列表作为可变的第二参数。这种方法允许逐步引入结构化日志记录,且无需将所有 Kubernetes 一次性指向新 API。

Kubelet 客户端 TLS 证书轮换

Kubelet 使用私钥与证书向 kube-apiserver 进行 kubelet 认证。证书在首次启动时会通过集群外部机制提交给 kubelet。自 Kubernetes v1.18 起,集群引入了一项 beta 流程,用于获取初始证书、密钥并在证书到期时进行轮替。在 v1.19 中,这项机制正式进入稳定版本。在 kubelet 的启动过程中,文件系统将被扫描,以查找由证书管理器管理的现有证书、密钥对。如果证书、密钥对可用,它会进行加载。如果不可用,kubelet 会在配置文件中检查 kubeconfig 内的编码证书值和文件引用。如果使用引导证书,则使用该证书生成密钥、创建证书签名请求并向 API Server 请求签名证书。

在证书临近到期时,证书管理器会提供新的证书、生成新的私钥并请求新的签名证书。由于请求证书签名是 kubelet 启动过程的一部分,它会不断对来自 kubelet 的证书签名请求进行自动批准,因此集群可管理性将得到提升。

重要更新

以下是 1.19 版本中值得关注的变化:

以下特性进入稳定

  • Seccomp
  • Kubelet 客户端 TLS 证书轮换
  • 限制节点对 API 的访问
  • 重新设计 Event API
  • Ingress V1 毕业稳定版
  • CertificateSigningRequest API
  • 在没有 Docker 的情况下构建 Kubelet

主要变化

  • #693 节点拓扑管理器:Kubelet 组件,用于协调 Kubernetes 中不同组件的细粒度硬件资源分配;
  • #752 EndpointSlice API:新的 Endpoint API,以最终替代当前的 core/v1 Endpoints API;
  • #1498 将 Kubernetes 支持周期延长到一年:Kubernetes 支持周期延长到一年或四个发行版。

其他主要变化

  • #1451 运行多个 Scheduling Profile:让 Scheduler 运行多个与 Scheduler 名称关联的多个 Scheduler Profile;
  • #1513 CertificateSigningRequest API;
  • #1412 不可变 Secret 和 ConfigMap:允许将 Secret 和 ConfigMap 设置为不可变。

发布 logo

此次团队也发布了新版本 release logo,它以“Accentuate the Paw-sitive”为主题。Logo 捕捉了世界状态的美好前景,其中的字符则是分别代表了团队中每个人的个性,从 emo 到 heppy 等等。

小结

此次发布是数百名技术和非技术社区人员的共同努力!随着 Kubernetes 社区的发展,它的发布过程极大地展示了开源软件开发中的通力协作。Kubernetes 还在不断地涌入新用户,这种增长创造了积极的反馈周期,更多的贡献值提交代码,从而创建了更加活跃的生态系统。迄今为止,Kubernetes 已有 49000 多位个人贡献者,社区活跃人数超过 3000 人。本文只简单介绍了 Kubernetes v1.19 中的一些重要增强功能,以及企业用户和个人开发者可能会比较关注的新功能。关于新版本的更多内容,请查看官方文档:

https://kubernetes.io/blog

github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.19.md