K8S管理系统项目实战[API开发]

news2024/11/18 0:42:50

前端: Vue+element plus
后端: go+gin

后端

Go 快速入门 
Gin Web框架
K8s管理系统项目实战[API开发] 

项目背景,整体设计,Client-go,框架搭建

一、项目背景

随着容器技术的广泛应用,kubernetes逐渐成为业内的核心技术,是容器编排技术的首选工具。而k8s管理平台在日常的容器维护中也发挥着举足轻重的作用,但随着k8s的定制化功能越来越多,dashboard已经无法满足日常的维护需求,且dashboard的源码学习成本较高,抽象程度较高,二次发成本也就比较高。
本项目使用当下较主流的前端vue+element plus及后端go+gin框架,打造与dashboard对标的k8s管理功能,且可定制化程度高,可根据自身需求,进行灵活定制开发。

二、前后端分离概述

前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式( 也可以中间加一个node.js)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务( 多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步要是系统架构从进化成人的必经之路。

 前后分离的优势 :
1.可以实现真正的前后端解耦,前端服务器使用nginx。
2.发现bug,可以快速定位是谁的问题,不会出现互相踢皮球的现象

3.在大并发情况下,可以同时水平扩展前后端服务器
4.增加代码的维护性&易读性(前后端耦在一起的代码读起来相当费劲 )

5.提升开发效率,因为可以前后端并行开发,而不是像以前的强依赖

三、功能设计

 四、client-go介绍
1、简介
client-go是kubernetes官方提供的go语言的客户端库,go应用使用该库可以访问kubernetes的API Server,这样我们就能通过编程来对kubermetes资源进行增删改查操作:
除了提供丰富的API用于操kubernetes资源,client-go还为controller和operator提供了重要支持client-go的informer机制可以将controller关注的资源变化及时带给此controller,使controller能够及时响应变化。
通过client-go提供的客户端对象与kubernetes的API Server进行交豆,而client-go提供了以下四种客户端对象
(1)RESTClient:这是最基础的客户端对象,仅对HTTPRequest进行了封装,实现RESTFul风格API,这个对象的使用并不方便,因为很多参数都要使用者来设置,于是client-go基于RESTClient又实现了三种新的客户端对象;
(2)ClientSet;把Resoure和Version也封装成方法了,用起亲更简单直接,一个资源是一个客户端,多个资源就对应了多个客户端所以ClientSet就是多个客户端的集合了,这样就理解了,不过ClientSet只能访问内置资源,访问不了自定义资源
(3)DynamiClient;可以访问内置资源和自定义资源,个人感觉有点像Java的集合操作,拿出的内容是Object类型,按实际情况自己去做强制转换,当然了也会有强转失败的风险:
(4)DiscoveryClient: 用于发现kubernetes的API Server支持的Group、Version、Resources等信息;

// kubectl api-resources

2、代码示例

package main

import (
	"context"
	"flag"
	"fmt"
	"os"
	"path/filepath"

	metav1 "k8s.io/apimeachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	return os.Getenv("USERPROFILE") // windows
}
func main() {
	// 声明kubeconfig配置文件
	var kubeconfig *string
	// 获取home环境变量,拿到$HOME/.kube/config配置文件
	if home := homeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optinal) absolute path to the kubeconfig file")
	} else {
		// 否则就根据kubeconfig传到config的路径
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()
	// 将kubeconfig格式化为rest.config类型
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}
	// 通过config创建clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	// 通过client-go sdk获取pods列表,命名空间是default
	pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	// 打印出pods列表的长度
	fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
}

3、常用方法

	// 获取pod列表
	podList, err := K8S.ClientSet.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
	// 获取pod详情
	pod, err := K8S.ClientSet.CoreV1().Pods(namespace).Get(context.TODO(), podName, metav1.ListOptions{})
	// 删除pod
	err = K8S.ClientSet.CoreV1().Pods(namespace).Delete(context.TODO(), podName, metav1.DeleteOptions{})
	// 更新pod(完整yaml)
	pod, err = K8S.ClientSet.CoreV1().Pods(namespace).Update(context.TODO(), pod, metav1.UpdateOptions{})
	// 获取deployment副本数
	scale, err := K8S.ClientSet.AppsV1().Deployment(namespace).GetScale(context.TODO(), deploymentName, metav1.GetOption{})
	// 创建deployment
	deployment, err = K8S.ClientSet.AppsV1().Deployments(data.Namespace).Create(context.TODO(), deployment, metav1.CreateOption{})
	// 更新deployment(部分yaml)
	deployment, err = K8S.ClientSet.AppsV1().Deployments(namespace).Patch(context.TODO(), deploymentName, "application/strategic-merge-patch-json", patchByte, metav1.PatchOption{})

