k8s之client-go:golang与k8s交互的桥梁

文章目录

  • 前言
  • 示例
  • 总结

前言

k8s是一个非常成熟且强大的容器自动化编排引擎,对于这样一个利器,k8s官方提供了clientgo用来给我们使用golang去接入k8s,通过k8s的api来对k8s中的资源进行操作
通过client-go实现对k8s集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作

示例

我们通过一个申请K8S中cronjob资源的例子,来举例说明clientgo的使用

package mainimport ("k8s.io/client-go/kubernetes""k8s.io/client-go/rest"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"v1 "k8s.io/api/core/v1"batchv1 "k8s.io/client-go/applyconfigurations/batch/v1"corev1 "k8s.io/client-go/applyconfigurations/core/v1"
)var cli *kubernetes.Clientset
var config *rest.Config// InitK8SCli 创建clientgo客户端
func InitK8SCli() error {var err error// k8s中的Pod通过这种方式获取配置信息(需要通过给pod绑定角色,通过rbac的权限控制对资源操作的权限)config, err = rest.InClusterConfig()if err != nil {return err}cli, err = kubernetes.NewForConfig(config)if err != nil {return err}return nil
}func main() {err := InitK8SCli()if err != nil {panic(err)}// 成功的job的最大数量var successfulJobsHistoryLimit int32 = 1// 失败的job的最大数量var failedJobsHistoryLimit int32 = 1// job执行完毕之后的存活时间var ttlSecondsAfterFinished int32 = 1cronJobInfo := K8SCronJobInfo{Name:                       "zuimo",Namespace:                  "zuimo",Schedule:                   "* * * * *",Image:                      "busybox",Command:                    []string{"echo", "hello world"},RestartPolicy:              "Never",SuccessfulJobsHistoryLimit: &successfulJobsHistoryLimit,FailedJobsHistoryLimit:     &failedJobsHistoryLimit,TTLSecondsAfterFinished:    &ttlSecondsAfterFinished,}err = ApplyCronJob(cronJobInfo)if err != nil {panic(err)}
}type K8SCronJobInfo struct {Name                       string   `json:"name"`Namespace                  string   `json:"namespace"`Schedule                   string   `json:"schedule"`Image                      string   `json:"image"`Command                    []string `json:"command"`RestartPolicy              string   `json:"restartPolicy"`SuccessfulJobsHistoryLimit *int32   `json:"successfulJobsHistoryLimit"`FailedJobsHistoryLimit     *int32   `json:"failedJobsHistoryLimit"`TTLSecondsAfterFinished    *int32   `json:"ttlSecondsAfterFinished"`
}// 申请cronjob的函数
func ApplyCronJob(cronJobInfo K8SCronJobInfo) error {cronJob := buildCronJob(cronJobInfo)result, err := cli.BatchV1().CronJobs(cronJobInfo.Namespace).Apply(context.Background(), cronJob,metav1.ApplyOptions{FieldManager: "data-manager"})if err != nil {fmt.Printf("cron job obj: %v\n", result)return err}return nil
}// buildCronJob 构造cronjob结构体
func buildCronJob(param K8SCronJobInfo) *batchv1.CronJobApplyConfiguration {container := corev1.Container().WithName(param.Name).WithImage(param.Image).WithImagePullPolicy(v1.PullIfNotPresent).WithCommand(param.Command...)podSpec := corev1.PodSpec().WithContainers(container).WithRestartPolicy(v1.RestartPolicy(param.RestartPolicy))podTemplateSpec := corev1.PodTemplateSpec().WithSpec(podSpec)jobSpec := batchv1.JobSpec().WithTemplate(podTemplateSpec)if param.TTLSecondsAfterFinished != nil {jobSpec = jobSpec.WithTTLSecondsAfterFinished(*param.TTLSecondsAfterFinished)}jobTemplateSpec := batchv1.JobTemplateSpec().WithSpec(jobSpec)cronJobSpec := setJobsHistoryLimit(batchv1.CronJobSpec().WithSchedule(param.Schedule).WithJobTemplate(jobTemplateSpec), param.SuccessfulJobsHistoryLimit, param.FailedJobsHistoryLimit)return batchv1.CronJob(param.Name, param.Namespace).WithSpec(cronJobSpec)
}func setJobsHistoryLimit(cronJobSpec *batchv1.CronJobSpecApplyConfiguration, successfulJobsHistoryLimit,failedJobsHistoryLimit *int32) *batchv1.CronJobSpecApplyConfiguration {if successfulJobsHistoryLimit != nil {cronJobSpec = cronJobSpec.WithSuccessfulJobsHistoryLimit(*successfulJobsHistoryLimit)}if failedJobsHistoryLimit != nil {cronJobSpec = cronJobSpec.WithFailedJobsHistoryLimit(*failedJobsHistoryLimit)}return cronJobSpec
}

总结

我们演示了一个简单的例子,来描述client-go的基本用法,希望对你有所帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript 基础类型(一)

简介 它是 JavaScript 的超集,具有静态类型检查和面向对象编程的特性。TypeScript 的出现,为开发者提供了一种更加严谨和高效的开发方式。 主要特点: 、静态类型检查。 通过静态类型检查,开发者可以在编译时发现错误&#xff0…

QQ频道导航退出

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140413538 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

Jquery常用操作汇总,dom操作,ajax请求

