【go】模板展示不同k8s命名空间的deployment

news2024/11/29 10:48:30

gin模板展示k8s命名空间的资源

  • 这里学习如何在前端单页面,调用后端接口展示k8s的资源

技术栈

  • 后端 -> go -> gin -> gin模板
  • 前端 -> gin模板 -> html + js
  • k8s -> k8s-go-client ,基本资源(deployment等)

环境

  • go 1.19
  • k8s 1.23
  • go module
    • github.com/gin-gonic/gin v1.6.3
    • k8s.io/client-go v0.20.2

搭建环境

  • 安装 k8s 、go 开发环境(此处省略)
  • ide打开后创建项目(我的项目名叫gin_k8s_deploy),然后安装go module
go get github.com/gin-gonic/gin@v1.6.3
go get k8s.io/client-go@v0.20.2
  • 复制k8s的kubeconfig(/root/.kube/config)到项目
    • 注:假如是公网的环境,需特别处理。假如是内网(虚拟机等)可以直连的情况则无需处理
      在这里插入图片描述
  • 以下是公网k8s的kubeconfig的处理,将里面的内网ip换成公网ip(因为你无法通过内网ip直连),并且ca认证这行删除
    在这里插入图片描述

后端

  • 初始化k8s的客户端
    • client/K8sClient.go
package client

import (
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"log"
)

func InitK8sClient() *kubernetes.Clientset {
	config, err := clientcmd.
		BuildConfigFromFlags("", "config")
	if err != nil {
		log.Fatal(err)
	}
	// config.Insecure 假如k8s是内网可以走https则不需要设置
	config.Insecure = true

	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		log.Fatal(err)
	}
	return clientset
}

在这里插入图片描述

  • main.go 添加 k8sClient (可运行测试一下,能返回对象即成功)
package main

import (
	"fmt"
	"gin_k8s_deploy/client"
)

func main() {
	k8sClient := client.InitK8sClient()
	fmt.Println(k8sClient)
}

使用gin作为web后端

  • main.go
package main

import (
	"fmt"
	"gin_k8s_deploy/client"
	"github.com/gin-gonic/gin"
)

func main() {
	k8sClient := client.InitK8sClient()
	fmt.Println(k8sClient)
	// gin实例
	r := gin.New()
	// 加载html模板
	r.LoadHTMLGlob("templates/*")
	// 后端返回页面
	r.GET("/", func(c *gin.Context) {
		c.HTML(200, "index.html", gin.H{"data": "success"})
	})
	// 运行
	r.Run(":8080")
}

  • templates/index.html (此处渲染gin的 “data”)
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
{{ .data }}
</body>
</html>
  • 运行main.go,并测试访问首页 http://localhost:8080
    在这里插入图片描述

编写gin请求k8s的接口

  • 以下是gin请求k8s namespace api的接口
    • main.go
// k8s 命名空间 接口
	r.GET("/ns", func(c *gin.Context) {
		// namespace 在 k8s 的核心(core)api组
		ns, err := k8sClient.
			CoreV1().Namespaces().
			List(context.Background(), metav1.ListOptions{})
		if err != nil {
			log.Fatal(err)
		}
		nsRet := make([]string, 0)
		for _, nsItem := range ns.Items {
			nsRet = append(nsRet, nsItem.Name)
		}
		c.JSON(200, gin.H{"ns_list": nsRet})
	})
	
  • 请求测试 (运行如报错请 go mod tidy )
    在这里插入图片描述
  • gin请求k8s deployment api的接口
	// k8s deployment 接口
	r.GET("/:ns/deployment/list", func(c *gin.Context) {
		ns := c.Param("ns")
		// deployment在k8s的 appsv1 api组
		deployment, err := k8sClient.
			AppsV1().Deployments(ns).
			List(context.Background(), metav1.ListOptions{})
		if err != nil {
			log.Fatal(err)
		}
		deploymentRet := make([]string, 0)
		for _, item := range deployment.Items {
			deploymentRet = append(deploymentRet, item.Name)
		}
		c.JSON(200, gin.H{"deployment_list": deploymentRet})
	})
  • 请求测试
    在这里插入图片描述

