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

这篇具有很好参考价值的文章主要介绍了【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)到项目
    • 注:假如是公网的环境,需特别处理。假如是内网(虚拟机等)可以直连的情况则无需处理
      【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s
  • 以下是公网k8s的kubeconfig的处理,将里面的内网ip换成公网ip(因为你无法通过内网ip直连),并且ca认证这行删除
    【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s

后端

  • 初始化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
}

【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s

  • 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
    【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s

编写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 )
    【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s
  • 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})
	})
  • 请求测试
    【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s

前端

  • 前端使用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>

效果

【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s
【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s
【go】模板展示不同k8s命名空间的deployment,golang,kubernetes,开发语言,k8s文章来源地址https://www.toymoban.com/news/detail-851889.html

到了这里,关于【go】模板展示不同k8s命名空间的deployment的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • K8s进阶之路-命名空间级-服务发现 :

    K8s进阶之路-命名空间级-服务发现 :

    服务发现: Service(东西流量):集群内网络通信、负载均衡(四层负载)内部跨节点,节点与节点之间的通信,以及pod与pod之间的通信,用Service暴露端口即可实现 Ingress(南北流量):将内部服务暴露外网访问的服务ingress-nginx,也就是nginx反向代理负载均衡服务(七层http负

    2024年02月20日
    浏览(14)
  • k8s学习笔记(四):命名空间(namespace)详解

    k8s学习笔记(四):命名空间(namespace)详解

    Kubernetes中的Namespace是一种用于在 集群内部组织和隔离资源 的机制。一个Namespace可以看作是一个 虚拟的集群 ,它将物理集群划分为多个逻辑部分,每个部分都有自己的一组资源(如Pod、Service、ConfigMap等)。 Namespace 适合用于 隔离不同用户创建的资源 用于给集群中的 任何对

    2024年02月12日
    浏览(12)
  • Kubernetes/k8s之HPA,命名空间资源限制

    Kubernetes/k8s之HPA,命名空间资源限制

    Horizontal Pod Autoscaling:po的水平自动伸缩 这是k8s自带的模块 pod占用cpu比例达到一定的阀值,会触发伸缩机制。 根据cpu的阀值触发伸缩机制 replication controller 副本控制器 控制pod的副本数 deployment controller 节点控制器 部署pod hpa控制副本的数量,以及如何控制部署pod 1、hpa基于kub

    2024年01月24日
    浏览(16)
  • k8s查看当前命名空间下所有运行的 pod 对应的镜像

    1,查看镜像 2,去重查看 3, 同时显示pod名称和镜像 4,查看所有deployment和其中的镜像

    2024年02月02日
    浏览(14)
  • 【云原生技术】K8S中集群、工作空间、可用区、部署单元、命名空间、部署组、VPC概念和示例

    Kubernetes(K8S)中的集群是由一组物理或虚拟机器组成的计算资源池,用于运行和管理容器化应用程序。集群提供了资源管理、高可用性、扩展性和自动化的环境,以便部署、管理和运行容器化应用程序。下面是关于Kubernetes集群的详细介绍以及一个示例: Kubernetes集群的组成:

    2024年01月23日
    浏览(11)
  • k8s创建deployment

    k8s创建deployment

    在自定义ns中,使用create命令的方式创建一个3副本的deploy,镜像httpd:latest,端口自定义 2、查看deploy、rs、pod 3、两种方法,扩充副本数量为5 4、变更镜像版本 5、使用yaml文件生成deploy,要求同1 6、升级业务应用,通过变更镜像的方式 7、查看滚动升级的状态 8、查看升级历史

    2024年02月12日
    浏览(10)
  • K8S deployment挂载

    K8S deployment挂载

     Deployment部署文件 nginx容器页面目录挂载到emptyDir emptyDir目录是pod所在的node节点主机的目录,此目录下的data即对应容器里的/usr/share/nginx/html,实现目录挂载;图1红框里的号对应docker 的name中的编号,如下俩个图

    2024年02月12日
    浏览(12)
  • k8s概念-deployment

    deployment用于部署无状态应用 Deployment集成了上线部署、滚动升级、创建副本、回滚等功能 Deployment里包含并使用了ReplicaSet Replicaset 通过改变Pod副本数量实现Pod的扩容和缩容 参考文档  https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ 1 yaml文件 2 pod版本升级 查看帮助

    2024年02月14日
    浏览(27)
  • k8s中的deployment

    k8s中的deployment

            Deployment是k8s中用来管理发布的控制器,在开发的过程中使用非常频繁,本篇文章主要介绍deployment相关的使用和原理。 声明式API 最终一致性 水平触发 资源对象 。。。 定义一组pod的期望数量,controller会维持Pod的数量和期望的一致(其实deployment是通过管理rs的状态来

    2024年02月16日
    浏览(8)
  • k8s学习-Deployment

    Kubernetes通过各种Controller来管理Pod的生命周期 。 为了满足不同业 务 景 , Kubernetes 开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。我们⾸先学习最常用Deployment。 第一种是通过kubectl命令直接创建: 在最新的 Kubernetes 版本中,kubectl create deployment 命令不再直接

    2024年01月19日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包