文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一篇带给你KubeBuilder 简明教程

2024-12-03 05:38

关注

k8s 的是一个高度自动化的系统,其中涵盖了常见应用程序所需的大部分功能,例如服务发现,负载均衡,HPA等等,这些功能是由 k8s 自带的一些控制器实现的,但是需求总是永无止境的,当我们有类似需求但是 k8s 又无法很好的满足的时候我们就可以使用 Operator 和 Custome Resource(自定义资源)来达到类似的效果。

例如常见的需求就有部署一个数据库,节点自动化运维,日志采集组件配置等等

从 Operator 理念的提出到现在已经有了很多工具可以帮助我们快速低成本的开发,其中最常用的就是 CoreOS 开源的 operator-sdk[^3]和 k8s sig 小组维护的 kubebuilder[^2],我们这个系列选用 kubebuilder。

开始之前我们先了解两个马上就会涉及到的核心概念

GV & GVK & GVR

GV: Api Group & Version

GVK: Group Version Kind

GVR: Group Version Resource

举个🌰,我们在 k8s 中的 yaml 文件都有下面这么两行,例如上篇文章我们部署的 nginx deployment

  1. apiVersion: apps/v1 # 这个是 GV,G 是 apps,V 是 v1 
  2. kind: Deployment    # 这个就是 Kind 
  3. sepc:               # 加上下放的 spec 就是 Resource了 
  4.   ... 

根据 GVK K8s 就能找到你到底要创建什么类型的资源,根据你定义的 Spec 创建好资源之后就成为了 Resource,也就是 GVR。GVK/GVR 就是 K8s 资源的坐标,是我们创建/删除/修改/读取资源的基础[^4]。

KubeBuilder 简明教程

安装

访问官方仓库下载已经编译好的二进制文件: Releases · kubernetes-sigs/kubebuilder (github.com)