初始化

创建项目

D:\Workspace\Go\src\k8s-platform

main.go

安装模块

go get k8s.io/client-go/tools/clientcmd
go get k8s.io/api/core/v1
go get k8s.io/apimachinery/pkg/apis/meta/v1
go get github.com/gin-gonic/gin
go get github.com/wonderivan/logger
go get gorm.io/gorm
go get gorm.io/driver/sqlite
go get gorm.io/driver/mysql
PS D:\Workspace\Go\src\k8s-platform> go mod init k8s-platform
go: creating new go.mod: module k8s-platform
go: to add module requirements and sums:    
        go mod tidy

main.go

package main

import (
	"context"
	"fmt"
	"os"

	metav1 "k8s.io/apimeachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	return os.Getenv("USERPROFILE") // windows
}
func main() {
	// // 声明kubeconfig配置文件
	// var kubeconfig *string
	// // 获取home环境变量,拿到$HOME/.kube/config配置文件
	// if home := homeDir(); home != "" {
	// 	kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optinal) absolute path to the kubeconfig file")
	// } else {
	// 	// 否则就根据kubeconfig传到config的路径
	// 	kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	// }
	// flag.Parse()

	// 将kubeconfig格式化为rest.config类型
	// config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	config, err := clientcmd.BuildConfigFromFlags("", "C:\\Users\\Administrator\\.kube\\config")

	if err != nil {
		panic(err.Error())
	}
	// 通过config创建clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	// 通过client-go sdk获取pods列表,命名空间是default
	podList, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	// // 打印出pods列表的长度
	// fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
	for _, pod := range podList.Items {
		fmt.Println(pod.Name, pod.Namespace)
	}

}

五、项目目录结构

 

 项目目录含义

目录名    作用
config    定义全局配置,如:监听地址,管理员账号等
controller    controller层,定义路由规则及接口入参和响应
service    服务层,处理接口的业务逻辑
dao    数据库操作,包含数据的增删改查
model    定义数据库表的字段
db    用于初始化数据库连接及配置
middle    中间件层,添加全局的逻辑处理,如跨域,jwt验证等
utils    工具目录,定义常用工具,如token解析,文件操作等
go.mod    定义项目的依赖包以及版本
main.go    项目主入口,main函数
创建目录

controller config service dao db model middle utils

六、框架搭建

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

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

相关文章

【SpringBoot】SpringBoot集成ElasticSearch

文章目录 第一步,导入jar包,注意这里的jar包版本可能和你导入的不一致,所以需要修改第二步,编写配置类第三步,填写yml第四步,编写util类第五步,编写controller类第六步,测试即可 第一…

黎曼几何与黎曼流形

目录 0.黎曼几何 1. 欧几里得几何与黎曼几何的区别 2.黎曼流形 3.黎曼距离 4.切空间 5.黎曼均值 6. SPD矩阵如何形成黎曼流型 7.切线空间映射 8.同余变换和同余不变 9.黎曼对齐 科普性笔记,做了解,不深入。 0.黎曼几何 黎曼几何是一种基于欧几…

MySQL 表操作

目录 创建表 案例 查看表结构 修改表 案例: 删除表 创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明: field 表示列名 dat…

【Vue学习笔记3】使用Vite开启一个Vue3工程项目

1. 什么是Vite? Vite是一个web开发构建工具。Vite 的竞品是 Webpack,而且按照现在的趋势看,使用率超过 Webpack 也是早晚的事。 Vite 主要提升的是开发的体验,Webpack启动调试环境需要 3 分钟都很常见,Vite大大缩短了这个时间。…

应急加固初试(windows sever 2008)

前言 红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博主、华为网络安全云享专家、腾讯云自媒体分享计划博主 …

SEO优化新手必须掌握的10个技巧和工具

