当前位置: 首页 > news >正文

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环境 官网&#xff1a;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数据迁移&#xff0c;直接 SCP拷贝至另外一台服务器 原服务器处理好后拷贝回来&#xff0c;然后启动elasticsearch报错 {"type": "server", "timestamp": "2…...

java集成Nacos服务

1&#xff0c;添加依赖&#xff1a;首先&#xff0c;在你的 Java 项目中&#xff0c;你需要添加 Nacos 客户端 SDK 的依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</ve…...

开源IPad Pro应用IDE:使用SSH远程连接服务器进行云端编程开发

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…...

ubuntu 自动安装 MKL Intel fortran 编译器 ifort 及完美平替

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

elementui select中添加新增标签

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

图像截屏公式识别——LaTeX-OCR安装与使用

一、简介 LaTeX-OCR 是一个开源的光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专为 LaTeX 文档提供支持。其主要目的是帮助用户将扫描的文档转换为 LaTeX 编辑器可以使用的可编辑文本&#xff0c;从而方便进行修改、编辑和排版。LaTeX广泛用于科技、数学、工程等…...

LabVIEW与Tektronix示波器实现电源测试自动化

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

青少年CTF-Crypto(Morse code/ASCII和凯撒)

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

Vue3-16-【v-model】 表单数据绑定

作用描述 v-model 指令&#xff0c;实现了 表单输入组件的值 与 js 中的变量的值的绑定关系。 当我们在页面上执行输入动作时&#xff0c;js中变量的值也会同步发生变化。表单不仅仅局限于输入框&#xff0c;其他的如 &#xff1a; 单选按钮&#xff0c;复选框&#xff0c;下拉…...

【Flink on k8s】- 12 - Flink kubernetes operator 的高级特性

目录 1、自动伸缩 1.1 工作原理 1.2 Job 要求和限制 1.2.1 要求 1.2.2 限制...

量子芯片技术:未来的计算革命

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

vaptcha-手势验证码

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

【一种用opencv实现高斯曲线拟合的方法】

背景&#xff1a; 项目中需要实现数据的高斯拟合&#xff0c;进而提取数据中标准差&#xff0c;手头只有opencv库&#xff0c;经过资料查找验证&#xff0c;总结该方法。 基础知识&#xff1a; 1、opencv中solve可以实现对矩阵参数的求解&#xff1b; 2、线的拟合就是对多项…...

find_package 和 find_library的区别

背景 经常看CMakeLists.txt中有find_package和find_library&#xff0c;有时候没留意以为都一样&#xff0c;其实二者差距比较大&#xff0c;下面简单记录一下。 find_package find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件&#xff0c;一般在安装库的…...

socket是如何进行通信的

Socket通信的原理大致分为以下几个步骤&#xff1a; 服务器端建立Socket&#xff0c;开始侦听整个网络中的连接请求。当检测到来自客户端的连接请求时&#xff0c;向客户端发送收到连接请求的信息&#xff0c;并建立与客户端之间的连接。当完成通信后&#xff0c;服务器关闭与…...

STM32-固件打包部署

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

微信机器人如何使用?好用吗?好奇

随着微信的使用范围越来越大&#xff0c;所以人一多&#xff0c;管理起来就会遇到很多繁琐的情况需要仍去操作。 比如需要手动一个个通过好友验证&#xff0c;发消息&#xff0c;相同问题一遍遍的回答&#xff0c;消息还容易看漏&#xff0c;回复不过来...... 想着如果有什么可…...

ARMV8 - A64 - 函数调用,内存栈操作

说明 看了下ARM平台上C语言函数调用的反汇编代码&#xff0c;理清楚了其中的内存栈汇编操作&#xff0c;特整理下。本文环境基于&#xff1a;ARMv8-a架构A53核soc&#xff0c;aarch64状态。 预先了解的知识点 内存栈 栈和栈帧的基本概念重点&#xff1a;出栈入栈的单位不是…...

MyBatis 四大核心组件之 ResultSetHandler 源码解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...