kubebuilder开发operator

2023-12-11 08:28
文章标签 开发 operator kubebuilder

本文主要是介绍kubebuilder开发operator,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装kubebuilder前 需要有kubernetes环境和golang环境
官网:https://go.kubebuilder.io/
安装kubebuilder

#下载
wget https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) 
#改名kubebuilder后加权限
chmod +x kubebuilder
#放到环境变量里
mv kubebuilder /usr/local/bin/
#查看版本
kubebuilder version

创建operator项目

#先创建go mod 项目
go mod init application
#始化 repo 指定的是 module path, 如果项目目录不在 GOPATH 中, 是必须的 
kubebuilder init --domain=danielhu.cn --repo=github.com/daniel-hutao/application-operator --owner Daniel.Hu
#或者不加--repo直接初始化 模块名以go mod init application 的名字为当前module path
kubebuilder init --domain=my.operator.cn
#创建api资源注意:--kind Application 首字母必须大写 否则创建失败
kubebuilder create api --group apps --version v1 --kind Application
#修改玩相关配置代码后进行安装构建
#生成和更新
make manifests
#安装构建 直接部署的k8s集群中
make install
#查看crd
kubectl get crd
#查看资源
kubectl get application -A
#创建资源示例 application.samples.yaml
apiVersion: apps.danielhu.cn/v1
kind: Application
metadata:labels:app: nginxname: application-samplenamespace: default
spec:replicas: 3template:spec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80
#创建
kubectl apply -f application.samples.yaml           
#查看 此时还没有对应controller来处理 所以只有资源 没有对应的pod
kubectl get application -A 

controller实现
此版本的(KubeBuilderVersion:“3.13.0”)kubebuilder controller文件夹在:internal/controller 之前版本直接在:controller

#修改controller/application_controller.go文件
package controllerimport ("context""fmt""time"corev1 "k8s.io/api/core/v1""k8s.io/apimachinery/pkg/api/errors"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/apimachinery/pkg/runtime"ctrl "sigs.k8s.io/controller-runtime""sigs.k8s.io/controller-runtime/pkg/client""sigs.k8s.io/controller-runtime/pkg/log"//对应kubebuilder init --repo=github.com/daniel-hutao/application-operatordappsv1 "github.com/daniel-hutao/application-operator/api/v1"
)// ApplicationReconciler reconciles a Application object
type ApplicationReconciler struct {client.ClientScheme *runtime.Scheme
}func (r *ApplicationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {l := log.FromContext(ctx)//声明一个*Application类型的实例app用了接收我们的crapp := &dappsv1.Application{}if err := r.Get(ctx, req.NamespacedName, app); err != nil {//err分很多种情况,如果找不到,一般不需要处理 只说明这个cr被删除了if errors.IsNotFound(err) {l.Info("the Application is not fount")//直接返回,不带错误,结束本次调谐return ctrl.Result{}, nil}//除了NotFound之外的错误,比如连不上apiserver等 这时候需要打印错误信息,然后返回这个错误以及一分钟后重试的resultl.Error(err, "failed to get the Application")return ctrl.Result{RequeueAfter: 1 * time.Minute}, err}//create podsfor i := 0; i < int(app.Spec.Replicas); i++ {pod := &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name:      fmt.Sprintf("%s-%d", app.Name, i),Namespace: app.Namespace,Labels:    app.Labels,},Spec: app.Spec.Template.Spec,}if err := r.Create(ctx, pod); err != nil {l.Error(err, "failed to create Pod")return ctrl.Result{RequeueAfter: 1 * time.Minute}, err}l.Info(fmt.Sprintf("the Pod (%s) has created", pod.Name))}l.Info("all pods has created")return ctrl.Result{}, nil
}// SetupWithManager sets up the controller with the Manager.
func (r *ApplicationReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).For(&dappsv1.Application{}).Complete(r)
}

运行

#直接运行
make run
#查看pod是否创建
kubectl get pod 

把controller打包后容器化方式部署到kubectlnetes集群中

#构建镜像 如果是golang的镜像 建议先在dockerfile内增加ENV GOPROXY=https://goproxy.io 否则会下载镜像失败
#注意 在master构建镜像 还需要把镜像安装到节点上 因为不知道会调度到那个节点 所以部署的时候 看调度到那个节点 就需要把镜像传到对应节点 否则部署失败
make docker-build IMG=application-operator:v0.0.1
#部署控制器
make deploy IMG=application-operator:v0.0.1
#查看
kubectl get pod -n application-operator-system
#卸载controller
make undeploy
#卸载crd
make uninstall

构建是出现的问题:

#1.依赖下载失败的问题:
339.1 go: github.com/beorn7/perks@v1.0.1: Get "https://proxy.golang.org/github.com/beorn7/perks/@v/v1.0.1.mod": dial tcp 142.251.43.17:443: connect: connection refused
#Dockerfile内增加如下代理
ENV GOPROXY=https://goproxy.io
#2.base镜像下载失败 报错:
ERROR: failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://gcr.io/v2/distroless/static/manifests/nonroot": dial tcp 74.125.23.82:443: connect: connection refused
#处理:我们可以在国内镜像下载 然后换tag
docker pull kubeimages/distroless-static
docker tag kubeimages/distroless-static:latest gcr.io/distroless/static:nonroot 
#问题3 创建pod提示下载镜像错误 原因是此pod调度单node节点 节点上没有刚才构建的镜像 
#解决方法 把镜像下载 在传到节点上
#master下载镜像
docker save -o operator.tar application-operator:v0.0.1
#node节点载入镜像
docker load -i operator.tar 

这篇关于kubebuilder开发operator的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480063

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安