• 使用Kubebuilder编写operator


    内容

    • 暂不涉及相关概念的解释以及源码
    • 如何使用kubebuilder创建一个operator项目
    • 如何使用kind构建本地测试k8s环境
    • 如何使用kubebuilder部署一个operator

    os环境

    mac arm

    amd环境略有不同,后面会指出

    过程

    1. 搭建本地go环境,最新的版本的kubebuilder需要使用go1.17+,这里使用1.18

    推荐使用gvm进行go版本控制,github地址:https://github.com/moovweb/gvm

    安装

    #mac准备环境
    xcode-select --install
    brew update
    brew install mercurial
    #安装
    zsh < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
    或者单独到github上下载,然后安装
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用gvm进行版本控制

    #查看本地go版本,system表示本地原有版本
    gvm list
    #查看可安装版本
    gvm listall
    #安装go1.18
    gvm install go1.18 
    #切换1.18为默认版本
    gvm use go1.18 --default
    #查看当前go版本
    go version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 搭建本地docker环境
    brew instal docker
    
    • 1

    启动国内镜像加速

    针对安装了Docker for Mac的用户,在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将

    https://wv8z9ud0.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。

    1. 使用kind构建本地测试k8s集群,https://github.com/kubernetes-sigs/kind

    安装kind

    brew install kind
    
    • 1

    使用kind

    #创建一个单节点k8s集群
    kind create cluster  --name kind
    #展示出集群
    kind get clusters
    #为了与特定集群进行交互,您只需在 kubectl 中将集群名称指定为上下文
    kubectl cluster-info --context kind-kind
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 部署kubebuilder,官方文档:https://book.kubebuilder.io/quick-start.html#create-an-api
    curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
    chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
    
    • 1
    • 2

    如果下载慢或者下载不下来,可以直接到https://github.com/kubernetes-sigs/kubebuilder/releases下载指定程序,然后cp到执行文件路径

    mv kubebuilder_darwin_arm64 kubebuilder
    chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
    
    • 1
    • 2
    1. 使用kubebuilder创建一个项目,包括CRD的GVK(group,version,kind)
    mkdir demoperator
    #初始化go工程
    cd demo-operator && go mod init demo-operator
    #arm os架构初始化crd所属domain
    kubebuilder init --domain my.domain --plugins="kustomize/v2-alpha,base.go.kubebuilder.io/v3"
    #其他比如amd等os架构
    kubebuilder init --domain my.domain"
    #创建crd 的schema以及controller逻辑
    kubebuilder create api --group webapp --version v1 --kind DemeOperator
    > y
    > y 
    #创建crd资源清单
    make manifests
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    **注意:**后续的编译打包部署过程中会用到kustomize,对于mac m1 arm架构,kustomize v3不支持,所以需要使用官方插件进行修复https://github.com/kubernetes-sigs/kubebuilder/issues/2566,使用“–plugins=“kustomize/v2-alpha,base.go.kubebuilder.io/v3””

    1. 查看生成的框架目录结构
    .
    ├── api         ## 这里定义了 sample 的结构体 GVK,以及所需的 deepcopy 实现         
    │   └── v1
    │       ├── groupversion_info.go
    │       ├── sample_types.go
    │       └── zz_generated.deepcopy.go 
    ├── bin
    │   └── manager ## controller 编译后的 二进制文件
    ├── config      ## 包含了我们在使用 crd 是可能需要的 yml 文件,包括rbac、controller的deployment 等
    │   ├── certmanager
    │   ├── crd
    │   ├── default
    │   ├── manager
    │   ├── prometheus
    │   ├── rbac
    │   ├── samples  #crd资源类型的部署yaml
    │   └── webhook
    ├── controllers         ## 我们的controller 逻辑就放在这里
    │   ├── sample_controller.go
    │   └── suite_test.go
    ├── Dockerfile          
    ├── go.mod
    ├── go.sum
    ├── hack
    │   └── boilerplate.go.txt
    ├── main.go
    ├── Makefile  #编译打包工具
    └── PROJECT
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    详细介绍:

    • api/v1/* 用于生成我们自定义资源的GVK,也就是注册到kubernetes的schema
    • config/ 此目录包含围绕我们的operator和自定义资源的所有 YAML相关内容。YAML 清单类似于rolesrolebindingsCRD、示例演示 YAML 等,都位于此目录下。
    • controllers/* 实现operator处理逻辑的地方
    • main.go 入口,把controller 实例化并附加到manager执行
    • hack/* 基本的shell脚本或任何其他类型的“hacky”脚本,以自动化我们oeprator周围的任何类型的操作。例如,运行某些检查背后的脚本、递归格式化/linting代码的脚本、安装和设置必备工具的脚本等都将放置在这里
    • 围绕构建和部署我们的operator的所有相关目标以及其他内容,例如引导 CRD、实用程序代码(如带有控制器生成的 DeepCopy 方法等)。
    1. 本地测试以及打包发布

    本地测试:

    #部署crd到默认k8s集群,默认~/.kube/config
    make install
    #运行controller
    make run
    
    • 1
    • 2
    • 3
    • 4

    arm架构可能会出现的报错处理:

    Version v3.8.7 does not exist or is not available for darwin/arm64.
    make: *** [/Users/xiaozhuang/Documents/project/goProject/deme-operator/bin/kustomize] Error 1
    
    • 1
    • 2

    解决方法:使用官方插件修复,“–plugins=“kustomize/v2-alpha,base.go.kubebuilder.io/v3””,上面已经说过

    部署crd实例,kubebuilder自动生成了实例yaml config/samples/webapp_v1_guestbook2.yaml

    kubectl apply -f config/samples/webapp_v1_demooperator.yaml
    
    • 1

    到k8s中查看资源创建情况

    打包docker并发布

    #使用docker登录docker hub获取其他仓库
    docker login -u -p
    #打包,过程可能会报错,多尝试几次就可以
    make docker-build docker-push IMG=peizhilei/demooperator:001
    #发布
    make deploy  IMG=peizhilei/demooperator:001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 卸载
    #删除crd
    make uninstall
    #删除controller
    make undeploy
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    NanoPC-T4 RK3399:uboot cmd与boot加载
    LeetCode刷题记录02——新手村专辑(一)
    第二十一章《万年历》第2节:系统功能实现
    如何做一个基于 Python 的搜索引擎?
    软件测试技术之如何编写测试用例(4)
    OpenVPN服务器搭建与OpenVPN客户端访问
    SpringCloud - 项目搭建
    Springboot足球运动员训练计划管理系统的设计与实现 毕业设计-附源码281444
    全量知识系统 程序详细设计 库模式的存储库模型: “三生”(派生衍生自生) (Q&A SmartChat)
    关于城市旅游的HTML网页设计 HTML+CSS上海博物馆网站 dreamweaver作业静态HTML网页设计 html网页制作期末大作业
  • 原文地址:https://blog.csdn.net/qq_43490312/article/details/126551032