【GO】 K8s 管理系统项目[API部分--StatefulSet]

news2025/1/11 0:09:31

K8s 管理系统项目[API部分–StatefulSet]

1. 接口实现

service/dataselector.go

// statefulSetCell
type statefulSetCell appsv1.StatefulSet

func(s statefulSetCell) GetCreation() time.Time {
	return s.CreationTimestamp.Time
}

func(s statefulSetCell) GetName() string {
	return s.Name
}

2. StatefulSet功能

service/statefulset.go

2.1 from和to方法

func(s *statefulSet) toCells(std []appsv1.StatefulSet) []DataCell {
	cells := make([]DataCell, len(std))
	for i := range std {
		cells[i] = statefulSetCell(std[i])
	}
	return cells
}

func(s *statefulSet) fromCells(cells []DataCell) []appsv1.StatefulSet {
	statefulSets := make([]appsv1.StatefulSet, len(cells))
	for i := range cells {
		statefulSets[i] = appsv1.StatefulSet(cells[i].(statefulSetCell))
	}

	return statefulSets
}

2.2 获取statefulset详情

// 获取statefulset详情
func (s *statefulSet) GetStatefulSetDetail(statefulSetName, namespace string) (statefulSet *appsv1.StatefulSet, err error) {
	statefulSet, err = K8s.ClientSet.AppsV1().StatefulSets(namespace).Get(context.TODO(), statefulSetName, metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取StatefulSet详情失败, " + err.Error()))
		return nil, errors.New("获取StatefulSet详情失败, " + err.Error())
	}

	return statefulSet, nil
}

2.2 删除statefulset

// 删除statefulset
func (s *statefulSet) DeleteStatefulSet(statefulSetName, namespace string) (err error) {
	err = K8s.ClientSet.AppsV1().StatefulSets(namespace).Delete(context.TODO(), statefulSetName, metav1.DeleteOptions{})
	if err != nil {
		logger.Error(errors.New("删除StatefulSet失败, " + err.Error()))
		return errors.New("删除StatefulSet失败, " + err.Error())
	}

	return nil
}

2.3 更新statefulset

// 更新statefulset
func (s *statefulSet) UpdateStatefulSet(namespace, content string) (err error) {
	var statefulSet = &appsv1.StatefulSet{}

	err = json.Unmarshal([]byte(content), statefulSet)
	if err != nil {
		logger.Error(errors.New("反序列化失败, " + err.Error()))
		return errors.New("反序列化失败, " + err.Error())
	}

	_, err = K8s.ClientSet.AppsV1().StatefulSets(namespace).Update(context.TODO(), statefulSet, metav1.UpdateOptions{})
	if err != nil {
		logger.Error(errors.New("更新StatefulSet失败, " + err.Error()))
		return errors.New("更新StatefulSet失败, " + err.Error())
	}
	return nil
}

2.4 整个StatefulSet.go

package service

import (
	"context"
	"encoding/json"
	"errors"

	"github.com/wonderivan/logger"
	appsv1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var StatefulSet statefulSet

type statefulSet struct{}

type StatusfulSetsResp struct {
	Items []appsv1.StatefulSet `json:"items"`
	Total int                  `json:"total"`
}

// 获取statefulset列表,支持过滤、排序、分页
func (s *statefulSet) GetStatefulSets(filterName, namespace string, limit, page int) (statusfulSetsResp *StatusfulSetsResp, err error) {
	//获取statefulSetList类型的statefulSet列表
	statefulSetList, err := K8s.ClientSet.AppsV1().StatefulSets(namespace).List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		logger.Error(errors.New("获取StatefulSet列表失败, " + err.Error()))
		return nil, errors.New("获取StatefulSet列表失败, " + err.Error())
	}
	//将statefulSetList中的StatefulSet列表(Items),放进dataselector对象中,进行排序
	selectableData := &dataSelector{
		GenericDataList: s.toCells(statefulSetList.Items),
		DataSelect: &DataSelectQuery{
			Filter: &FilterQuery{Name: filterName},
			Paginate: &PaginateQuery{
				Limit: limit,
				Page:  page,
			},
		},
	}

	filtered := selectableData.Filter()
	total := len(filtered.GenericDataList)
	data := filtered.Sort().Paginate()

	//将[]DataCell类型的statefulset列表转为v1.statefulset列表
	statefulSets := s.fromCells(data.GenericDataList)

	return &StatusfulSetsResp{
		Items: statefulSets,
		Total: total,
	}, nil
}

