【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,一经查实,立即删除!

相关文章

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、函…

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新版的各项新功能…

rabbitmq的介绍和交换机类型

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

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

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

如何搭建企业级MQ消息集成平台

企业级MQ消息集成平台的重要性在于实现不同系统之间的高效、可靠、实时的消息传递和数据交换。它可以帮助企业实现系统解耦&#xff0c;提高系统的可扩展性和灵活性&#xff0c;降低系统间的依赖性。通过消息队列中间件&#xff0c;企业可以实现异步通信、削峰填谷、流量控制等…

服务网关-微服务小白入门(3)

基本概念 Spring Cloud Gateway Spring Cloud Gateway是基于Spring生态系统之上构建的API网关&#xff0c;包括&#xff1a;Spring 5.x&#xff0c;Spring Boot 2.x和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API&#xff0c;并为它们提供…

云手机提供私域流量变现方案

当今数字营销领域&#xff0c;私域流量是一座巨大的金矿&#xff0c;然而并非人人能够轻易挖掘。一家营销公司面临着利用社交、社区、自媒体等应用积累私域流量&#xff0c;并通过销售产品、推送广告等方式实现流量变现的挑战与困境。本文将详细介绍这家公司是如何通过云手机&a…

一文了解重塑代币发行方式的创新平台 — ZAP

代币的发行方式对加密市场有着重要的影响&#xff0c;它直接影响着项目的社区建设、流动性、价格稳定性以及投资者的参与度&#xff0c;未来预期等&#xff01;合适的发行方式可以吸引更多的投资者和用户参与&#xff0c;提升项目的社区建设和价值实现。不当的发行方式和分配&a…

经典算法-分治法由散点得出凸包-python实现

import copy import random import matplotlib import mathdef distance_p2l(point, line_point1, line_point2):if (line_point2[0] - line_point1[0]) 0:return abs(point[0] - line_point2[0])# 计算直线的斜率m (line_point2[1] - line_point1[1]) / (line_point2[0] - l…

MySQL的内连接和外连接

内连接 在之前的MySQL的复合查询时&#xff0c;我们能够通过给两个表做笛卡尔积查询和where子句限定条件来查询想查询的数据&#xff0c;不过MySQL还提供了内连接用来给两个表做笛卡尔积&#xff0c;对比之前的复合查询笛卡尔积来说语法更加简洁。 语法&#xff1a;select 字段…

实验:基于Red Hat Enterprise Linux系统建立逻辑卷并进行划分

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 1. 为虚拟机添加三块大小为5GB的磁盘nvme0n2 nvme0n3 nvme0n4 2. 将三块硬盘转换为物理卷&#xff0c;并将nvme0n2 nvme0n3两pv建立成名为"自己名字_vg“的卷组&#xff0c;并将nvme0n4扩展进该卷组。 LVM管…

MySQL数据库的增删改查(进阶)

1.新增 将一个表中的内容插入到另一个表中. 这里需要确保查询集合的列数,类型,顺序要和插入表的列数,类型,顺序一致,这里列的名称可以不一样. values 替换成了select 查询的临时表. 2. 查询 2.1 聚合查询 2.1.1 聚合查询 函数 说明COUNT([DISTINCT] expr)返回…