在前一篇文章 K8s 系统扩展 中我们介绍了K8s扩展的基本概念,本文我们将主要了解下CRD的具体扩展实现,行文思路:

  1. 开发CRD在做什么?
  2. 可用的工具
  3. kubebuilder实现流程可常见问题

开发CRD在做什么

通常开发CRD意味着我们希望将自定义概念(静态资源、可执行单元等)添加到K8s 集群中进行管理,下图我们抽象了前开发周期(也就是开发测试迭代)逻辑视图:

https://mmbiz.qpic.cn/mmbiz_png/LyvSiad56SlzRn4UjwxuI5fwM2LKlfaVCpU9X7FAFnRYW0xhw63buShgl7jcKcaXIQ7JA7SzQ7pYicN2hiclT26YQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

  1. 将资源定义信息写入集群
  2. 部署controller到 k8s集群
  3. 创建自定义资源

自定义资源(CR)创建的简单流程:

https://mmbiz.qpic.cn/mmbiz_png/LyvSiad56SlzRn4UjwxuI5fwM2LKlfaVCibfricOsYJIe6JkUk0pHpUBAprzC6PBibyia9SmylA2oEcLicnWm77ZvtTA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

(源:https://mp.weixin.qq.com/s/SdWp1A6zDp7inLzG5VSE4Q)

可用的工具

扩展CRD最原始的方法是使用K8s client-go库来实现与K8s集群的交互,主要是和apiserver交互,当然经过长时间的积累我们现在并不需要用这么基础的库来实现我们的CRD,比较常用的有 kubebuilder 和 **operator-sdk,**两者都是对使用官方的controller-tools和controller-runtime封装,只是侧重点不太一样,kubebuilder相对来说更简单易用,operator-sdk对上层operator的支持更好些

基于kubebuilder实现CRD

官网(https://book.kubebuilder.io/)的介绍已经很详细了,这里只简要介绍下几个重要的点和需要注意的问题,我们以创建一个自定义资源Steward作为我们的逻辑实体,oam(operations and maintenance)作为域下的一个管理分组,域为crd.fp.net

使用以下命令来初始化CRD开发代码

#初始化scaffold
kubebuilder init --domain crd.fp.net
#初始化api controller代码
kubebuilder create api --group oam --version v1 --kind Steward
#初始化webhook 代码
kubebuilder create webhook --group oam --version v1 --kind Steward --defaulting --programmatic-validation

Makefile 说明