kubebuilder(2)创建项目及初始化

kubebuilder(2)创建项目及初始化

一个demo项目来了解kubebuilder的项目结构

初始化项目

arduino 复制代码
mkdir demo-operator
cd demo-operator
kubebuilder init --domain demo.com --repo demo.com/tutorial

这一步创建了 Go module 工程基本的模板文件,引入了必要的依赖

如果不用--repo参数,也可以先

bash 复制代码
go mod init demo.com/tutorial

手动初始化一个go module工程

打印的日志

sql 复制代码
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
Get controller runtime:
$ go get sigs.k8s.io/controller-runtime@v0.10.0
Update dependencies:
$ go mod tidy
Next: define a resource with:
$ kubebuilder create api

可以看到我这里使用的controller-runtime是0.10.0版本。

查看

go 复制代码
[root@paas-m-k8s-master-1 demo-operator]# tree
.
├── config
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_auth_proxy_patch.yaml
│   │   └── manager_config_patch.yaml
│   ├── manager
│   │   ├── controller_manager_config.yaml
│   │   ├── kustomization.yaml
│   │   └── manager.yaml
│   ├── prometheus
│   │   ├── kustomization.yaml
│   │   └── monitor.yaml
│   └── rbac
│       ├── auth_proxy_client_clusterrole.yaml
│       ├── auth_proxy_role_binding.yaml
│       ├── auth_proxy_role.yaml
│       ├── auth_proxy_service.yaml
│       ├── kustomization.yaml
│       ├── leader_election_role_binding.yaml
│       ├── leader_election_role.yaml
│       ├── role_binding.yaml
│       └── service_account.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
├── main.go
├── Makefile
└── PROJECT

6 directories, 24 files

就是一个标准的go module项目

一些重要的文件

  1. Makefile:非常重要的工具,以后编译构建、部署、运行都会用到;
  2. PROJECT:kubebuilder工程的元数据,在生成各种API的时候会用到这里面的信息;
  3. config/default:基于kustomize制作的配置文件,为controller提供标准配置,也可以按需要去修改调整;
  4. config/manager:一些和manager有关的细节配置,例如镜像的资源限制;
  5. config/rbac:如果需要限制operator在kubernetes中的操作权限,就要通过rbac来做精细的权限配置了

main.go是程序的入口,初始化了Manager,由manager来管理api和controller

我们现在捋一下,k8s接收crd资源描述,crd被我们将要编写的controllrt控制。那么manager是什么

manager是用来管理controller的控制器,代码的主要功能就是启动controller,并使多个controller共存

下面我们继续创建crd文件和对应的controller代码

创建crd文件和controller

创建api的命令如下:但先别急着执行

css 复制代码
kubebuilder create api --group tutorial --version v1 --kind Demo
csharp 复制代码
也就是常说的GVK
1)group参数表示组的概念
2)version定义版本
3)kind定义自定义资源类型
4)以上参数组成了自定义资源的yaml 的 apiVersion和kind

如果直接执行,你可能会遇到这个错误

image-20240129164353991

原因是

在执行过程中,会根据Makefile来执行操作。

其中有一步是使用controller-gen来生成代码

image-20240129164517895

这里寻找controller-gen的路径是$(shell pwd)/bin/controller-gen

并不是我之前安装的controller-gen路径,所以需要修改以下。

否则找不到,就会去下载,但是我当前工作目录下并没有bin目录。会失败

改成

ini 复制代码
CONTROLLER_GEN = controller-gen

因为我上一篇准备工作,已经放到全局可执行了。

同理,把kustomize也顺手改掉,后面的make会用到

image-20240129164933847

ini 复制代码
KUSTOMIZE = kustomize

现在执行一下创建命令

image-20240129165802014

执行成功之后,查看下目录

image-20240129165924556

可以看到,kubebuilder自动为我们创建了几个关键的目录和文件

  • api/v1 :对应于创建时指定的version v1。 名字demo对应我们创建时指定的Kind
  • config/crd
  • controllers

我们查看几个重要的文件

  1. 在PROJECT文件中新增了API资源声明

    yaml 复制代码
    domain: demo.com
    layout:
    - go.kubebuilder.io/v3
    projectName: demo-operator
    repo: demo.com/tutorial
    resources:
    - api:
        crdVersion: v1
        namespaced: true
      controller: true
      domain: demo.com
      group: tutorial
      kind: Demo
      path: demo.com/tutorial/api/v1
      version: v1
    version: "3"
  2. 新增了api目录,包含crd的类型定义

  3. 新增了crd目录,是crd的描述文件

  4. 在rbac目录中新增了对应的role文件

  5. 新增controller目录,包含controller文件

  6. 还有一个不容易发现的修改点是main.go文件

    lua 复制代码
    	if err = (&controllers.DemoReconciler{
    		Client: mgr.GetClient(),
    		Scheme: mgr.GetScheme(),
    	}).SetupWithManager(mgr); err != nil {
    		setupLog.Error(err, "unable to create controller", "controller", "Demo")
    		os.Exit(1)
    	}

    注册了我们的controller

一些不重要的文件

可以看到在api下还有两个文件

  • groupversion_info.go
  • zz_generated.deepcopy.go

这两个文件都不需要去修改。groupversion_info是一些group和version信息,zz_generated.deepcopy.go是会自动生成的。

本文使用 markdown.com.cn 排版

相关推荐
Python私教31 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
O&REO2 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy2 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文3 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻3 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge12 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX13 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总13 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿13 小时前
k8s 集群安装
云原生·容器·kubernetes
颜淡慕潇15 小时前
【K8S系列】kubectl describe pod显示ImagePullBackOff,如何进一步排查?
后端·云原生·容器·kubernetes