安装成功之后使用 kubebuilder version 可以查看安装的版本信息

  1. ❯ kubebuilder version 
  2. Version: main.version{KubeBuilderVersion:"3.0.0-rc.0", KubernetesVendor:"1.19.2", GitCommit:"90fe4124c4c6965c6bfac63339888956952cda90", BuildDate:"2021-04-08T17:36:28Z", GoOs:"linux", GoArch:"amd64"

项目初始化

先创建一个空文件夹,然后在文件夹内执行下方命令

  1. kubebuilder init --domain lailin.xyz --repo github.com/mohuishou/blog-code/k8s-operator/02-kubebuilder 

如果你 golang 版本过低或者过高都有可能出现下方的错误信息,我这里是因为使用的 1.16 版本太高了

  1. 2021/04/25 20:47:14 failed to initialize project: unable to run pre-scaffold tasks of "base.go.kubebuilder.io/v3": go version 'go1.16' is incompatible because 'requires 1.13 <= version < 1.16'. You can skip this check using the --skip-go-version-check flag 

这种情况下可以添加 --skip-go-version-check 忽略这个错误,但是还是建议使用官方推荐的版本

  1. kubebuilder init --domain lailin.xyz --repo github.com/mohuishou/blog-code/k8s-operator/02-kubebuilder --skip-go-version-check 

项目目录

  1. ├── Dockerfile 
  2. ├── Makefile # 这里定义了很多脚本命令,例如运行测试,开始执行等 
  3. ├── PROJECT  # 这里是 kubebuilder 的一些元数据信息 
  4. ├── config 
  5. │   ├── default    # 一些默认配置 
  6. │   ├── manager    # 部署 crd 所需的 yaml 
  7. │   ├── prometheus # 监控指标数据采集配置 
  8. │   └── rbac # 部署所需的 rbac 授权 yaml 
  9. ├── go.mod 
  10. ├── go.sum 
  11. ├── hack 
  12. │   └── boilerplate.go.txt 
  13. └── main.go 

创建 api

  1. kubebuilder create api --group apps --version v1 --kind Application 

执行之后我们可以发现项目结构发生了一些变化

  1. ├── api 
  2. │   └── v1 
  3. │       ├── application_types.go # 这里是定义 spec 的地方 
  4. │       ├── groupversion_info.go # GV 的定义,一般无需修改 
  5. │       └── zz_generated.deepcopy.go 
  6. ├── config 
  7. │   ├── crd # 自动生成的 crd 文件,不用修改这里,只需要修改了 v1 中的 go 文件之后执行 make generate 即可 
  8. │   ├── default 
  9. │   ├── manager 
  10. │   ├── prometheus 
  11. │   ├── rbac 
  12. │   └── samples # 这里是 crd 示例文件,可以用来部署到集群当中 
  13. ├── controllers 
  14. │   ├── application_controller.go # 在这里实现 controller 的逻辑 
  15. │   └── suite_test.go # 这里写测试 

实现 Controller

定义 CR

  1. // api/v1/application_types.go 
  2.  
  3. // ApplicationSpec defines the desired state of Application 
  4. type ApplicationSpec struct { 
  5.  // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster 
  6.  // Important: Run "make" to regenerate code after modifying this file 
  7.  
  8.  // Product 该应用所属的产品 
  9.  Product string `json:"product,omitempty"

修改之后我们执行一下 make manifests generate 可以发现已经生成了相关的字段,并且代码中的字段注释也就是 yaml 文件中的注释

  1. # config/crd/bases/apps.lailin.xyz_applications.yaml 
  2. ...... 
  3.    properties: 
  4.               product: 
  5.                 description: Product 该应用所属的产品 
  6.                 type: string 
  7. ...... 

实现 controller

kubebuilder 已经帮我们实现了 Operator 所需的大部分逻辑,我们只需要在 Reconcile 中实现业务逻辑就行了

  1. // controllers/application_controller.go 
  2.  
  3. func (r *ApplicationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { 
  4.  _ = r.Log.WithValues("application", req.NamespacedName) 
  5.  
  6.  r.Log.Info("app changed""ns", req.Namespace) 
  7.  
  8.  return ctrl.Result{}, nil 

逻辑修改好之后,我们先执行 make install 安装 CRD,然后执行 make run运行 controller

  1. go run ./main.go 
  2. 2021-04-25T21:55:55.578+0800    INFO    controller-runtime.metrics     metrics server is starting to listen     {"addr"":8080"
  3. 2021-04-25T21:55:55.579+0800    INFO    setup   starting manager 
  4. 2021-04-25T21:55:55.579+0800    INFO    controller-runtime.manager     starting metrics server  {"path""/metrics"
  5. 2021-04-25T21:55:55.579+0800    INFO    controller-runtime.manager.controller.application       Starting EventSource    {"reconciler group""apps.lailin.xyz""reconciler kind""Application""source""kind source: /, Kind="
  6. 2021-04-25T21:55:55.680+0800    INFO    controller-runtime.manager.controller.application       Starting Controller     {"reconciler group""apps.lailin.xyz""reconciler kind""Application"
  7. 2021-04-25T21:55:55.680+0800    INFO    controller-runtime.manager.controller.application       Starting workers        {"reconciler group""apps.lailin.xyz""reconciler kind""Application""worker count": 1} 

然后我们部署一个测试的 crd kubectl apply -f config/samples/apps_v1_application.yaml

  1. apiVersion: apps.lailin.xyz/v1 
  2. kind: Application 
  3. metadata: 
  4.   name: application-sample 
  5. spec: 
  6.   # Add fields here 
  7.   product: test 

然后可以看到之前写的日志逻辑已经触发

  1. 2021-04-25T21:57:12.618+0800    INFO    controllers.Application app changed     {"ns""default"

Kubebuilder 注释

在生成的代码当中我们可以看到很多 //+kubebuilder:xxx 开头的注释,对 Go 比较熟悉的同学应该知道这些注释是给对应的代码生成器服务的,在 Go 中有一个比较常用的套路就是利用 go gennerate生成对应的 go 代码。

kubebuilder 使用 controller-gen 生成代码和对应的 yaml 文件,这其中主要包含 CRD 生成、验证、处理还有 WebHook 的 RBAC 的生成功能,下面我简单介绍一下,完整版可以看 kubebuilder 的官方文档

CRD 生成

CRD 验证,利用这个功能,我们只需要添加一些注释,就给可以完成大部分需要校验的功能

Webhook

RBAC 用于生成 rbac 的权限

总结

这篇文章主要讲解了 kubebuilder的安装使用方式,以及涉及到的一些简单的概念,项目目录结构的说明,下一篇文章我们就一起来实现一个真实的 Operator 需求

参考文献

[^1]: Operator 模式 | Kubernetes:

https://kubernetes.io/zh/docs/concepts/extend-kubernetes/operator/

[^2]: kubebuilder 官方文档, 这个是 master 分支的文档,待 3.0 发布后去掉 master 即可:

https://master.book.kubebuilder.io/quick-start.html

[^3]: operator-sdk:

https://sdk.operatorframework.io/

[^4]: 深入解析 Kubebuilder:让编写 CRD 变得更简单:

https://developer.aliyun.com/article/719215

 

来源:mohuishou内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