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】