// 获取statefulset详情
func (s *statefulSet) GetStatefulSetDetail(statefulSetName, namespace string) (statefulSet *appsv1.StatefulSet, err error) {
	statefulSet, err = K8s.ClientSet.AppsV1().StatefulSets(namespace).Get(context.TODO(), statefulSetName, metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取StatefulSet详情失败, " + err.Error()))
		return nil, errors.New("获取StatefulSet详情失败, " + err.Error())
	}

	return statefulSet, nil
}

// 删除statefulset
func (s *statefulSet) DeleteStatefulSet(statefulSetName, namespace string) (err error) {
	err = K8s.ClientSet.AppsV1().StatefulSets(namespace).Delete(context.TODO(), statefulSetName, metav1.DeleteOptions{})
	if err != nil {
		logger.Error(errors.New("删除StatefulSet失败, " + err.Error()))
		return errors.New("删除StatefulSet失败, " + err.Error())
	}

	return nil
}

// 更新statefulset
func (s *statefulSet) UpdateStatefulSet(namespace, content string) (err error) {
	var statefulSet = &appsv1.StatefulSet{}

	err = json.Unmarshal([]byte(content), statefulSet)
	if err != nil {
		logger.Error(errors.New("反序列化失败, " + err.Error()))
		return errors.New("反序列化失败, " + err.Error())
	}

	_, err = K8s.ClientSet.AppsV1().StatefulSets(namespace).Update(context.TODO(), statefulSet, metav1.UpdateOptions{})
	if err != nil {
		logger.Error(errors.New("更新StatefulSet失败, " + err.Error()))
		return errors.New("更新StatefulSet失败, " + err.Error())
	}
	return nil
}

func (s *statefulSet) toCells(std []appsv1.StatefulSet) []DataCell {
	cells := make([]DataCell, len(std))
	for i := range std {
		cells[i] = statefulSetCell(std[i])
	}
	return cells
}

func (s *statefulSet) fromCells(cells []DataCell) []appsv1.StatefulSet {
	statefulSets := make([]appsv1.StatefulSet, len(cells))
	for i := range cells {
		statefulSets[i] = appsv1.StatefulSet(cells[i].(statefulSetCell))
	}

	return statefulSets
}

3. 获取StatefulSet列表

controller/statefulset

package controller

import (
	"github.com/gin-gonic/gin"
	"github.com/wonderivan/logger"
	"k8s-plantform/service"
	"net/http"
)

var StatefulSet statefulSet

type statefulSet struct {}

//获取statefulset列表,支持过滤、排序、分页
func(s *statefulSet) GetStatefulSets(ctx *gin.Context) {
	params := new(struct {
		FilterName  string `form:"filter_name"`
		Namespace   string `form:"namespace"`
		Page        int    `form:"page"`
		Limit       int    `form:"limit"`
	})
	if err := ctx.Bind(params); err != nil {
		logger.Error("Bind请求参数失败, " + err.Error())
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

	data, err := service.StatefulSet.GetStatefulSets(params.FilterName, params.Namespace, params.Limit, params.Page)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{
		"msg": "获取StatefulSet列表成功",
		"data": data,
	})
}

//获取statefulset详情
func(s *statefulSet) GetStatefulSetDetail(ctx *gin.Context) {
	params := new(struct {
		StatefulSetName    string `form:"statefulset_name"`
		Namespace          string `form:"namespace"`
	})
	if err := ctx.Bind(params); err != nil {
		logger.Error("Bind请求参数失败, " + err.Error())
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

	data, err := service.StatefulSet.GetStatefulSetDetail(params.StatefulSetName, params.Namespace)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{
		"msg": "获取StatefulSet详情成功",
		"data": data,
	})
}

//删除statefulset
func(s *statefulSet) DeleteStatefulSet(ctx *gin.Context) {
	params := new(struct{
		StatefulSetName   string  `json:"statefulset_name"`
		Namespace         string  `json:"namespace"`
	})
	//DELETE请求,绑定参数方法改为ctx.ShouldBindJSON
	if err := ctx.ShouldBindJSON(params); err != nil {
		logger.Error("Bind请求参数失败, " + err.Error())
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

	err := service.StatefulSet.DeleteStatefulSet(params.StatefulSetName, params.Namespace)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": "删除StatefulSet成功",
		"data": nil,
	})
}