前端

  • 前端使用Promise与后端交互
  • index.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        // 调用后端 /ns 接口,返回ns的数组
        function getK8sNsList() {
            return fetch("/ns", {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                }
            }).then(response => {
                return response.json()
            }).then(data => {
                return data.ns_list
            })
        }
        // 使用dom将ns数组的值保存到select框中的option
        function displayK8sNsList(ns_list) {
            ns_list.forEach(ns => {
                var ele = document.getElementById("selectNs")
                var option = document.createElement("option")
                option.name = ns
                option.value = ns
                option.text = ns
                ele.add(option)
            })
        }
        // 获取后端 /ns 返回的第一个命名空间
        function getFirstK8sNsList() {
            return fetch("/ns", {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                }
            }).then(response => {
                return response.json()
            }).then(data => {
                return data.ns_list[0]
            })
        }
        // 调用后盾 /deployment/:ns/list 接口,返回deployment数组
        function getK8sDeployments(ns) {
            return fetch("/deployment/" + ns + "/list", {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                }
            }).then(response => {
                return response.json()
            }).then(data => {
                return data.deployment_list
            })
        }
        // 
        function displayK8sDeploymentList(deployment_list) {
            var ele = document.getElementById("deployment_list")
            deployment_list.forEach(deployment => {
                var li = document.createElement("li")
                li.textContent= deployment
                ele.appendChild(li)
            })
        }
        // select框选中其他值时进行请求
        function onNamespaceChange() {
            var selectedNs = document.getElementById("selectNs").value;
            var deploymentList = document.getElementById("deployment_list");
            while (deploymentList.firstChild) {
                deploymentList.removeChild(deploymentList.firstChild);
            }
            getK8sDeployments(selectedNs).then(deployment_list => {
                displayK8sDeploymentList(deployment_list)
            })
        }
    </script>
</head>
<body>
<div class="header">
    <h1>K8s面板</h1>
    <p style="display: inline-block">请选择命名空间: </p>
    <select name="selectNs" id="selectNs" onchange="onNamespaceChange()">
    </select>
</div>
<div class="content">
    <p>deployments</p>
    <ul id="deployment_list">
    </ul>
</div>
<script>
    // select框中填充ns数组
    getK8sNsList().then(ns_list => {
        displayK8sNsList(ns_list)
    })
    // 首先打印第一个命名空间的deployments
    getFirstK8sNsList().then(ns => {
        getK8sDeployments(ns).then(deployment_list => {
            displayK8sDeploymentList(deployment_list)
        })
    })
</script>
</body>
</html>

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

单点登录系统设计

一、介绍 token鉴权最佳的实践场景就是在单点登录系统上。 在企业发展初期&#xff0c;使用的后台管理系统还比较少&#xff0c;一个或者两个。 以电商系统为例&#xff0c;在起步阶段&#xff0c;可能只有一个商城下单系统和一个后端管理产品和库存的系统。 随着业务量越来…

腾讯云流量怎么计算的?轻量服务器流量价格表

腾讯云轻量应用服务器套餐带流量包&#xff0c;就是有月流量限制的意思&#xff0c;超出轻量套餐的流量需要另外支付流量费&#xff0c;轻量服务器地域不同超额流量费用也不同&#xff0c;北京上海广州等中国内地地域流量价格是0.8元每GB&#xff0c;中国香港地域流量价格是1元…

单片机IGBT驱动电路一例

概述&#xff1a; 驱动的作用有三个&#xff1a; 1.是作为放大器获得所需要的驱动电压。 2.是提高输出电流能力。 3.是进行功率回路和控制回路的隔离 信号从MCU到IGBT驱动芯片 首先驱动电流需要放大 MCU的输出电流是mA级别&#xff0c;而IGBT需要的驱动电流可能达到几安培…

解锁ETLCloud中Kettle的用法

随着大数据时代的到来&#xff0c;数据的处理和管理成为各行各业不可或缺的一环。ETL&#xff08;Extract-Transform-Load&#xff09;工具作为数据处理的重要环节&#xff0c;扮演着将数据从源端抽取出来、经过转换处理&#xff0c;最终加载至目标端的关键角色。在众多ETL工具…

香港科技大学(广州)智能制造学域可持续能源与环境学域博士招生宣讲会——重庆大学专场(暨全额奖学金政策)

两个学域代表教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01;可带简历现场咨询和面试&#xff01; &#x1f4b0;一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; 报名链接&#xff1a;https://www.wjx.top/vm/wmuN2ea.aspx# 地点&#xff1a;重庆大学A区…

docker一键部署GPU版ChatGLM3

一键运行 docker run --gpus all -itd --name chatglm3 -p 81:80 -p 6006:6006 -p 8888:8888 -p 7860:7860 -p 8501:8501 -p 8000:8000 --shm-size32gb registry.cn-hangzhou.aliyuncs.com/cwp-docker/chatglm3-gpu:1.0 进入容器 docker exec -it chatglm3 /bin/bash cd /…

