当前位置: 首页 > article >正文

k8s笔记——kubebuilder实战

kubebuilder

Kubebuilder 是一个基于 CRD 来构建 Kubernetes API 的框架,可以使用 CRD 来构建 API、Controller 和 Admission Webhook。

动机

目前扩展 Kubernetes 的 API 的方式有创建 CRD、使用 Operator SDK 等方式,都需要写很多的样本文件(boilerplate),使用起来十分麻烦。为了能够更方便构建 Kubernetes API 和工具,就需要一款能够事半功倍的工具,与其他 Kubernetes API 扩展方案相比,kubebuilder 更加简单易用,并获得了社区的广泛支持。

工作流程

Kubebuilder 的工作流程如下:

  1. 创建一个新的工程目录
  2. 创建一个或多个资源 API CRD 然后将字段添加到资源
  3. 在控制器中实现协调循环(reconcile loop),watch 额外的资源
  4. 在集群中运行测试(自动安装 CRD 并自动启动控制器)
  5. 更新引导集成测试测试新字段和业务逻辑
  6. 使用用户提供的 Dockerfile 构建和发布容器

设计哲学

Kubebuilder 提供基于简洁的精心设计的示例 godoc 来提供整洁的库抽象。

  • 能使用 go 接口和库,就不使用代码生成
  • 能使用代码生成,就不用使用多于一次的存根初始化
  • 能使用一次存根,就不 fork 和修改 boilerplate
  • 绝不 fork 和修改 boilerplate

开始

环境
go version go1.22.3 linux/amd64
win10+debian11虚拟机
minikube version: v1.33.1
kubenetes version1.28.9

# 安装make
sudo apt-get install make
# 创建项目
mkdir kubebuilder-demo
cd kubebuilder-demo
go mod init gitcode.com/m

初始化

# 初始化一个新项目
kubebuilder init --domain my.domain
# 创建一个 API,按两次y
kubebuilder create api --group webapp --version v1 --kind Guestbook

在这里插入图片描述
在这里插入图片描述
API 创建完成后,在项目根目录下查看目录结构。

.
├── api
│   └── v1
│       ├── groupversion_info.go
│       ├── guestbook_types.go
│       └── zz_generated.deepcopy.go
├── bin
│   └── controller-gen-v0.15.0
├── cmd
│   └── main.go
├── config
│   ├── crd
│   │   ├── kustomization.yaml
│   │   └── kustomizeconfig.yaml
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_metrics_patch.yaml
│   │   └── metrics_service.yaml
│   ├── manager
│   │   ├── kustomization.yaml
│   │   └── manager.yaml
│   ├── prometheus
│   │   ├── kustomization.yaml
│   │   └── monitor.yaml
│   ├── rbac
│   │   ├── guestbook_editor_role.yaml
│   │   ├── guestbook_viewer_role.yaml
│   │   ├── kustomization.yaml
│   │   ├── leader_election_role_binding.yaml
│   │   ├── leader_election_role.yaml
│   │   ├── role_binding.yaml
│   │   ├── role.yaml
│   │   └── service_account.yaml
│   └── samples
│       ├── kustomization.yaml
│       └── webapp_v1_guestbook.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
├── internal
│   └── controller
│       ├── guestbook_controller.go
│       ├── guestbook_controller_test.go
│       └── suite_test.go
├── Makefile
├── PROJECT
├── README.md
└── test
    ├── e2e
    │   ├── e2e_suite_test.go
    │   └── e2e_test.go
    └── utils
        └── utils.go

17 directories, 37 files

安装 CRD

Generate the manifests 生成清单

make manifests

Install CRDs into the Kubernetes cluster using kubectl apply 使用kubectl apply将CRD安装到Kubernetes集群中

make install

在这里插入图片描述

$ k get crd |grep jimmysong.io
guestbooks.webapp.jimmysong.io

启动控制器

make run

在这里插入图片描述

/home/zzyy/project/kubebuilder-demo2/bin/controller-gen-v0.15.0 rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
/home/zzyy/project/kubebuilder-demo2/bin/controller-gen-v0.15.0 object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go run ./cmd/main.go
 setup   starting manager
 starting server {"name": "health probe", "addr": "[::]:8081"}
 Starting EventSource    {"controller": "guestbook", "controllerGroup": "webapp.jimmysong.io", "controllerKind": "Guestbook", "source": "kind source: *v1.Guestbook"}
 Starting Controller     {"controller": "guestbook", "controllerGroup": "webapp.jimmysong.io", "controllerKind": "Guestbook"}
 Starting workers        {"controller": "guestbook", "controllerGroup": "webapp.jimmysong.io", "controllerKind": "Guestbook", "worker count": 1}

卸载CRD

make uninstall

构建CRD镜像并部署进k8s

构建镜像并推送至你的镜像仓库

make docker-build docker-push IMG=<some-registry>/<project-name>:tag

指定镜像将controller部署进你的集群

make deploy IMG=<some-registry>/<project-name>:tag

参考资料

kubebuilder 文档 快速入门
K8S中编写自己的CRD及Controller简明指南
使用 kubebuilder 创建 operator 示例
sample-controller
redhat --Kubernetes Deep Dive: Code Generation for CustomResources
深入解析 Kubebuilder:让编写 CRD 变得更简单


http://www.kler.cn/a/302612.html

相关文章:

  • 苦等三年!金克斯大人回来了!
  • Ceph 中PG与PGP的概述
  • Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版
  • 深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器
  • WLAN消失或者已连接但是访问不了互联网
  • 群控系统服务端开发模式-应用开发-前端个人信息功能
  • 基于深度学习的线性预测:创新应用与挑战
  • 华纳云:修复WordPress内存耗尽错误的常用方法有哪些?
  • Linux操作系统入门(二)
  • Android 车联网——CarProperty使用实例(二十三)
  • 结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来
  • 学习react一,环境搭建,基础语法
  • STM32启用FPU浮点运算
  • TI DSP下载器XDS100 V2.0无法使用问题
  • GO学习笔记(4) strconv/time
  • LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
  • 航空维修培训中的虚拟现实辅助工程技术应用
  • pdf在线免费转换成word,这些简单方法已为你罗列好
  • redis高级教程
  • 市政智慧公厕:城市管理的新革命
  • Spring Framework 学习总结博客
  • InternVL2-关于 `argparse` 是否会将连字符(-)视为下划线(_)的问题
  • 【阿一网络安全】如何让你的密码更安全?(三) - 散列函数
  • oracle select字段有子查询的缺点与优化
  • VSTO常见的异常
  • 计算机网络(五) —— 自定义协议简单网络程序