Kubernetes 1.15 正式发布,详细解读多项关键特性

2019年6月20日,Kubernetes重磅发布了1.15版本,不管你是Kubernetes用户,还是IT从业者都不能错过这个版本。

1.15版本主要围绕可扩展性展开,北向API接口方面API Machinery SIG致力于催熟CRD以提升API可扩展性,南向插件集成方面,Storage SIG 和Node SIG则分别对CSI和设备监控插件可扩展性进行了优化。另外Kubeadm对HA集群配置也达到Beta可用,并发优化了证书管理相关功能。

本文我们先从宏观上了解一下近期版本的变化趋势,然后再开始1.15版本的重点特性解读。

Kubernetes持续热情高涨

在展开解读1.15的关键新特性之前,让我们先来回顾下社区过去几个版本的特性发布情况。值得一提的是:无论从新特性数量,还是特性的成熟度分布来看,Kubernetes依旧保持着相当的活力,社区开发者用实际行动回应了业界盛传“Kubernetes已经足够成熟,项目正在变得无聊(Boring)”的说法。

各版本新特性数量基本持平

image
从新特性数量上看,Kubernetes过去一个版本发布的特性数量并无明显趋势性变化。由于特性颗粒度的差异,每个版本发布的新特性数量存在小幅波动,属于正常现象。

看特性成熟度分布,Alpha特性比例依旧可观

image

对比分析过去几个版本的特性成熟度,不难发现Alpha新特性的占比稳定在20%~40%之间。按照社区惯例,当一项全新的功能被添加时,会在特性说明中打上Alpha标记。持续稳定甚至小幅上涨的Alpha特性占比说明社区仍然在大量开发全新的特性,而不是满足于既有功能的加固。

Kubernetes重点特性解读

经过分析Kubernetes近几个版本的变化,我们发现特性主要集中在Storage、Node、API-Machinery、Network、Scheduling等SIG,而这些SIG大都致力于可护展性增强,以便于下游用户在享受稳定核心的同时,轻松扩展定制自己的插件。

image

从最新发布的1.15版本来看,以下几个变化需要重点关注。

API聚焦可扩展性增强

Kubernetes API的扩展能力主要由CRD(Custom Resource Definition)以及Admission Webhook提供。1.15 版本在这两方面都有重要的更新。

CRD,大步迈向GA

CRD的新开发主题一直都围绕着数据一致性以及提供更加接近Kubernetes原生API的能力。用户不应该感知到到底是以CR(Custom Resource)还是以原生的资源对象形式与Kube APIServer进行交互。社区目前正迈着大步,计划将在接下来的某个版本中将CRD以及Admission Webhook GA(升级为稳定版本)。

朝着这个方向,社区重新思考了基于OpenAPI的CRD验证模式,从1.15开始,根据结构模式(Structural Schema)的限制检查每个字段。这基本保证了能够像原生的API对象一样提供完整的CR校验能力。在v1beta1 API中,非结构模式(non-Structural Schema)仍然保持工作状态。但是任何严格的CRD应用程序都应该在可预见的将来迁移到结构模式。

  1. CRD多版本之间通过Webhook转换特性[Beta]

从1.15版本开始,支持运行时不同版本之间的转换,长期目标是让用户像原生API资源一样使用CRD的多版本。这一特性是CRD在GA道路上一步重大的飞跃。

  1. CRD OpenAPI发布特性[Beta]

CRD的OpenAPI发布特性将会在Kubernetes 1.15中Beta,当然只是针对结构模式的CRD。次特性对于用户自定义API,提供了与Kubernetes原生API一样的文档说明。

  1. CRD 未知字段裁剪(Prune)[Beta]

CRD未知字段裁剪特性是针对发送到Kube APIServer的对象中未知的字段进行移除,并且不会持久化存储。用户可以通过在CRD对象设置spec.preserveUnknownFields: false 使用此未知字段裁剪特性。此特性对于数据一致性及安全都有一定的帮助。

  1. CRD 默认值设置 [Alpha]

Kubernetes 1.15 结构模式的CRD默认值设置特性作为Alpha特性可用。用户可以通过OpenAPI校验模式的default关键词指定默认值。避免了用户原来只能通过Admission Webhook方式设置CRD对象的默认值带来的额外开发消耗。

Admission Webhook重新调用(Reinvocation)与增强

  1. Mutating 和 Validating Admission Webhook已经成为扩展API的主流选择。在1.15以前,所有的webhook只会按照字母表顺序调用一次,这样就会导致一个问题一个更早的webhook不能应对后面的webhook的更新,这可能会导致未知的问题,例如前面的webhook设置某个pod的启动参数,而随后的webhook将其更改或者移除了。

1.15 版本引入Reinvocation特性允许用户通过MutatingWebhook 配置reinvocationPolicy: IfNeeded 指定Mutating Webhook重新调用。

  1. Admission Webhook引入了objectSelector来控制通过标签选择特定的对象进行准入控制。

  2. 允许Admission Webhook Server使用任意的端口(不限制只能是443)。

Node SIG提供监控插件框架用于异构硬件监控

新版本很好的解决了异构硬件设备监控难题,现在不需要修改Kubelet代码就可以实现各种指标(如GPU、显存利用率等)监控。

新版本通过新的监控插件框架将Kubelet与设备监控处理逻辑解耦,很好的解决了以往Kubelet代码管理和K8s集群运维之间的痛点。

