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

文章目录

        • 简介
      • 一.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函数来读取事件

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

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中

	//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下

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下

// 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://xiahunao.cn/news/3018754.html

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

相关文章

2023年度合肥市优秀知识产权服务机构评选申报主体条件、材料和时间程序须知

一、申报主体 在合肥市行政区域内登记注册的知识产权服务机构&#xff0c; 二、申报条件 (一)在合肥市登记注册时间满1年&#xff0c;营业执照经营范围包含知识产权代理、服务等相关内容; (二)在全国专利代理信息公示平台进行备案; (三)有稳定的专业服务人才队伍和服务对象…

21物联1班常用网络扫描

网络扫描 1.网络扫描概述2.网络扫描步骤及分类具体步骤 1.网络扫描概述 网络安全扫描技术是一种基于Internet远程检测目标网络或本地主机安全性脆弱点的技术。通过网络安全扫描&#xff0c;系统管理员能够发现所维护的Web服务器的各种TCP/IP端口的分配、开放的服务、Web服务软件…

量化交易:财务选股RSRS择时的策略

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 引言 本文将介绍一种结合财务指标选股和RSRS&#xff08;Risk-Adjusted Return to Strength Ratio&#xff09;择时的策略&#xff0c;旨在帮助投资者在复杂的市场环境中做出更明智的决策。 感兴趣的朋友&#xff0…

前端 | 自定义电子木鱼

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 &#x1f4da;模块实现解析 &#x1f407;html 搭个框架<!DOCTYPE html> <html lang"en"> <head>&l…

搭建电商ERP系统电商独立站最实用的电商API商品数据采集接口||电商API接口接入

通常搭建电商独立站需要接入的商品数据接口包括&#xff1a; 1. 商品信息接口&#xff1a;包括商品基本信息&#xff08;名称、描述、价格等&#xff09;、图片信息、库存信息、分类信息等。 2. 库存信息接口&#xff1a;用于同步更新商品的库存情况&#xff0c;保证实时性…

同城组局同城活动找搭子小程序JAVA源码面芽组局的实现方案

功能概述 基于微信小程序开发的一款软件&#xff0c;支持用户动态发布、私信聊天关注、礼物充值打赏、发起活动组局、用户报名参与、支持商家入驻&#xff0c;对接广告功能等。 活动发布&#xff1a;用户可以在平台上发布各种类型的活动&#xff0c;如户外徒步、音乐会观赏、…

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …

java项目跑不起来 端口已被使用

背景 Springboot项目跑不起来&#xff0c;原因端口被占用。 解决方法 在 Windows 环境下&#xff0c;你可以按照以下步骤来查看某个端口被占用的情况&#xff0c;并停止相应的进程&#xff1a; 查看所有端口占用情况&#xff1a; 按下 Win R 键&#xff0c;打开运行窗口。…

中霖教育:考下注册会计师能从事哪些工作?

考下注册会计师能够从事哪些工作&#xff1f; 1 企业从事会计和财务工作 大部分的CPA持证人&#xff0c;会在企业里&#xff0c;从事会计和财务工作。但是能拿到多少薪资&#xff0c;也要看你所进入的平台。如果是小企业&#xff0c;实力一般&#xff0c;也就几干块工资。如果…

HTTP免费升级到HTTPS攻略

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS的关键就是申请一个免费的SSL证书 具体步骤如下 1 获取免费SSL证书 国内的JoySSL 提供不限量免费的SSL/TLS证书。根据自己的需求选择证书类型&#xff08;登录JoySSL官网&#xff0c;创建账号…

收银系统源码--什么是千呼智慧新零售系统?

千呼智慧新零售系统是一套针对零售行业线上线下一体化收银系统。给门店提供线下称重收银、o2o线上商城、erp进销存、精细化会员管理、丰富营销插件等一体化解决方案。多端数据打通&#xff0c;实现线上线下一体化&#xff0c;提升门店工作效率&#xff0c;实现数字化升级&#…

详细介绍一下PointPillars算法的网络结构

PointPillars是一种用于3D目标检测的算法&#xff0c;它主要使用了点云数据和深度学习模型。 PointPillars算法的网络结构主要可以分为三个主要阶段&#xff1a; Pillar Feature Net&#xff08;点云特征处理网络&#xff09;&#xff1a;此阶段的主要任务是将输入的点云数据转…

烟道灰中回收铼,Tulsimer®RCX-5143回收铼树脂

号称“金属之最”的铼多伴生在金属矿物中&#xff0c;铼在地壳中的含量很低&#xff0c;仅为1ppb左右&#xff0c;主要分散在辉钼矿、斑铜矿中&#xff0c;铼的提取主要来源于钼冶炼和铜冶炼的烟灰和废酸。 由于其分布的特殊性、工艺的复杂性使得回收铼技术难度大。国内外目前…

什么是等保,为什么要做等保测评

为什么要做等保测评 1、法律法规的要求 做等保是《网络安全法》、《数据安全法》、《信息安全等级保护管理办法》等相关法律法规的要求。 2、企业的要求 近些年&#xff0c;随着人工智能的发展&#xff0c;进行网络攻击的门槛越来越低&#xff0c;而大部分信息系统可能存在的…

舞台演出因全息纱幕投影有哪些新变化?

如今&#xff0c;随着时代的演进&#xff0c;我们对舞台体验的追求愈发深入&#xff0c;渴望在这片艺术天地中&#xff0c;感受到超越日常的震撼与感动&#xff0c;而这种追求&#xff0c;也正与现代技术的飞速发展不谋而合。其中&#xff0c;全息纱幕投影技术以其独特的魅力&a…

桥梁施工污水需要哪些工艺设备

桥梁施工过程中产生的污水通常包含泥浆、油污、化学品残留等污染物。为了有效处理这些污水&#xff0c;确保施工现场的环境保护和合规性&#xff0c;通常需要以下工艺设备&#xff1a; 沉砂池&#xff1a;用于去除污水中的砂粒和其他重质无机物&#xff0c;减少对后续处理设备的…

人工智能_大模型050_模型微调010_模型数据_模型WEB界面代码记录---人工智能工作笔记0185

上面我们把chatglm3的训练代码,和llama2的训练代码,都记录了,然后,再就是: web_demo的代码我们记录一下,然后,我们就继续说下面的内容.至于data目录中的内容,都是一些训练数据,我会 放到资源中,提供下载,这里就不贴出来了,太大了. E:\2024\人工智能\fine-tuning-lab\fine-tun…

Agent AI:智能代理的未来

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦梦梦梦 &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无不言&#xff0c;言无不尽。 目录 一、Agent AI的起源与发展 二、Agent A…

mib browser读取mib文件的oid(飞塔防火墙为例)

在配置zabbix监控的时候,配置监控项最为麻烦,一般我们都会套用模板,这种方式比较简单,但是有些设备就是没有现成的zabbix模板,怎么办? 今天我们使用MIB Browser来获取设备SNMP的OID,然后加入zabbix 。 1.什么是MIB Browser SNMP客户端工具MIB Browser, 全名iReasonin…

学习大模型对你有什么好处?

什么是大模型&#xff1f; 大模型&#xff08;Large Models&#xff09;通常指的是参数量达到数十亿甚至千亿级别的人工智能模型&#xff0c;尤其是深度学习模型。这些模型通过大量的参数来捕捉数据中的复杂关系和模式&#xff0c;从而在各种任务中表现出色&#xff0c;如自然…