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
安装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 k…...
docker中启动ES报错:AccessDeniedException: /usr/share/elasticsearch/data/nodes
一、K8S部署的elasticsearch 6.8版本 数据持久化到本地磁盘 今天做elasticsearch数据迁移,直接 SCP拷贝至另外一台服务器 原服务器处理好后拷贝回来,然后启动elasticsearch报错 {"type": "server", "timestamp": "2…...
java集成Nacos服务
1,添加依赖:首先,在你的 Java 项目中,你需要添加 Nacos 客户端 SDK 的依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</ve…...

开源IPad Pro应用IDE:使用SSH远程连接服务器进行云端编程开发
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...

ubuntu 自动安装 MKL Intel fortran 编译器 ifort 及完美平替
首先据不完全观察,gfortran 与 openblas是 intel fortran 编译器 ifotr和mkl的非常优秀的平替,openblas连函数名都跟mkl一样,加了一个下划线。 1, 概况 https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-too…...

elementui select中添加新增标签
<el-select v-model"ruleForm.eventType" :placeholder"请选择事件类型,可手动添加" ref"template" clearable visible-change"(v) > visibleChange(v, template)"><el-option v-for"item in eventTypeOp…...

图像截屏公式识别——LaTeX-OCR安装与使用
一、简介 LaTeX-OCR 是一个开源的光学字符识别(OCR)软件,专为 LaTeX 文档提供支持。其主要目的是帮助用户将扫描的文档转换为 LaTeX 编辑器可以使用的可编辑文本,从而方便进行修改、编辑和排版。LaTeX广泛用于科技、数学、工程等…...

LabVIEW与Tektronix示波器实现电源测试自动化
LabVIEW与Tektronix示波器实现电源测试自动化 在现代电子测试与测量领域,自动化测试系统的构建是提高效率和精确度的关键。本案例介绍了如何利用LabVIEW软件结合Tektronix MDO MSO DPO2000/3000/4000系列示波器,开发一个自动化测试项目。该项目旨在自动…...

青少年CTF-Crypto(Morse code/ASCII和凯撒)
FLAG:你这一生到底想干嘛 专研方向: Web安全 ,Md5碰撞 每日emo:不要因为别人都交卷了,就乱选答案 文章目录 1.Morse code2、ASCII和凯撒的约定 1.Morse code 题目提示摩尔斯电码,这个是给的附件 直接用摩尔斯解密&am…...

Vue3-16-【v-model】 表单数据绑定
作用描述 v-model 指令,实现了 表单输入组件的值 与 js 中的变量的值的绑定关系。 当我们在页面上执行输入动作时,js中变量的值也会同步发生变化。表单不仅仅局限于输入框,其他的如 : 单选按钮,复选框,下拉…...
【Flink on k8s】- 12 - Flink kubernetes operator 的高级特性
目录 1、自动伸缩 1.1 工作原理 1.2 Job 要求和限制 1.2.1 要求 1.2.2 限制...

量子芯片技术:未来的计算革命
量子芯片技术:未来的计算革命 一、引言 随着科技的不断发展,人类正在进入一个全新的技术时代,即量子时代。量子芯片技术作为这个时代的重要代表,正逐渐改变我们对计算和信息处理的理解。本文将深入探讨量子芯片技术的基本原理、…...

vaptcha-手势验证码
很外向,上班总想坐老板的位置。 网址:https://www.vaptcha.com/#demo 第一次接触是在大学刚毕业的时候,搞了一半就没搞了。时隔1年多,回来看看。 难点,图片还原,轨迹,canvas校验等。 轨迹的…...

【一种用opencv实现高斯曲线拟合的方法】
背景: 项目中需要实现数据的高斯拟合,进而提取数据中标准差,手头只有opencv库,经过资料查找验证,总结该方法。 基础知识: 1、opencv中solve可以实现对矩阵参数的求解; 2、线的拟合就是对多项…...
find_package 和 find_library的区别
背景 经常看CMakeLists.txt中有find_package和find_library,有时候没留意以为都一样,其实二者差距比较大,下面简单记录一下。 find_package find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件,一般在安装库的…...
socket是如何进行通信的
Socket通信的原理大致分为以下几个步骤: 服务器端建立Socket,开始侦听整个网络中的连接请求。当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。当完成通信后,服务器关闭与…...

STM32-固件打包部署
STM32-固件打包部署 Fang XS.1452512966qq.com STM32固件输出 工程上使用Keil开发STM32软件;在调试过程中,可直接编译下载;例如bootloader和APP,在调试时,可以直接下载2次;但是工程上,需要大…...

微信机器人如何使用?好用吗?好奇
随着微信的使用范围越来越大,所以人一多,管理起来就会遇到很多繁琐的情况需要仍去操作。 比如需要手动一个个通过好友验证,发消息,相同问题一遍遍的回答,消息还容易看漏,回复不过来...... 想着如果有什么可…...
ARMV8 - A64 - 函数调用,内存栈操作
说明 看了下ARM平台上C语言函数调用的反汇编代码,理清楚了其中的内存栈汇编操作,特整理下。本文环境基于:ARMv8-a架构A53核soc,aarch64状态。 预先了解的知识点 内存栈 栈和栈帧的基本概念重点:出栈入栈的单位不是…...

MyBatis 四大核心组件之 ResultSetHandler 源码解析
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...