【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 clientimport ("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 = trueclientset, err := kubernetes.NewForConfig(config)if err != nil {log.Fatal(err)}return clientset
}

在这里插入图片描述

  • main.go 添加 k8sClient (可运行测试一下,能返回对象即成功)
package mainimport ("fmt""gin_k8s_deploy/client"
)func main() {k8sClient := client.InitK8sClient()fmt.Println(k8sClient)
}

使用gin作为web后端

  • main.go
package mainimport ("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框中的optionfunction displayK8sNsList(ns_list) {ns_list.forEach(ns => {var ele = document.getElementById("selectNs")var option = document.createElement("option")option.name = nsoption.value = nsoption.text = nsele.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= deploymentele.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)})// 首先打印第一个命名空间的deploymentsgetFirstK8sNsList().then(ns => {getK8sDeployments(ns).then(deployment_list => {displayK8sDeploymentList(deployment_list)})})
</script>
</body>
</html>

效果

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

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

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

相关文章

Idea调试热更新那些事

用惯了Eclipse,对于eclipse的调试过程中HotSwap生效感觉很爽&#xff0c;更换为IDEA后&#xff0c;总觉得别扭得很&#xff0c;非要手动触发“Recompile *.java"这个才能生效。最开始老是感觉我哪里理解不到位&#xff0c;或者我的环境配置哪里有问题&#xff0c;反正就是…

根据生辰八字四柱命理测算童子命童子煞算法

#小李子9479# #不讲废话# 真童子命算法口诀: 1。春秋寅子贵 //命造生在春季或秋季的(以月令算),日支或时支见寅或子的2。冬夏卯未辰 //命造生在冬季或夏季的(以月令算),日支或时支见卯、未或辰的3。金木马卯和 //年柱纳音为金或木的,日支或时支见午或卯的4。水火遇鸡…

多域名单点登录信息未同步问题

一个网站有多个域名&#xff0c;其中四个域名指向的是同一个页面&#xff0c;另外还有一个地址指向前面页面里面的某个功能。 https://www.xxx.cn/ https://xxx.cn/ https://www.xxx.com.cn/ https://xxx.com.cn/ xxx.com.cn网站下某个功能跳转到https://ab.xxx.com.cn/在ab.x…

QT6 Android设置程序图标及名称

一.APP应用图标设置 1.在工程目录中,创建一个Android_sources文件夹,在build-XXX

Centos7 安装GitLab

安装环境: 虚拟机:Centos7 最小安装 4核8G 下载GitLab 本次实验下载的是 gitlab-ce-14.1.0-ce.0.el7.x86_64.rpm 官网截图 清华源截图 安装包下载地址(官网;下载CE版本,EE是收费版本):https://packages.gitlab.com/gitlab/gitlab-ce国内镜像源下载地址(清华源):htt…

Linux函数学习 fork

1、Linux fork 函数 pid_t fork(void); pid_t &#xff1a; 对于子进程&#xff0c;返回0 pid_t &#xff1a; 对于父进程进程&#xff0c;返回子进程进程号 int pipe(int pipefd[2]); pipefd[0] 为读取管道 pipefd[1] 为写入管道 返回值&#xff1a;-1失败 0 成功 2、函…

Leetcode面试经典150_Q26删除有序数组中的重复项

题目&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量…

MongoDB聚合运算符:$map

文章目录 语法举例对数组元素取整将摄氏度转为华氏度 $map聚合运算符将指定的表达式应用于数组元素&#xff0c;对数组每个元素进行计算并返回计算后的数组。 语法 { $map: { input: <expression>, as: <string>, in: <expression> } }参数说明&#xff1a…

springboot实现上传文件接口(简单版)

使用springboot实现一个最简单版本的上传文件接口 private String uploadPath "C:/imageFiles";RequestMapping(value "/upload", method RequestMethod.POST)private Result upload( RequestParam("modelName") String modelName,RequestPar…

HTML5+CSS3+JS小实例:圣诞按钮

实例:圣诞按钮 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

【4月最新】低至50/年,4G 618/3年 云服务器价格即将回调 ,搭建网站 博客 Linux练习 比虚拟机方便 附阿里云 京东云 腾讯云对比表

更新日期&#xff1a;4月8日&#xff08;半年档 价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更…

CorelDRAW2024全网最详细独家讲解新版本新功能

各位粉丝大家好&#xff0c;为了让大家更深入的了解CorelDRAW2024新版的各项新功能&#xff0c;我们独家邀请到了Corel中国专家名师张苏老师&#xff0c;策划并录制30分钟全中文讲解栏目&#xff01;干货满满&#xff0c;全程演示&#xff0c;一览CorelDRAW2024新版的各项新功能…

Vue中使用require.context()自动引入组件和自动生成路由的方法介绍

目录 一、自动引入组件 1、语法 2、使用 2.1、在compoents文件下随便创建index.js文件 2.2、mian.js引入该js 二、自动生成路由 1、示例&#xff1a; 2、使用 2.1、在router文件下随便创建autoRouter.js文件 2.2、在router文件下index.js文件中引入autoRouter.js文件…

rabbitmq的介绍和交换机类型

rabbitmq的介绍和交换机类型 1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系…

数仓调优实战:GUC参数调优

1. 前言 适用版本&#xff1a;【8.1.1及以上】 GaussDB(DWS)性能调优系列专题文章&#xff0c;介绍了数据库性能调优的思路和总体策略。在系统级调优中数据库全局的GUC参数对整体性能的提升至关重要&#xff0c;而在语句级调优中GUC参数可以调整估算模型&#xff0c;选择查询…

Nacos漏洞知多少?

1.什么是Nacos 1.1 官方解答 Nacos是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助…

深度学习学习日记4.8(下午)

1.softmax 函数的得出的结果是样本被预测到每个类别的概率&#xff0c;所有类别的概率相加总和等于1。使用 softmax 进行数据归一化&#xff0c;将数字转换成概率。 2.熵&#xff0c;不确定性&#xff0c;越低越好 3.KL 散度交叉熵-信息熵 预测越准&#xff0c;交叉熵越小&am…

高维解码|Redis 收紧许可证!开源软件公司如何在云时代生存?

最近&#xff0c;Redis 从开放源代码的 BSD 许可证过渡到了更加限制性的 Server Side Public License (SSPLv1)。一石激起千层浪&#xff0c;Redis 的这一举动&#xff0c;不仅分化了前 Redis 维护者&#xff0c;也再次引发业界对于“开源项目可持续性以及许可证决策对其社区的…

Python MNIST 转图片

Python MNIST 转图片 1 获取数据2 显示图片3 转换图片4 全部代码 1 获取数据 import numpy as np import tensorflow as tf from tensorflow.keras import datasets # type: ignoredef save(mnist_path):# 输出TensorFlow版本print("TensorFlow: {0}".format(tf.__v…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…