//更新statefulSet
func(s *statefulSet) UpdateStatefulSet(ctx *gin.Context) {
	params := new(struct{
		Namespace       string  `json:"namespace"`
		Content         string  `json:"content"`
	})
	//PUT请求,绑定参数方法改为ctx.ShouldBindJSON
	if err := ctx.ShouldBindJSON(params); err != nil {
		logger.Error("Bind请求参数失败, " + err.Error())
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

	err := service.StatefulSet.UpdateStatefulSet(params.Namespace, params.Content)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": "更新StatefulSet成功",
		"data": nil,
	})
}

4. 定义路由

controller/router.go

//statefulset操作
		GET("/api/k8s/statefulsets", StatefulSet.GetStatefulSets).
		GET("/api/k8s/statefulset/detail", StatefulSet.GetStatefulSetDetail).
		DELETE("/api/k8s/statefulset/del", StatefulSet.DeleteStatefulSet).
		PUT("/api/k8s/statefulset/update", StatefulSet.UpdateStatefulSet)

5. 测试StatefulSet方法

5.1 获取statefulset

/api/k8s/statefulsets

请添加图片描述

5.2 获取statefulset详情

/api/k8s/statefulset/detail

请添加图片描述

5.3 删除statefulset

/api/k8s/statefulset/del
root@master-01:~# kubectl get statefulsets.apps -n k8s
NAME    READY   AGE
nginx   2/2     4m33s

请添加图片描述

root@master-01:~# kubectl get statefulsets.apps -n k8s
No resources found in k8s namespace.

5.4 更新statefulset

/api/k8s/statefulset/update

这个届时也和前端一起测试

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

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

相关文章

河道水文标尺监测系统 OpenCv

河道水文标尺监测系统借助PythonOpenCv深度学习架构模型对江河湖泊进行全天候不间断实时检测,当PythonOpenCv深度学习架构模型监测到水位异常时,立即抓拍存档告警,同步告警截图和视频推送给相关人员。OpenCV的全称是Open Source Computer Vis…

JUC之ABA问题

什么是ABA问题? ABA问题是由CAS而导致的一个问题 CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并交换,那么在这个时间差内会导致数据的变化。 比如说一个线程一从内存位置V中取出A,这是另一个线程二也从内存中取出…

从注解入手理解springboot原理

一、理解注解 1、注解是什么? 注解可以理解为一个标记或者标签,范围可以是类、方法、属性。 2、自定义一个注解,进行理解spring的自动装配。 自定义自己的注解:JDK官方提供提供了一些基础元注解,就是标记注解的注解…

Android设计模式详解之状态模式

前言 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为。 状态模式和策略模式的结构几乎完全一样,但他们的目的、本质却完全不一样。 状态模式的行为是平行的、不可替换的,而策略模式的行为是彼此独立、可互相替换的。 状态模式把…

满足耐压24V的USB3.0 USB3.1 Type-C防静电器件

什么是USB3.1 Type-C 现有的USB 2.0协议允许高达480Mbps的数据传输速率,并支持即插即用、热插拔安装和运行。与之相比,USB 3.0规范允许高达5Gbps的数据传输速率,并向后支持较低速的USB 2.0规范。 USB 3.0增加了4个接到连接器的新引脚&#…

湖北移动M411A_ZN-S905L3AB-UWE5621DS原机制作语音线刷包

湖北移动M411A_ZN-S905L3AB-UWE5621DS原机制作语音线刷包,打开原机屏蔽的WIFI,设置、首页、语音正常。 固件特点: 1、修改dns,三网通用; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、无开机广告&am…

非零基础自学Golang 第16章 正则表达式 16.1 正则表达式介绍 16.2 正则表达式语法

