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

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>

效果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows程序设计课程作业-1

文章目录 1. 作业内容2. 设计思路分析与难点3. 代码实现3.1 接口定义3.2 工厂类实现3.3 委托和事件3.4 主函数3.5 代码运行结果 4. 代码地址5. 总结&改进思路6. 阅读参考 1. 作业内容 使用 C# 编码&#xff08;涉及类、接口、委托等关键知识点&#xff09;&#xff0c;实现…

nssm 工具把asp.net core mvc变成 windows服务,使用nginx反向代理访问

nssm工具的作用&#xff1a;把项目部署成Windows服务&#xff0c;可以在系统后台运行 1.创建一个asp.net core mvc的项目weblication1 asp.net core mvc项目要成为windows服务需要安装下面的nuget包 <ItemGroup><PackageReference Include"Microsoft.Extension…

Python卷积网络车牌识别系统(V2.0)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【随笔】Git 高级篇 -- 相对引用1(十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

工业组态 物联网组态 组态编辑器 web组态 组态插件 编辑器

体验地址&#xff1a;by组态[web组态插件] BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架的限制。同时由于BY组态只是一个插件&#xff0c;不能独…

【机器学习】《机器学习算法竞赛实战》第7章用户画像

文章目录 第7章 用户画像7.1 什么是用户画像7.2 标签系统7.2.1 标签分类方式7.2.2 多渠道获取标签7.2.3 标签体系框架 7.3 用户画像数据特征7.3.1 常见的数据形式7.3.2 文本挖掘算法7.3.3 神奇的嵌入表示7.3.4 相似度计算方法 7.4 用户画像的应用7.4.1 用户分析7.4.2 精准营销7…

B/S架构SaaS模式 医院云HIS系统源码,自主研发,支持电子病历4级

B/S架构SaaS模式 医院云HIS系统源码&#xff0c;自主研发&#xff0c;支持电子病历4级 系统概述&#xff1a; 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查…

基于Java微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Java学习之面向对象三大特征

目录 继承 作用 实现 示例 instanceof 运算符 示例 要点 方法的重写(Override) 三个要点 示例 final关键字 作用 继承和组合 重载和重写的区别 Object类详解 基本特性 补充&#xff1a;IDEA部分快捷键 " "和equals()方法 示例 Super关键字 示例 …

Golang实现一个聊天工具

简介 聊天工具作为实时通讯的必要工具&#xff0c;在现代互联网世界中扮演着重要的角色。本博客将指导如何使用 Golang 构建一个简单但功能完善的聊天工具&#xff0c;利用 WebSocket 技术实现即时通讯的功能。 项目源码 点击下载 为什么选择 Golang Golang 是一种高效、简…

wordpress外贸独立站模板

wordpress外贸独立站模板 WordPress Direct Trade 外贸网站模板&#xff0c;适合做跨境电商的外贸公司官方网站使用。 https://www.waimaoyes.com/wangzhan/22.html

Android操作sqlite数据库

Sqlite数一种轻量级的关系型数据库&#xff0c;android里面可以用来持久化存储一些用户数据。 一、SQLiteOpenHelper方式 SQLiteOpenHelper是原生的数据库帮助类&#xff0c;继承这个类&#xff0c;用来创建&#xff0c;更新数据库的操作 public class MySqliteOpenHelper e…

备战蓝桥杯--数论与搜索刷题2

话不多说&#xff0c;直接看题&#xff1a; 1.辗转相减法 我们不妨假设原等比数列a,a*(q/p),a*(q/p)^2.... 那么x1,,,,xn就是其中的n项&#xff0c;xi/x1(q/p)^b&#xff0c;假设最大比例为(q/p)^k&#xff0c;&#xff0c;那么一定有(q/p)^(k*s)(q/p)^b&#xff0c;即k是b的…

基于Socket简单的UDP网络程序 vs 简单的TCP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁&#xff0c;它让计算机之间能够交流信息&#xff0c;为我们的生活和工作带来便利…

GitHub git push超过100MB大文件失败(write error: Broken pipe)完美解决

问题 在使用git push推送大文件&#xff08;超过了100MB&#xff09;到GitHub远程仓库时提示异常&#xff0c;异常信息如下&#xff1a; fatal: sha1 file <stdout> write error: Broken pipe fatal: the remote end hung up unexpectedly 通过查阅了一些资料&#xff0c…

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version&#xff1a;2023-05-15&#xff0c;就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home&#xff0c;点击更多服务&#xff1a; 我们点击Azure OpenAI&#…

Mysql密码修改问题

docker安装mysql&#xff0c;直接拉取镜像&#xff0c;挂载关键目录即可启动&#xff0c;默认3306端口。此时无法直接连接&#xff0c;需要配置密码。docker进入mysql容器中 docker exec -it mysql bash #mysq是容器名称&#xff0c;也可以用容器id通过修改mysql的配置进行免密…

腾讯云服务器4核8g配置怎么样?能用来干什么?

腾讯云4核8G服务器多少钱&#xff1f;腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月&#xff0c;活动页面 txybk.com/go/txy 活动链接打开如下图所示&#xff1a; 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器&#xff0c;详细配置为&#xff1a;轻量4核…

Prometheus+grafana环境搭建rabbitmq(docker+二进制两种方式安装)(二)

搭建完Prometheusgrafana基础环境后参见&#xff1a;Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客&#xff0c;对我本地的一些常用法人服务进行一个监控。基本都可以根据官方文档完成搭建&#xff0c;因为docker和二进制方式安装各有优缺点。 d…

5:数据结构--5.1:线性结构,5.2:数组与矩阵

转上一节&#xff1a; http://t.csdnimg.cn/M9Zdphttp://t.csdnimg.cn/M9Zdp 课程内容提要&#xff1a; 5&#xff1a;知识点考点详解 5.1&#xff1a;线性结构 考点1:线性表 1&#xff1a;线性表 顺序表&#xff1a;数据在内存中紧邻。 (1)顺序存储方式&#xff1a;数…