K8s Custom Resource Definition扩展

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

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

开发CRD在做什么

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

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

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

可用的工具

扩展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
#初始化scaffoldkubebuilder 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 说明


make manifests #自动构建manifest yaml
make install #安装资源文件,并不会创建namesapce启动程序
make deploy IMG=${image:v} #启动controller
make manifests #自动构建manifest yamlmake install #安装资源文件,并不会创建namesapce启动程序make deploy IMG=${image:v} #启动controller
  • install、uninstall、deploy都依赖manifests,所以如果你在自动生成的yaml文件里手工改了内容之后最好去掉对manifests的依赖,改为在需要的时候手动执行make manifests

Cert 初始化

下面代码可以添加到Makefile中或者自己的Makefile处理certificate,这里使用自定义处理更方便我们了解整个处理逻辑,当然你也可以使用推荐的certmanager进行certificate管理

CertDir ?= /tmp/k8s-webhook-server/serving-certs
Service ?= steward-webhook-service.steward-system.svc
ca: 
mkdir -p ${CertDir} 
       openssl req -subj "/CN=${Service}/O=KubeBuilder Webhook/C=AU" -x509 -nodes -days 365 -newkey rsa:2048 -keyout ${CertDir}/tls.key -out ${CertDir}/tls.crt
       #使用使用输出替换 config/webhook/manifests.yaml中的 caBundle
       cat ${CertDir}/tls.crt | openssl base64|tr -d '\n'
create-secert: 
       kubectl create -n steward-system secret generic webhook-server-cert --from-file=${CertDir}

具体测试步骤

  1. 初始化开发框架代码,并修改代码逻辑
  2. 注释掉install、uninstall、deploy对manifests的依赖,make ca 创建ca并用替换caBundle
  3. make install 安装crd资源定义
  4. 解除config/default/kustomization.yaml中 manager_webhook _patch.yaml的注释,为contoller挂载certificate文件
  5. make docker-build IMG=steward:v1 构建镜像
  6. make deploy IMG=steward:v1 部署带有webhook的controller
  7. make create-secert 创建cert的secerts 提供controller使用,否则controller会一直等待挂载资源而无法正常启动
  8. kubeclt logs -n steward-system steward-controller* manager -f 监控log输出
  9. kubeclt apply -f config/sample 创建Steward 

开发注意事项

  1. 如果只是开发controller并没有webhook逻辑那么我们可以直接使用make run在b本地启动controller进行逻辑测试
  2. 开发webhook部署controller到集群上要保证网络插件正常运行,这样才能保证service可以正常访问
  3. cert要根据自己的环境进行调整,保证certificate的正确和有效
  4. 注意资源是否受到namespace限制

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *