首页 > 其他分享 >kubebuilder的简单入门

kubebuilder的简单入门

时间:2024-05-13 12:08:38浏览次数:23  
标签:kubectl 入门 Redis redis yaml kubebuilder 简单 go

确保 kubeconfig 文件 ~/.kube/config 存在,并且内容正确

如果是k3s参考我之前的文章 https://www.cnblogs.com/qcy-blog/p/18188865

1. Operator 是什么?

Operator 是使用自定义资源(CR,Custom Resource)管理应用及其组件的自定义控制器(Controller)
Control Plane 的控制器实施控制循环,反复比较集群的 Disired Status 和 Current Status,如果两者不符,那么控制器采取措施解决该问题
CR 是 Kubernetes 中的 API 扩展机制
自定义资源定义(CRD,Custom Resource Definition)明确 CR,列出 Operator 用户可用的所有配置
Operator 通过 CRD 引入新对象类型。Kubenetes API 像处理内置对象一样处理 CRD

2. 安装 kubebuilder

curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/

查看 kubebuilder 版本

kubebuilder version
# 输出:
Version: main.version{KubeBuilderVersion:"3.14.2", KubernetesVendor:"1.27.1", GitCommit:"d7b4febe6b673709100b780b5b99151c5e26a206", BuildDate:"2024-04-27T08:27:24Z", GoOs:"linux", GoArch:"amd64"}

3. 创建测试项目

mkdir kubebuilder-operator-demo
cd kubebuilder-operator-demo/
go mod init kubebuilder-operator-demo

4. 初始化项目 --domain 是公司域名

kubebuilder init  --domain timd.cn

当看到如下输出时,表明初始化成功:

...
$ go mod tidy
Next: define a resource with:
$ kubebuilder create api
说明:
config/default/kustomization.yaml 中的 namespace 字段用于为所有资源添加命名空间。
在这里它是 kubebuilder-operator-demo-system,因为他是跟go mod 有关系

5. 创建 API

这是使用 Kubebuilder 工具创建一个新的自定义 Kubernetes API 资源。具体来说,它会创建一个名为 Redis 的新资源,位于 testapp 组中,

并且版本为 v1。这将在您的项目中生成相应的代码,包括 API 对象定义、控制器和 CRD(自定义资源定义)。

kubebuilder create api --group testapp --version v1 --kind Redis

创建成功后,项目结构如下:

.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── api
│   └── v1
│       ├── groupversion_info.go
│       ├── redis_types.go
│       └── zz_generated.deepcopy.go
├── bin
│   └── controller-gen
├── config
│   ├── crd
│   │   ├── kustomization.yaml
│   │   ├── kustomizeconfig.yaml
│   │   └── patches
│   │       ├── cainjection_in_redis.yaml
│   │       └── webhook_in_redis.yaml
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_auth_proxy_patch.yaml
│   │   └── manager_config_patch.yaml
│   ├── manager
│   │   ├── kustomization.yaml
│   │   └── manager.yaml
│   ├── prometheus
│   │   ├── kustomization.yaml
│   │   └── monitor.yaml
│   ├── rbac
│   │   ├── auth_proxy_client_clusterrole.yaml
│   │   ├── auth_proxy_role.yaml
│   │   ├── auth_proxy_role_binding.yaml
│   │   ├── auth_proxy_service.yaml
│   │   ├── kustomization.yaml
│   │   ├── leader_election_role.yaml
│   │   ├── leader_election_role_binding.yaml
│   │   ├── redis_editor_role.yaml
│   │   ├── redis_viewer_role.yaml
│   │   ├── role_binding.yaml
│   │   └── service_account.yaml
│   └── samples
│       └── testapp_v1_redis.yaml
├── controllers
│   ├── redis_controller.go
│   └── suite_test.go
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
└── main.go
说明:##############
apiVersion 为 testapp.timd.cn/v1
kind 为 Redis

6. 创建测试 CRD

将 api/v1/redis_types.go 中 RedisSpec 结构体的定义改为:

// RedisSpec defines the desired state of Redis
type RedisSpec struct {
    // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
    // Important: Run "make" to regenerate code after modifying this file

    // Foo is an example field of Redis. Edit redis_types.go to remove/update
    //Foo string `json:"foo,omitempty"`

    Port int `json:"port,omitempty"`
}

创建 test/redis.yaml 文件,其内容为:

apiVersion: testapp.timd.cn/v1
kind: Redis
metadata:
  name: testapp
spec:
  port: 80

安装:

make install

如果通过在线脚本下载 kustomize 失败,可以使用代理;或自己下载 kustomize,然后放到 bin/ 目录下

查看刚刚创建的 CRD:

kubectl describe crd redis.testapp.timd.cn

7. 在本地运行

将 controllers/redis_controller.go 中 Reconcile() 方法的定义改为:

func (r *RedisReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    _ = log.FromContext(ctx)

    // TODO(user): your logic here
    redis := &testappv1.Redis{}
    if err := r.Get(ctx, req.NamespacedName, redis); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("object:", redis)
    }

    return ctrl.Result{}, nil
}

注意:导入 fmt 包

在一个窗口运行:

make run

在另一个窗口运行:

kubectl apply -f test/redis.yaml

查看第一个窗口的日志;用 kubectl 查看刚刚创建的 CR:

kubectl get redis

8. 添加验证

将 api/v1/redis_types.go 中 RedisSpec 的定义修改为:
// RedisSpec defines the desired state of Redis
type RedisSpec struct {
    // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
    // Important: Run "make" to regenerate code after modifying this file
    // +kubebuilder:validation:Maximum:=6380
    // +kubebuilder:validation:Minimum:=6370
    Port int `json:"port,omitempty"`
}

