K8S中CRD与Operator的关系「云原生」

什么是CRD?

Kubernetes 1.7之后,提供了CRD(CustomResourceDefinitions)自定义资源的二次开发能力来扩展kubernetes API,通过此扩展可以向kubernetes API中增加新的资源类型,会比修改kubernetes apiserver的源代码或创建自定义的apiserver来的更加的简洁和容易。

k8s上创建资源的过程

用户创建一个资源,实际上是把k8s抽象的资源根据资源清单(yaml文件)做实例化。具体过程如下:


(1)用户的资源请求发送给apiserver,通过apiserver的认证、授权、准入控制以后,通过apiserver把对应的资源定义信息存放在etcd中;


(2)对应资源类型的控制器一般被称为 controller或operator,controller通过watch机制监听apiserver上的资源变动,通过对应资源变动事件触发对应类型资源的控制器从etcd中读取对应资源的定义,并将对应资源创建出来,并通过控制器内部的和解循环(control loop)监控着对应资源状态是否和用户定义的期望状态一样;如果发现不一样,内部和解循环就会被触发,对应的控制器会向apiserver发起创建资源的请求,将对应资源重建,让对应资源的状态始终满足用户期望的状态。


对于etcd来说,它是就一个kv数据库,可以存储任意类型的kv数据,但在k8s上,apiserver将不同类型的资源定义抽象成不同的资源,使得用户创建对应资源必须是满足对应类型资源定义的规范,然后将资源定义存放在etcd中。简单讲就是存入etcd中的数据必须是满足对应apiserver接口定义的规范。

k8s扩展资源类型的方式

在k8s上扩展资源类型的方式有三种:

第一种是:CRD

crd是k8s内置的资源类型,通过crd资源可以将用户自定义资源类型转换为k8s上资源类型;


第二种是:自定义apiserver

这种方式是复用 Kubernetes 的一些特性的同时,自由度最高的方式。可以自定义存储等,同时保有一定程度的公共特性。Cloud TiDB 的实现就是通过自定义 API server 进行的;


第三种是:修改源码

让现有k8s apiserver的源码支持对应用户自定义资源类型;

另外,进行自定义资源类型,只能把对应资源类型的定义信息写入到etcd中,不能让对应自定义类型资源实例化为一个自定义资源对象,它不能真正的跑起来,要想真正的跑起来,我们还需要一个自定义控制器,将对应资源实例化为k8s上的资源对象,并专门负责监听对应的资源类型的资源变化,因此需要下面两个组件:

(1)自定义资源类型CRD;


(2)对应自定义资源类型的控制器Controller;

Controller的作用是通过API Server提供的接口实时的对指定的resource进行监听和执行的动作(watch,diff,action)。

K8S种内置控制器类型:

Deployment;StatefulSet;DaemonSet;Job;CronJob

CRD和Operator的区别

所有的Operator都是基于Controller模式,Operator是使用CRD实现的定制化的Controller. 它与内置K8S Controller遵循同样的运行模式(比如 watch, diff, action);operator的逻辑也是创建一个crd资源,再创建一个控制器。

写在最后

Operator的开发可以通过构建工具Kubebuild来规范化,模板化,省时,省力。

展开阅读全文

页面更新:2024-04-02

标签:资源类型   控制器   抽象   实例   定义   状态   类型   关系   方式   用户   资源

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top