Kubernetes 1.15 新特性解读

k8s v1.15 于 2019 年 6 月 19 日正式发布,这个版本中包含了 25 个特性变更:其中 2 个成为 stable ,13 个处于 beta 以及 10 个处于 alpha 阶段。

这个版本所围绕的主题是提高稳定性和可扩展性。所以此版本中 CRD 相关的变更比较多。

本文将围绕 Kubernetes 1.15 的新特性进行展开,集中在 CRD 和 kubeadm 之上。

CustomResourceDefinition (CRD) 的基本介绍

环境准备

我们使用 kind 创建我们所需的 Kubernetes 1.15 的环境。

(MoeLove) ➜  ~ kind create cluster --image kindest/node:v1.15.0 --name 115
Creating cluster "115" ...
 ✓ Ensuring node image (kindest/node:v1.15.0) 🖼
 ✓ Preparing nodes 📦 
 ✓ Creating kubeadm config 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="115")"
kubectl cluster-info
(MoeLove) ➜  ~ export KUBECONFIG="$(kind get kubeconfig-path --name="115")"
(MoeLove) ➜  ~ kubectl get nodes
NAME                STATUS   ROLES    AGE   VERSION
115-control-plane   Ready    master   41s   v1.15.0

接下来部署我们的 CRD,关于 CRD 的开发相关知识不是本文的重点,暂且忽略,有兴趣的朋友可以看看官方文档的介绍。

(MoeLove) ➜  ~ kubectl get crd -o name        
customresourcedefinition.apiextensions.k8s.io/hobbies.moe.moelove.info
(MoeLove) ➜  ~ kubectl get hobby     
NAME    AGE
music   44s

可以看到已经部署成功了。既然环境已经准备就绪,我们回到本文的重点来看看 Kubernetes 1.15 中我们所需要关注的核心特性。

beta: CustomResourceDefinition Webhook Conversion

CRD API 当中有个 versions 字段,可以用来配置 CR 的版本,并且 Kubernetes 允许我们有多个版本的 CR 存在。通过 kubectl 可以进行查看

# 篇幅原因,省略了无关输出
(MoeLove) ➜  ~ kubectl get crd  hobbies.moe.moelove.info -o yaml
...
  version: v1alpha1
  versions:
  - name: v1alpha1
    served: true
    storage: true
  - name: v1beta1     
    served: true  
    storage: false
...

注意你会看到这里有 version 字段和 versions 字段,不过 version 字段已过期,并且是可选的,如果该字段不为空,则它应该与 versions 中的第一个项匹配。

Kubernetes 提供了一个 CRD 转换的机制,可允许我们在多个不同的版本之间进行转换。当然,这个转换可以根据你具体的配置进行转换。比如设置为 None 模式的话,则只是针对于 API 版本的转换,并不会随意变更资源中的其他内容。

这里还提供了一种使用 Webhook 的方式,允许你进行更多灵活的转换规则。主要将 conversion 字段配置为 Webhook

具体的实现可以参考 官方代码库中用于 Kubernetes e2e 测试的 webhook server 这里就不再进行展开了。

beta: CustomResourceDefinition OpenAPI Publishing

另一个变化在于 Kubernetes 可为 CRD 发布 OpenAPI,具体的提案可以查看 publish-crd-openapi

那它的意义是什么呢? 通过发布 OpenAPI 可以很方便的支持客户端侧的验证,模式说明之类的。

比如说,如果你要 kubectl apply 一个 CRD 的 YAML ,在已经发布 OpenAPI 的情况下,客户端侧可以很方便的进行验证,具备掉未包含或者未通过验证的在 CRD 中的字段。

还有便是通过此项功能,也可以让kubectl explain 支持 CRD:

(MoeLove) ➜  ~ kubectl explain hobbies.moe.moelove.info 
KIND:     Hobby
VERSION:  moe.moelove.info/v1beta1

DESCRIPTION:
     <empty>

让我们得到一种类似原生资源的体验。

beta: CustomResourceDefinitions Pruning 和 alpha: CustomResourceDefinition Defaulting

另外这两个特性,主要都是对于结构化的 CRD 来讲的,可以通过配置设置默认值,或者是自动清理掉未包含在 CRD 结构中的字段。

这两个特性也就不额外展开了。

kubeadm: 集群生命周期的稳定性和可用性的改进

kubeadm 是一个很方便的集群部署,管理和升级的工具,也同时上游社区也有庞大的维护团队致力于将 kubeadm 变得更加稳定和易用。

对使用 kubeadm 部署的集群而言,证书管理算是之前的一个短板。而在 1.15 中,kubeadm 可以无缝的对证书进行需求。这会大大方便所有使用 kubeadm 部署集群的维护者。

另外,在此版本中 kubeadm 在 HA 集群的部署上也做了很多改进。比如现在你可以通过 kubeadm join --control-plane 来加入其他控制面的节点,并且从 1.15 开始允许并行加入多个控制面节点。

kubeadm 为了能提升其稳定性,基于 kind 开发了一套测试组件,可极大的在测试过程中模拟真实集群的情况。(Kind 是通过 CNCF Kubernetes 一致性认证的安装工具)

总结

以上内容便是 Kubernetes 1.15 中比较关键的一些信息了。 在 kubernetes 1.16 中, CRD API 将达到 GA 级别。这也是 Kubernetes 的一个重要发展方向。


欢迎订阅我的文章公众号【MoeLove】

TheMoeLove

加载评论