image

由图可见本框架主要包含Kubelet和Device Monitoring Agent两大部分:

1、 Kubelet

Kubelet增加了一个GRPC服务,监听在/var/lib/kubelet/pod-resources/kubelet.sock,提供pod resources的list查询接口。

2、 Device Monitoring Agent

a. Device Monitoring Agent提供metric接口对外提供设备监控指标查询功能。

b. Device Monitoring Agent向Kubelet的上述GRPC服务发送List请求,取得所有pod resources(包含节点上所有pod的所有container分配的device类型和device id)。

c. Device Monitoring Agent根据设备类型过滤获取容器的设备ID,通过设备驱动接口获取容器使用的设备的监控指标,并把二者关联到container 、pod上。

新的框架将会带来诸多便利:

1、 设备监控功能与Kubelet接口解耦

a. Kubelet不需要提供设备的监控指标;
b. 设备的新增监控指标不需要升级Kubelet,而是更新设备监控代理版本即可;

c. 新增设备不需要升级Kubelet,而是增加部署设备监控代理的DaemonSet即可;

d. 未解耦前,Kubelet会检测所有支持的设备是否存在,即使节点并没有安装该设备。

2、 设备供应商负责发布和维护设备监控代理,设备供应商在如何运行和监控它们方面拥有深厚的专业知识,可以提供权威的设备监控代理。

3、 K8s集群的管理员只需要安装需要的设备监控代理即可。

Scheduling SIG发布Scheduler Framework加强调度器扩展定制能力

Scheduler Framework 终于在1.15迎来了Alpha版本。Scheduler Framework 最早在2018 年初提出,主要是为了解决日益增加的定制化调度需求。Scheduler Framework在原有的 Priority/Predicates 接口的基础上增加了 reserve, pre-bind 等十几个接口用于相应前处理及后处理。在 1.15 中,Scheduler Framework实现 QueueSort, Prebind, Postbind, Reserve, Unreserve和Permit接口,这些接口为后继更多的调度策略提供了基础,比如 gang-scheduling。

然而,出于设计上的延续性考虑,目前 Scheduler Framework 仍以Pod为单位进行调度,而计算类(离线)任务调度往往需要考虑工作负载中相关的Pod按组进行调度,例如 faire-share。现在的Scheduler Framework还不能有效的解决。所幸针对这一原因,社区已经有相应的项目在Kubernetes上支持计算类(离线)任务,例如 Volcano (http://github.com/volcano-sh/volcano)。

Storage SIG持续改善CSI

在Kubernetes v1.15中,SIG Storage继续工作,以支持将in-tree插件迁移到CSI(Container Storage Interface,容器存储接口)。SIG Storage致力于使CSI具有与in-tree功能相同的特性,包括调整大小、内联卷等功能。SIG Storage在CSI中引入了一些新的Alpha功能,这些功能在Kubernetes存储子系统中还不存在,如卷克隆(volume cloning)等。

卷克隆允许用户在提供新卷时将另一个PVC指定为“数据源(Data Source)”。如果底层存储系统支持此功能并在其CSI驱动程序中实现“CLONE_VOLUME”功能,则新卷将成为源卷的克隆。

Kubeadm的HA集群配置达到Beta可用

作为社区内置安装工具的Kubeadm,何时支持部署HA集群一直是个热门话题。在本次发布的1.15版本中,Kubeadm对HA集群配置的支持终于达到beta——用户可以直接使用init和join两个Kubeadm命令来部署HA集群。乐于折腾的用户可以参考社区文档在小范围生产环境中使用。
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

Kubeadm的证书管理功能在1.15中也得到了改进,用户可以在证书失效前通过kubeadm alpha certs renew平滑地刷新它们。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-certs-renew

Kubeadm的configuration(API)在1.15版本中引入了v1beta2版本,主要是增加了一组证书加解密密钥的配置字段CertificateKey,便于用户在使用Kubeadm部署HA控制面时,直接使用被加密保存在集群Secret中的证书。此外,用户可以通过 kubeadm alpha certs certificate-key 命令来直接生成这对密钥。

关于跟多Kubeadm当前相关的Alpha特性,可以查看相关官方文档:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha

随着Kubernetes越来越多地被用在多云、混合云部署场景,集群生命周期管理的标准化一直是众人期待的一大方向。自v1.13版本GA之后,Kubeadm的改动主要聚焦在优化使用体验上。而集群生命周期整体流程的打通,特别是实现跨平台的集群管理,配合日渐活跃的ComponentConfig以及Cluster API两个新项目,相信很快会有实质性的进展。

image

附图:集群生命周期SIG相关项目成熟度

小结

经过5年的发展,Kubernetes核心的基本功能已相对稳定,具备大规模生产可用水平。但是客户需求往往是多种多样的,社区从很早就意识到这个问题,因而提供了各种接口(CRD、CRI、CSI、CNI等),希望在保持Kubernetes独立的条件下,尽量满足用户差异化的需求,这从1.15发布的主要特性也可以看出来。

华为云原生团队坚定的认为,Kubernetes社区未来会继续着重围绕可扩展性、易用性以及稳定性规划发展路标,丰富平台面向各种应用场景的功能接口,以稳定、健壮、高可扩展的平台推动云原生应用生态百花齐放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章