这段时间在写一些小Demo,用的都是很远古的Jquery,哈哈哈,但是呢也挺好玩儿的。想着记录一下。 题外话:补充一些自己欠缺的前端知识,(我的前端学的比较乱,哈哈哈,原生的js不是很熟,&a…

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构 一.链表的中间节点思路1:暴力求解思路2:快慢指针 二.返回倒数第k个节点思路1:暴力求解思路2:快慢指针 三.反转链表思路1:头插法思路2:反转指针的指向 四.链表的回文结构思路1:利…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符(三元运算符)7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…

Laravel入门:快速启动你的第一个应用

当然!下面是关于如何使用Laravel快速启动你的第一个应用的教程。 Laravel入门:快速启动你的第一个应用 1. 简介 Laravel是一个现代化的PHP框架,以其优雅的语法和丰富的功能广受欢迎。本教程将引导你从零开始创建一个简单的Laravel应用。 2…

python的自省机制(改bug有用)

在 Python 中,自省(Introspection)机制是指程序在运行时能够获取自身的信息,例如对象的类型、属性、方法等。 Python 提供了一些内置函数和特殊属性来支持自省。以下是一些常见的例子: type() 函数:返回对象…

Prometheus 云原生 - 监控 Linux、MySQL、Redis、RabbitMQ、Docker、SpringBoot 3.x

目录 开始 Exporter 采集数据,Prometheus 拉取并监控 Linux MySQL Redis RabbitMQ Docker SpringBoot 3.x 开始 Exporter 采集数据,Prometheus 拉取并监控 Note:Prometheus 和 Grafana 的部署已经在前面的章节中讲过了,不…

Solana Blink和SEND的崛起:技术与市场效应的结合

随着Solana生态系统的不断发展,新的项目和技术不断涌现,吸引了大量的关注和投资。最近,Solana的Blink项目及其相关的SEND代币成为了市场的焦点,引发了广泛的讨论和投资热潮。本文将探讨Blink和SEND的技术创新、市场表现以及未来的…

C++中的自定义数据类型:类和结构体

目录 自定义数据类型(1)类A.面向对象的四大特征B.What(什么是类)C.Why(类的作用)D.How(如何定义和使用类) (2)结构体 自定义数据类型 (1)类 A.面向对象的四大特征 谈到类,就必须讲一下面向对…

基于MATHCAD的傅里叶级数模拟和方波图像绘制

一、MATHCAD软件简介 MATHCAD是一款功能强大的数学计算软件,它允许用户以类似手写公式的方式输入数学表达式,并即时显示计算结果和图形。在工程研究和学术写作的世界里,MathCAD以其强大的符号运算能力和直观的数学书写体验脱颖而出。MATHCAD…

三相PWM整流器PI双闭环控制Simulink

1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Rb)软件。建议采用matlab2017 Rb及以上版本打开。(若需要其他版本可联系代为转换) 2.拓扑结构: 3.模型算法架构: 4.仿真算法: &am…

Lua协程(同步的多线程)

1.coroutine.create( func ) 创建一个协程,返回co(coroutine),参数是一个函数,当调用resume时就唤醒co并调用函数 2.coroutine.resume(co, 函数参数们) 启动协程co并传入协程调用函数的参数,可以带回协程…

前端XMLHttpRequest、Fetch API、Axios实现文件上传、下载方法及后端Spring文件服务器处理方法

前言 本文总结Web应用开发中文件上传、下载的方法,即从前端表单输入文件并封装表单数据,然后请求后端服务器的处理过程;从基础的JavaScript中XmlHttpRequest对象、Fetch API实现上传、下载进行说明,并给出了前端常用的axios库的请…

[AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性

目录 背景描述 用浏览器访问,正常返回 ​编辑 AHK v2官方示例源代码 AHK v2运行结果报错(0x80092004) 找不到对象或属性 用thqby大佬的WinHttpRequest.ahk库测试报错 0x80092004 找不到对象或属性 附: 用Apifox访问,也正常返回 AHK v1 …

克洛托光电再度合作福晶科技,高精度光学镜头装调仪正式交付

近日,苏州东方克洛托光电技术有限公司(下称“克洛托光电”)高精度光学镜头装调仪正式交付于福建福晶科技股份有限公司,研发人员在现场完成设备安装调试并介绍使用方法。据悉,这已是双方第二次展开合作。 前沿产品力助推…

django之 annotate,aggrate

annotate:annotate() 不是一个终止子句。 annotate() 子句的输出是一个 QuerySet;这个 QuerySet 可以使用任何其他 QuerySet 操作进行修改,包括 filter()、order_by(),甚至对 annotate() 的额外调用。"增加一列属性" ag…

k8s中kubesphere开启devops总是报错解决

自己搭建过k8s集群遇到各种形式的报错,手动去解决,其实这都是由程序自动去解决的问题,由于自己的的失误导致问题不得不去亲自解决是虽然管用但费时费力,在kubersphere开启devops本身没什么问题,但由于虚拟机配置低导致…

SpringBoot+Vue实现简单的文件上传(策略模式)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI 2 问题 前两篇文章,我们上传了txt、Excel文件,其实文件类型有很多种,如果我们的upload组件没有上传文件类型的限制,那么同一个…

MongoDB Shard 集群 Docker 部署

MongoDB Shard Docker 部署 部署环境 主机地址主机配置主机系统Mongodb1/192.168.31.1352CPU 4GBDebian12Mongodb2/192.168.31.1092CPU 4GBDebian12Mongodb3/192.168.31.1652CPU 4GBDebian12 镜像版本 mongodb/mongodb-community-server:5.0.27-ubuntu2004 部署集群 部署…