【k8s多集群管理平台开发实践】十一、client-go实现读取k8s的事件信息

devtools/2024/10/9 15:17:29/

文章目录

        • 简介
      • 一.k8s读取k8s事件
        • 1.1.controllers控制器代码
        • 1.2.models模型代码
      • 二.路由设置
        • 2.1.路由设置
      • 三.前端代码
        • 5.1.列表部分html代码
      • 四.完整代码
        • 4.1.控制器event.go的完整代码
        • 4.2.模型eventModel.go的完整代码
      • 五.效果图

简介

本章节主要讲解通过client-go实现读取k8s事件信息,并通过layui实现界面操作,其中包含控制器这部分的代码,模型这部分代码,以及前端的html代码。

一.k8s读取k8s事件

1.1.controllers控制器代码

通过传递集群id、命名空间、资源类型来进行过滤,并调用模型代码中EventList函数来读取事件

golang">func (this *EventController) List() {clusterId := this.GetString("clusterId")namespace := this.GetString("nameSpace")kind := this.GetString("kind") //类型包括:Pod/Namespace/Ingress/Service/Node/Configmap/Deployment/Stateful/Job/Cronjob/Secret可参考阿里云k8s事件中心类型objName := this.GetString("objName")limitd, _ := this.GetInt64("limit")List, err := m.EventList(clusterId, namespace, kind, objName, limitd)msg := "success"code := 0count := len(List)if err != nil {log.Println(err)msg = err.Error()code = -1}this.Data["json"] = &map[string]interface{}{"code": code, "msg": msg, "count": count, "data": &List}this.ServeJSON()
}
1.2.models模型代码

先定义一个结构体Events,然后定义一个结构体数组var bbb = make([]Events, 0),并循环读取Items中的数据并赋值到结构体,然后再追加到数组中bbb

golang">type Events struct {EventType  string `json:"eventType"` //事件类型 warnningKind       string `json:"kind"`      //对象类型 pod or deploymentObjName    string `json:"objName"`   //对象:pod的名称Message    string `json:"message"`   //信息Reason     string `json:"reason"`    //原因、内容CreateTime string `json:"createTime"`
}func EventList(kubeconfig, namespace, kind, objName string, limitd int64) ([]Events, error) {clientset := common.ClientSet(kubeconfig)var err errorvar events *corev1.EventListvar listOptions = metav1.ListOptions{}if limitd > 0 {listOptions = metav1.ListOptions{Limit: limitd,}}//根据传递的类型进行过滤事件if kind != "" && objName != "" {listOptions = metav1.ListOptions{FieldSelector: fmt.Sprintf("involvedObject.name=%s", objName),TypeMeta:      metav1.TypeMeta{Kind: fmt.Sprintf("%s", kind)},}events, err = clientset.CoreV1().Events(namespace).List(context.TODO(), listOptions)} else if kind != "" && objName == "" {listOptions = metav1.ListOptions{TypeMeta: metav1.TypeMeta{Kind: fmt.Sprintf("%s", kind)},}events, err = clientset.CoreV1().Events(namespace).List(context.TODO(), listOptions)} else {events, err = clientset.CoreV1().Events(namespace).List(context.TODO(), listOptions)}if err != nil {log.Printf("list deployment error, err:%v\n", err)}//将事件按照时间进行倒序输出lessFunc := func(i, j int) bool {return events.Items[j].CreationTimestamp.Before(&events.Items[i].CreationTimestamp)}sort.SliceStable(events.Items, lessFunc)var bbb = make([]Events, 0)for _, item := range events.Items {//用于过滤和搜索if objName != "" && kind == "" {if !strings.Contains(item.InvolvedObject.Name, objName) {continue}}Items := &Events{EventType:  item.Type,Kind:       item.InvolvedObject.Kind,ObjName:    item.InvolvedObject.Name,Message:    item.Message,Reason:     item.Reason,CreateTime: item.CreationTimestamp.Format("2006-01-02 15:04:05"),}bbb = append(bbb, *Items)//log.Println(item)}return bbb, err
}

二.路由设置

2.1.路由设置

将以下代码放到routers/route.go中

golang">	//eventbeego.Router("/event/v1/List", &controllers.EventController{}, "*:List")

三.前端代码

5.1.列表部分html代码