安装:

make install

查看 CRD:

kubectl get crd redis.testapp.timd.cn -o yaml

可以看到类似下面的输出:

          spec:
            description: RedisSpec defines the desired state of Redis
            properties:
              port:
                description: Foo is an example field of Redis. Edit redis_types.go
                  to remove/update
                maximum: 6380
                minimum: 6370
                type: integer
            type: object

测试验证:

kubectl delete -f test/redis.yaml
kubectl apply -f test/redis.yaml

可以看到类似下面的错误:

The Redis "testapp" is invalid: spec.port: Invalid value: 80: spec.port in body should be greater than or equal to 6370

9. 将 Operator 部署到 Kubernetes 集群

将前面测试过程中创建的 CR、CRD 清理掉:

kubectl delete -f test/redis.yaml
make uninstall

然后重新安装:

make install
kubectl get crd redis.testapp.timd.cn

9.1. 构建镜像

make docker-build IMG=<镜像名称>:<标签>

9.2. 部署

make deploy IMG=<镜像名称>:<标签>

通过如下命令查看部署状态:

kubectl -n kubebuilder-operator-demo-system get all

通过如下命令查看 Pod 输出的日志(注意替换 Pod 的名称):

kubectl -n kubebuilder-operator-demo-system logs -f kubebuilder-operator-demo-controller-manager-74fb7bf75-522tg

创建 CR,同时观察 Pod 的输出:

kubectl apply -f test/redis.yaml

多改几次 .spec.port 的值,观察输出。

标签:kubectl,入门,Redis,redis,yaml,kubebuilder,简单,go
From: https://www.cnblogs.com/qcy-blog/p/18188958

相关文章

  • 蓝桥杯-移动距离(最简单的写法)
    X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:123456121110987131415.....我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移......
  • Matlab小白入门简易使用
    Matlab小白入门简易使用前言:Matlab是matrix和laboratory的组合,意为“矩阵工厂”,是目前数一数二的数学分析软件。在数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融等领域都有非常广泛的应用。主要面对科学计算、可视化以及交互式程序设计的高科技计......
  • pyFlink 入门总结
    一整体流程1.初始化pyFlink执行环境2.加载数据集3.执行数据分析4.导出分析结果 二初始化执行环境2.1初始化参考代码如下frompyflink.tableimportEnvironmentSettings,StreamTableEnvironmentes=EnvironmentSettings.new_instance().in_batch_mode().bui......
  • 使用Lambda表达式和接口的简单Java 8 Predicate示例
    大量的Java编程涉及到对真或假值的评估,从条件语句到迭代循环。当您使用JDK的StreamsAPI和Lambda函数时,可以使用备受欢迎的JavaPredicate接口来简化布尔条件的评估。也被称为Java8Predicate(源自引入函数式编程的JDK版本),这个简单的接口定义了五个方法,尽管只有JavaPredicate的t......
  • 43.Android 网络编程的简单学习整理
    关于Android网络通信编程Android对HTTP通信提供了支持通过标准的JAVA类HttpURLConnection便可以实现基于URL的请求及响应功能关于URL和URI还分不清吗然后还有就是GET和POST方式提交数据注意使用GET或者POST方式提交参数时为了防止中文乱码要对参数进行编码使用Web......
  • kettle从入门到精通 第五十九课 ETL之kettle 邮件发送多个附件,使用正则轻松解决
    问题场景:一个朋友说他用kettle将生成好的多个文件(a.xls和b.xls,文件在data目录下)发送给客户,但是data目录下还有其他的文件,他如果指定data目录发送会把data目录下面的所有文件都作为附件进行发送,显然不符合要求,所以他当时的临时解决方法是创建个临时目录,里面只放a.xls和b.xls两个......
  • varnish源码编译以及简单配置
    varnish安装系统centos7ip192.168.40.131禁止透明大页echonever>/sys/kernel/mm/transparent_hugepage/enabled减少最大堆栈大小ulimit-s256安装nginxyumlist|grep^nginx&&yum-yinstallnginx*mkdir/usr/share/nginx/html/helloecho“hellowo......
  • 关于为随机函数PRF的入门认知
    伪随机函数(PseudoRandomFunction,即PRF)在密码学中是一个重要的概念,是一个基础的密码学原语。基本概念PRF是一个确定性的函数。我们记定义在$(K,X,Y)$上的函数$F$,其中$K$是密钥空间,$X$和$Y$分别是输入和输出空间。对于PRF,给定确定的密钥k,函数$F$应该看上去是一个定义在$X\rig......
  • Vue.js的Vue@Cli入门指南
    Vue.js是一款流行的JavaScript框架,它使得构建交互式的Web界面变得简单和快捷。Vue@Cli是Vue.js官方提供的脚手架工具,它能够帮助我们快速搭建Vue.js项目,并提供了丰富的功能和插件。准备工作在开始之前,确保您已经安装了node.js和npm。然后,您可以通过以下命令安装Vue@Cli:npminsta......
  • ThreadLocal入门笔记
    ThreadLocal入门笔记最近学习小傅哥的面经手册,学习到ThreadLocal,这里做个笔记加深印象,也方便日后复习。ThreadLocal是除了加锁这种同步方式之外的一种规避多线程访问出现线程不安全的方法,它的核心思想是:共享变量在每个线程都有一个副本,每个线程操作的都是自己的副本,对另外的线程......