随着互联网的不断发展,SEO(搜索引擎优化)已成为网站拓展和推广的重要手段之一。对于新手而言,学习SEO的基础知识和技巧是至关重要的。在本文中,我将分享SEO优化新手必须掌握的10个技巧和工具。 1.关键词研究 关键词是…

Spring Cloud学习笔记【分布式配置中心-Config】

文章目录 SpringCloud Config概述概述传统方式弊端主要功能与GitHub整合配置 Config服务端配置与测试服务端配置(即Gitee上的配置文件)Config Demo配置Spring Cloud Config访问规则 Config客户端配置与测试bootstrap.yml说明Config客户端 Demo配置 SpringCloud Config概述 概述…

学校信息化管理系统通常包含哪些功能?

学校管理信息化是现代教育发展的必然趋势,随着信息技术的飞速发展,学校管理也逐渐地实现了信息化。信息化的学校管理已经成为教育现代化建设的重要内容,也是提高学校教育教学质量和保障学生安全的重要手段。 作为一款低代码开发平台&#xf…

【Shell编程】| if 判断的五个关键点

个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、if语法格式1.1 if格式1.2 else if 和 else 2、算数比较3、文件判断4、字符串判断5、test指令测试…

Unity Audio -- (1)概览

准备工作 资源包: https://connect-prd-cdn.unity.com/20230208/8dab3a98-4fe1-4adf-99df-8f6c9e1058c9/creativecore-audio-2021.3LTS.zip 下载,解压后用Unity Hub导入本地工程,具体方法,参考: Project setup proce…

放弃40k月薪的程序员工作,选择公务员,我来分享一下看法

我有一个朋友,拒绝了我为他提供的4万薪水的工作,去了一个体制内的银行,做程序员,即使薪水减半。他之前在北京一家大公司做程序员,一个月30k。当我开始创业时,我拉他来和我一起干,但那时我们太小…

干货 | 思维转变之如何成为一个快速学习者!!!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 在信息爆炸的今天,网络上有各种资源,其实有心想要学习,都可以学到。 但是,其实自我学习的过程还是比较艰难,那么是否…

人员管理KPI和OKR

文章目录 人员管理KPI和PI一、关键绩效指标概述(一)关键绩效指标的内涵(二)关键绩效指标的类型(三)基于关键绩效指标的绩效指标体系 二、关键绩效指标库三、指标权重与员工责任 OKR360 环评3P汇报法 人员管…

只使用位运算实现加减乘除

在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了. 1 . 实现加法 首先我们需要知道两数之和可以是两个数位相加和不进位相加之…

c++ 入门概述

c 入门概述 1. c 关键字2. c 命名空间3. c 输入与输出4. c 缺省参数5. c 函数重载6. c 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 引用与指针区别 7. c 内联函数8. c auto 关键字9. 范围 for 循环 1. c 关键字 c 98中,规定的关键字总共有63个: 2. c…

排序算法 - 插入排序

文章目录 插入排序介绍插入排序实现插入排序的时间复杂度和稳定性插入排序时间复杂度插入排序稳定性 代码实现核心&总结 每日一道算法,提高脑力。第三天,插入排序。 插入排序介绍 插入排序(Insertion Sort)的基本思想是: 把n个待排序的元素看成为一…

全网最火,Web自动化测试驱动模型详全,一语点通超实用...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试模型&a…

我记不住的那些Git的操作

背景:其实接触Git也很长时间了,自打上学那会就用Git作为版本控制工具,感触颇深。写这篇文章也是记录一下自己的理解留作日后词典进行查询,另外也是想把这些内容分享给大家。本篇将以问题为导向来阐述相关的知识,面对的…

mid360激光雷达跑Point-LIO算法

在商场里面上下楼穿梭,使用mid360激光雷达,完成建图 以下是建图的运行过程及参数配置 mid360激光雷达驱动 安装(ubuntu20.4 ) /ws_livox/src/livox_ros_driver2$source /opt/ros/noetic/setup.sh /ws_livox/src/livox_ros_driver2$./build.sh ROS1配置修改MID360_confi…

《花雕学AI》06:ChatGPT,一种新型的对话生成模型的机遇、挑战与评估

最近ChatGPT持续大火,大家们是不是在网上看到各种和ChatGPT有趣聊天的截图,奈何自己实力不够,被网络拒之门外,只能眼馋别人的东西。看别人在体验,看别人玩,肯定不如自己玩一把舒服的啊。 上一期&#xff0…