非零基础自学Golang 文章目录非零基础自学Golang第16章 正则表达式16.1 正则表达式介绍16.2 正则表达式语法16.2.1 普通字符16.2.2 字符转义16.2.3 元字符16.2.4 限定符16.2.5 定位符16.2.6 分组构造16.2.7 匹配模式第16章 正则表达式 正则表达式(Regular Expressi…

Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?

在上一篇,我们学会了redis集群的扩容。从3主3从扩容到4主4从。 那么,接着,活动过去了。流量没有那么大了。需要缩容了。从4主4从缩容到3主3从了。那么这个时候又该怎么处理呢? PS本系列:《Docker学习系列》教程已经发布的内容,凯哥会在文末加上。 缩容思考问题: 1:…

TypeScript 前端工程最佳实践

作者:王春雨 前言 随着前端工程化的快速发展, TypeScript 变得越来越受欢迎,它已经成为前端开发人员必备技能。 TypeScript 最初是由微软开发并开源的一种编程语言,自2012年10月发布首个公开版本以来,它已得到了人们…

Docker自定义镜像上传阿里云

目录 1. alpine 简介 2. 基于alpine构建jdk8镜像 2.1 Dockerfile 2.2 将构建目录上传到linux中 2.3 执行构建 3. 镜像瘦身 4. 上传阿里云镜像仓库 1. alpine 简介 Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了mus…

斯坦福联合Meta提出多模态模型RA-CM3,检索增强机制或成文本图像领域新制胜法宝

原文链接:https://www.techbeat.net/article-info?id4403 作者:seven_ 论文链接: https://arxiv.org/abs/2211.12561 相信目前很多AI大模型研究者都会遇到一个非常困难的问题,那就是很难控制的模型参数和容量,由于参与…

【Three.js入门】纹理及其常用属性、透明纹理、环境遮挡贴图与强度

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

消息队列—RabbitMQ(万字详解)

消息队列—RabbitMQ 笔记整理自 【涛哥】最适合小白入门的RabbitMQ教程 1. 消息队列介绍 Ⅰ. 消息队列需求场景 在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出…

矢量网络分析仪如何测量史密斯图及滤波器的带宽?

矢量网络分析仪是一种很神奇的测量仪器,它的功能很强大也值得人们去探索。今天,安泰测试工程师就针对矢量网络分析仪中的史密斯图及滤波器的带宽测量进行简单的介绍,希望能够让更多的人对此有所了解,并产生兴趣。 首先仪器了解一下…

数字孪生可视化图表:了解堆叠的条形图

数据可视化已成为我们日常数据分析工作当中的重要组成部分,可视化大屏是数据可视化发展的产物。这又不得不说到一个概念:可视化组件。可视化组件是制作数字孪生可视化大屏必不可少的一部分,在一个完整的数字孪生可视化大屏中用到的图表可不少…

Android系统之路(初识MTK) ------Android11.0给辅助工具-手电筒添加低电Toast提醒

Android11.0给辅助工具-手电筒添加低电Toast提醒 今天因为在复测昨天的一个monkey压测并且还没测完,所以打算记录最近做系统开发的一些心得和经验,也记录一下自己的系统开发历程 修改前的效果图: 修改后的效果图: 后期补上… 修改前当电量小于等于15%时,按钮依旧可以打…

11条非常实用的Git 和 Git 命令,值得你收藏

基本命令 01. init git init 在当前目录中创建一个新的空仓库。 02. clone git clone https://github.com/facebook/react.git 将远程存储库复制到当前目录。 03. add git add 命令将工作目录中的新文件或更改的文件添加到 Git 暂存区。 git add <file1> <file2&…

【WAF绕过-4】漏洞利用之注入上传跨站等绕过

1、SQL注入 如需sqlmap注入测试&#xff0c; 防cc拦截&#xff1a;修改user-agent头代理&#xff08;付费代理池&#xff09; 修改user-agent头&#xff1a; &#xff08;1&#xff09;加参数&#xff1a;--random-agent &#xff08;2&#xff09;加参数&#xff1a;--user-a…

几十年前的老旧照片如何修复?还不知道旧照片怎么恢复清晰吗?

那些旧照片本身会随着时间的推移而褪色、褶皱。老旧照片修复主要是从褪色、变色、破损、发霉、的旧相片修复翻新&#xff0c;到模糊不清清晰化处理&#xff0c;大面积严重破损照片修补。 十年以前&#xff0c;没有电脑&#xff0c;没有手机&#xff0c;更没有存储照片工具。大…

【关于时间序列的ML】项目 5 :用机器学习预测天气

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…