3.1 eventList.html,放到views/front/page/xkube下

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>configmap列表</title><meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><link rel="stylesheet" href="/lib/layui-v2.6.3/css/layui.css" media="all"><link rel="stylesheet" href="/css/public.css" media="all"><script type="text/javascript" src="/lib/jquery-3.4.1/jquery-3.4.1.min.js"></script><script src="/lib/layui-v2.6.3/layui.js" charset="utf-8"></script><script src="/js/xkube.js?v=1" charset="utf-8"></script><script src="/js/lay-config.js?v=1.0.4" charset="utf-8"></script><style type="text/css">.layui-table-cell {height: auto;line-height: 22px !important;text-overflow: inherit;overflow: visible;white-space: normal;}.layui-table-cell .layui-table-tool-panel li {word-break: break-word;}
</style>
</head>
<body>
<div class="layuimini-container"><div class="layuimini-main"><fieldset class="table-search-fieldset"><legend>搜索信息</legend><div style="margin: 10px 10px 10px 10px"><form class="layui-form layui-form-pane" action=""><div class="layui-form-item"><div class="layui-inline"><label class="layui-form-label">事件类型</label><div class="layui-input-inline"><select name="kind"><option value="warnning" selected="">warnning</option></select></div></div><div class="layui-inline"><label class="layui-form-label">对象</label><div class="layui-input-inline"><select name="kind"><option value="deployment" selected="">deployment</option><option value="daemonset">daemonset</option><option value="pod">pod</option><option value="job">job</option>                                                                <option value="cronjob">cronjob</option></select></div></div><div class="layui-inline"><label class="layui-form-label">命名空间</label><div class="layui-input-inline"><select name="nameSpace" id="nameSpace"><option value="default" selected="">default</option><option value="">所有空间</option></select></div></div><div class="layui-inline"><button type="submit" class="layui-btn"  lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button></div></div></form></div></fieldset><table class="layui-table" id="currentTableId" lay-filter="currentTableFilter"></table></div>
</div>
</body>
<script>
var clusterId = getQueryString("clusterId");
if (clusterId == null) {clusterId = getCookie("clusterId")
}layui.use(['form', 'table','miniTab'], function () {var $ = layui.jquery,form = layui.form,table = layui.table;miniTab = layui.miniTab,miniTab.listen();table.render({elem: '#currentTableId',url: '/event/v1/List?clusterId='+clusterId,toolbar: '#toolbarDemo',//initSort: {field:'createTime', type:'desc'},defaultToolbar: ['filter', 'exports', 'print', {title: '提示',layEvent: 'LAYTABLE_TIPS',icon: 'layui-icon-tips'}],parseData: function(res) { //实现加载全部数据后再分页if(this.page.curr) {result=res.data.slice(this.limit*(this.page.curr-1),this.limit*this.page.curr);}else{result=res.data.slice(0,this.limit);}return {"code": res.code,"msg":'',"count":res.count,"data":result};},cols: [[//{type: "checkbox", width: 50},{field: 'eventType', width: 130,title: '类型', sort: true},{field: 'kind', width: 150,title: '对象', sort: true},{field: 'objName', width: 180,title: '名称', sort: true},                                {field: 'message',title: '消息', sort: true},{field: 'reason', title: '原因',width: 200, sort: true},{field: 'createTime', width:180, title: '创建时间'}]],//size:'lg',limits: [25, 50, 100],limit: 25,page: true});});
</script></body>
</html>

四.完整代码

4.1.控制器event.go的完整代码

4.1 event.go,放到contrillers下

golang">package controllersimport (//"encoding/json""log"m "myk8s/models"beego "github.com/beego/beego/v2/server/web"
)type EventController struct {beego.Controller
}func (this *EventController) List() {clusterId := this.GetString("clusterId")namespace := this.GetString("nameSpace")kind := this.GetString("kind") //Pod/Namespace/Ingress/Service/Node/Configmap/Deployment/Stateful/Job/Cronjob/Secret可参考阿里云k8s事件中心类型objName := this.GetString("objName")limitd, _ := this.GetInt64("limit")List, err := m.EventList(clusterId, namespace, kind, objName, limitd)msg := "success"code := 0count := len(List)if err != nil {log.Println(err)msg = err.Error()code = -1}this.Data["json"] = &map[string]interface{}{"code": code, "msg": msg, "count": count, "data": &List}//this.Data["json"] = &datasthis.ServeJSON()
}
4.2.模型eventModel.go的完整代码

4.2 eventModel.go,放到models下

golang">// eventModel.go
package modelsimport ("context""fmt"//"time""log""myk8s/common""sort""strings"corev1 "k8s.io/api/core/v1"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)type Events struct {EventType  string `json:"eventType"` //事件类型 warnningKind       string `json:"kind"`      //对象类型 pod or deploymentObjName    string `json:"objName"`   //对象:pod的名称Message    string `json:"message"`   //信息Reason     string `json:"reason"`    //原因、内容CreateTime string `json:"createTime"`
}func EventList(kubeconfig, namespace, kind, objName string, limitd int64) ([]Events, error) {clientset := common.ClientSet(kubeconfig)var err errorvar events *corev1.EventListvar listOptions = metav1.ListOptions{}if limitd > 0 {listOptions = metav1.ListOptions{Limit: limitd,}}if kind != "" && objName != "" {listOptions = metav1.ListOptions{FieldSelector: fmt.Sprintf("involvedObject.name=%s", objName),TypeMeta:      metav1.TypeMeta{Kind: fmt.Sprintf("%s", kind)},}events, err = clientset.CoreV1().Events(namespace).List(context.TODO(), listOptions)} else if kind != "" && objName == "" {listOptions = metav1.ListOptions{TypeMeta: metav1.TypeMeta{Kind: fmt.Sprintf("%s", kind)},}events, err = clientset.CoreV1().Events(namespace).List(context.TODO(), listOptions)} else {events, err = clientset.CoreV1().Events(namespace).List(context.TODO(), listOptions)}if err != nil {log.Printf("list deployment error, err:%v\n", err)}lessFunc := func(i, j int) bool {return events.Items[j].CreationTimestamp.Before(&events.Items[i].CreationTimestamp)}sort.SliceStable(events.Items, lessFunc)var bbb = make([]Events, 0)for _, item := range events.Items {if objName != "" && kind == "" {if !strings.Contains(item.InvolvedObject.Name, objName) {continue}}Items := &Events{EventType:  item.Type,Kind:       item.InvolvedObject.Kind,ObjName:    item.InvolvedObject.Name,Message:    item.Message,Reason:     item.Reason,CreateTime: item.CreationTimestamp.Format("2006-01-02 15:04:05"),}bbb = append(bbb, *Items)//log.Println(item)}return bbb, err
}

五.效果图

在这里插入图片描述


http://www.ppmy.cn/devtools/41898.html

相关文章

Leaflet.canvaslabel在Ajax异步请求时bindPopup无效的解决办法

目录 前言 一、场景重现 1、遇到问题的代码 2、问题排查 二、通过实验验证猜想 1、排查LayerGroup和FeatureGroup 2、排查Leaflet.canvaslabel.js 三、柳暗花明又一村 1、点聚类的办法 2、歪打正着 总结 前言 在上一篇博客中介绍了基于SpringBoot的全国风景区WebGIS按…

行为型模式

模板方法模式 #include<iostream> #include<string> using namespace std;/*案例&#xff1a;写简历内容&#xff1a;最近有个招聘会&#xff0c;可以带上简历去应聘了。但是&#xff0c;其中有一家公司不接受简历&#xff0c;而是给应聘者发了一张简历表&#xf…

Pytorch的深度学习

PyTorch是一个流行的深度学习框架&#xff0c;它以其易用性、灵活性和动态图特性而广受开发者喜爱。以下是对PyTorch在深度学习中的详细介绍&#xff1a; 核心基础架构&#xff1a; 张量&#xff08;Tensor&#xff09;&#xff1a;PyTorch的基本数据结构&#xff0c;类似于Num…

strcpy函数详解

strcpy函数详解 1.函数简介2.strcpy函数的使用2.1使用方法一2.1使用方法二 3.strcpy在使用过程中的注意事项3.1被复制字符必须以\0结尾3.2目标空间必须能够大于源字符串长度3.3目标空间必须可变 1.函数简介 strcpy函数包含在<string.h>库函数中&#xff0c;是将一个字符…

c++实现数据库连接池

介绍 为提高mysql的访问性能&#xff0c;可增加连接池。为什么他能提高性能&#xff1a; mysql是基于C/S架构&#xff0c;从客户端到服务器&#xff0c;一条sql的执行流程&#xff1a;tcp三次握手->mysql连接认证->执行sql->关闭mysql连接->tcp四次挥手 每次数据库…

axios 取消token 模糊搜索

import axios from ‘axios’; // 创建一个取消令牌源&#xff08;cancel token source&#xff09; const CancelToken axios.CancelToken; const source CancelToken.source(); // 下拉框搜索函数 function search() { // 获取输入值 const inputValue document.getElem…

Shell之高效文本处理命令

目录 一、排序命令—sort 基本语法 常用选项 二、去重命令—uniq 基本语法 常用选项 三、替换命令—tr 基本语法&#xff1a; 常用选项 四、裁剪命令—cut 基本语法&#xff1a; 常用选项 字符串分片 五、拆分命令—split 基本语法&#xff1a; 六、 文件…

第八章 小程序后端开发

目录 8.1.比目后端云简介 8.1.1.注册Bmob账号 8.1.2.创建应用 8.1.3.配置小程序密钥 8.1.4获取小程序服务器域名和“应用密钥” 8.1.5下载及安装Bomb SDK 8.2.数据的增、删、改、查 8.2.1创建表及字段 8.2.2添加一条记录 8.2.3 获取一条记录 8.2.4 修改一条记录 8.2.…