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 排版

相关推荐
南宫乘风13 小时前
Kubernetes 本地存储实战:Open-Local 从部署到生产级应用
云原生·容器·kubernetes
eddy-原21 小时前
ELKStack 与 Kubernetes 核心基础知识点综合作业
云原生·容器·kubernetes
ygqygq21 天前
Kubernetes Gateway API 与 Envoy Gateway 部署使用指南
kubernetes·gateway·envoy·ingress
Code知行合壹1 天前
Kubernetes微服务DevOps
微服务·kubernetes·devops
怪我冷i1 天前
win11使用minikube搭建K8S集群基于podman desktop( Fedora Linux 43)
linux·kubernetes·ai编程·ai写作·podman
victory04311 天前
K8S 从Harbor当中拉取镜像 连接方法
云原生·容器·kubernetes
陈陈CHENCHEN1 天前
【Kubernetes】K8s 1.35 配置 Docker 作为容器运行时
docker·kubernetes
勇气要爆发1 天前
Kubernetes (K8S):云时代的“超级舵手”
云原生·容器·kubernetes
大新新大浩浩1 天前
ubuntu2204 + k8s 1.32.5 +GPU-Operator 24.9.2搭建GPU-k8s平台
云原生·容器·kubernetes
懒鸟一枚1 天前
k8s 之minikube安装看k8s
云原生·容器·kubernetes