MacOS Docker 部署 Redis 数据库

一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库&#xff0c;它提供了多种语言的API&#xff0c;并支持网络交互。Redis的数据存储在内存中&#xff0c;因此其读写速度非常快&#xff0c;每秒可以处理超过10万次读写操作&#xff0c;是已知…

Vue项目打包成exe文件(electron)

1.将写好的vue项目打包 1.1运行vue ui命令 输出目标文件 如果打开index.html是空白的&#xff0c;而且控制台报错获取xxx资源失败的问题&#xff0c;你需要在vue.config.js 上加一个命令&#xff0c;如果没有你需要创建一个。 2.下载electron官方示例 git clone https://gith…

Go 项目依赖注入wire工具最佳实践介绍与使用

文章目录 一、引入二、控制反转与依赖注入三、为什么需要依赖注入工具3.1 示例3.2 依赖注入写法与非依赖注入写法 四、wire 工具介绍与安装4.1 wire 基本介绍4.2 安装 五、Wire 的基本使用5.1 前置代码准备5.2 使用 Wire 工具生成代码 六、Wire 核心技术5.1 抽象语法树分析5.2 …

idea开发 java web 疫情信息查询系统bootstrap框架web结构java编程计算机网页接口查询

一、源码特点 java 疫情信息查询系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css j…

复习知识点整理

零碎语法 1.导入某个文件夹的index文件&#xff0c;index可以省略&#xff08;这里导入的是router和store文件下的index.js文件&#xff09; 2.路由懒加载 this 1.在vue文件中使用router\store对象时 this&#xff1a;普通函数的this指向vue实例对象(在没有明确指向的时候…

ubuntu系统设置java环境变量 jdk离线安装

目录 目的一、下载jdk二、安装三、配置jdk环境变量1、编辑文件~/.bashrc2、刷新系统环境变量3、验证 目的 在ubuntu环境下配置java环境变量&#xff0c;除jdk压缩包下载外&#xff0c;其余安装及配置过程无需联网&#xff0c;可离线完成。 一、下载jdk 一些比较靠谱的免登录…

Davinci报警40359

问题现象 前几天做实验的时候遇到个问题被卡着&#xff0c;报警40359。 问题描述 报警信息里面描述&#xff0c;我的一个IDT里面的基础类型有问题。 问题分析 根据提示排查 首先检查了出问题的IDT里面的基础类型&#xff0c;引用的是基础类型里面的布尔类型&#xff0c;非…

【Java】maven的下载和安装配置

Maven下载&#xff1a; 下载地址&#xff1a;http://maven.apache.org/download.cgi Maven 3.3 require JDK 1.7 or above &#xff1a; 因为Maven是一个纯粹的java实现的工具 下载完成后&#xff0c;得到一个压缩包&#xff0c;解压&#xff0c;可以看到maven的组成目录 Mav…

深入浅出 -- 系统架构之垂直架构

当业务复杂度增加、访问量逐渐增大出现高并发时&#xff0c;单体架构无法满足需求&#xff0c;可以根据业务功能对系统进行拆分&#xff0c;以提高访问效率。 垂直架构介绍 1.垂直架构一般是因为单体架构太过于庞大而进行的拆分&#xff0c;拆分后各个系统应满足独立运行互相不…

海外媒体宣发套餐推广8个要点解析为标题-华媒舍

在当前全球化的时代背景下&#xff0c;海外市场的开拓对于企业的发展至关重要。而海外媒体宣传是一种有效的推广方式&#xff0c;可以帮助企业在全球范围内打开市场。本文将对8个海外媒体宣发套餐的推广要点进行解析&#xff0c;帮助企业了解如何在海外市场进行宣传推广。 1. 媒…

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议&#xff0c;即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的&#xff0c;旨在解决传统HTTP协议在实…

C++ 之 【类与对象】从入门到精通一条龙服务 入门篇

不要觉的自己很没用&#xff0c;其实你还可以给家人带来温暖&#xff0c;比如爸妈看到你就来火 目录&#xff1a; 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 1.访问限定符 2.封装 五、类的作用域 六、类的实例化 七、类的…

违法解除劳动合同——典型案例

目录 什么是违法解除劳动合同&#xff1f; 用人单位负举证责任 典型案例 案例&#xff1a;指导案例180号——违法解除劳动合同 案例&#xff1a;浙江省杭州市中级⼈⺠法院——违纪案例 案例&#xff1a;浙江省杭州市中级⼈⺠法院——违纪案例(不服从工作安排) 案例&#…