作者 | 陈显鹭 阿里巴巴高级技术专家
关注“Go语言中文网”公众号,回复关键词“入门”,即可下载从零入门 K8s 系列文章 PPT。
导读:在 Kubernetes 里面, API 编程范式也就是 Custom Resources Definition(CRD)。我们常讲的 CRD,其实指的就是用户自定义资源。为什么会存在用户自定义资源问题呢?本文将会从其需求来源出发,对此概念进行逐步深入的讲解。
需求来源
用例解读
1. CRD 的一个实例
图中的 group 为 samplecontroller.k8s.io; verison 为 v1alpha1; names 指的是它的 kind 是什么,比如 Deployment 的 kind 就是 Deployment,Pod 的 kind 就是 Pod,这里的 kind 被定义为了 Foo; plural 字段就是一个昵称,比如当一些字段或者一些资源的名字比较长时,可以用该字段自定义一些昵称来简化它的长度; scope 字段表明该 CRD 是否被命名空间管理。比如 ClusterRoleBinding 就是 Cluster 级别的。再比如 Pod、Deployment 可以被创建到不同的命名空间里,那么它们的 scope 就是 Namespaced 的。这里的 CRD 就是 Namespaced 的。
它的 apiVersion 就是我们刚才所定义的 samplecontroller.k8s.io / v1alpha1; kind 就是 Foo; metadata 的 name 就是我们这个例子的名字; 这个实例中 spec 字段其实没有在 CRD 的 Schema 中定义,我们可以在 spec 中根据自己的需求来写一写,格式就是 key:value 这种格式,比如图中的 deploymentName: example-foo, replicas: 1。当然我们也可以去做一些检验或者状态资源去定义 spec 中到底包含什么。
2. 带有校验的 CRD
3. 带有状态字段的 CRD
操作演示
架构设计
1. 控制器概览
2. 控制器工作流程概览
ListFunc 就是像 "kuberctl get pods" 这类操作,把当前所有的资源都列出来; WatchFunc 会和 apiserver 建立一个长链接,一旦有一个新的对象提交上去之后,apiserver 就会反向推送回来,告诉 Informer 有一个新的对象创建或者更新等操作。
本文总结
CRD 是 Custom Resources Definition 的缩写,也就是用户自定义资源,用户可以使用这个功能扩展自己的Kubernetes 原生资源信息; CRD 和普通的 Kubernetes 资源一样,都可以受 RBAC 权限控制,并且支持 status 状态字段; CRD-controller 也就是 CRD 控制器,能够实现用户自行编写,并且解析 CRD 并把它变成用户期望的状态。
推荐阅读