client-go gin的简单整合一(list列表相关操作)

简介: 完成了client-go连接kubernetes集群-delete相关操作,稍微看过一些B站go圈里最会写js的奇淼 的go 与gin的视频,还有沈叔的一些课程:https://www.jtthink.com/。一般都是习惯先动手的,自己动手操作,有问题就看沈叔的视频与解决思路!

背景:

完成了client-go连接kubernetes集群-delete相关操作,稍微看过一些B站go圈里最会写js的奇淼 的go 与gin的视频,还有沈叔的一些课程:https://www.jtthink.com/。一般都是习惯先动手的,自己动手操作,有问题就看沈叔的视频与解决思路!

1. client-go gin的简单整合一

注:以下操作环境可能有些许区别(在家写东西用的windows,公司的办公环境个人安装了一台rocky linux)。一下所有路径为相对路径在k8s-demo1项目目录下!

1. go get 安装gin依赖

PS C:\Users\zhangpeng\GolandProjects\k8s-demo1> go get github.com/gin-gonic/gin

go get: added github.com/gin-contrib/sse v0.1.0

go get: added github.com/gin-gonic/gin v1.7.7

go get: added github.com/go-playground/locales v0.13.0

go get: added github.com/go-playground/universal-translator v0.17.0

go get: added github.com/go-playground/validator/v10 v10.4.1

go get: added github.com/leodido/go-urn v1.2.0

go get: added github.com/mattn/go-isatty v0.0.12

go get: added github.com/ugorji/go/codec v1.1.7


注:linux环境操作省略......如报错缺少其他依赖go get自行按照提示获取安装!

2. 将连接客户端单独封装成一个方法文件

将前面测试环境写的单独的文件拆分。把客户端单独封装成一个单独文件:

src/lib/K8sClient.go

package lib


import (

"flag"

"k8s.io/client-go/kubernetes"

"k8s.io/client-go/tools/clientcmd"

"k8s.io/client-go/util/homedir"

"path/filepath"

)


var K8sClient *kubernetes.Clientset


func init() {

var kubeconfig *string

if home := homedir.HomeDir(); home != "" {

kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")

} else {

kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")

}

flag.Parse()

config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

if err != nil {

panic(err.Error())

}


// create the clientset

c, err := kubernetes.NewForConfig(config)

if err != nil {

panic(err.Error())

}

K8sClient = c

}

3. 创建service目录创建namespace deployment service对应service文件

以namespace deployment service为例:

src/service/Namespace.go

package service


import (

"context"

"github.com/gin-gonic/gin"

. "k8s-demo1/src/lib"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


func ListNamespace(g *gin.Context) {

ns, err := K8sClient.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})

if err != nil {

g.Error(err)

return

}

g.JSON(200, ns)

}

src/service/Deployment.go

package service


import (

"context"

"github.com/gin-gonic/gin"

. "k8s-demo1/src/lib"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


func ListDeployment(g *gin.Context) {

ns := g.Query("ns")


dps, err := K8sClient.AppsV1().Deployments(ns).List(context.Background(), metav1.ListOptions{})

if err != nil {

g.Error(err)

}

g.JSON(200, dps)

return

}

src/service/Service.go

package service


import (

"context"

"github.com/gin-gonic/gin"

. "k8s-demo1/src/lib"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


func ListService(g *gin.Context) {

ns := g.Query("ns")

svc, err := K8sClient.CoreV1().Services(ns).List(context.Background(), metav1.ListOptions{})

if err != nil {

g.Error(err)

return

}

g.JSON(200, svc)

}


注:正常的应该是lib.K8sClient引用,import设置为了 . "k8s-demo1/src/lib"!

4.编辑main.go 设置路由

main.go

package main


import (

"github.com/gin-gonic/gin"

"k8s-demo1/src/service"

)


func main() {

r := gin.Default()

r.GET("/", func(context *gin.Context) {

context.JSON(200, "hello")

})

r.GET("/namespaces", service.ListNamespace)

r.GET("/deployments", service.ListDeployment)

r.GET("/service", service.ListService)

r.Run()

}


5. 运行main.go,浏览器访问是否正常返回

可以命令行控制台go run main.go 也可以goland直接run main.go

注:此集群非前面的ack集群,为本地内网一个测试集群!故namespace等相关信息输出并不与前面部分对应

1. namespace:

http://127.0.0.1:8080/namespaces

2. deployment

http://127.0.0.1:8080/deployments

http://127.0.0.1:8080/deployments?ns=default 指定命名空间

3. service

http://127.0.0.1:8080/service

http://127.0.0.1:8080/service?ns=default 指定命名空间

基本实现了个人的目的。但是输出的内容太多了,很多东西不需要,想要进一步优化输出自己先要的信息!

2. 更进一步的-定制化输出需要的内容

1.关于namespace

namespace我只想输出空间name! 创建一个struct,并make创建一个切片:

src/service/Namespace.go

package service


import (

"context"

"github.com/gin-gonic/gin"

. "k8s-demo1/src/lib"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


type Namespace struct {

Name string

}


func ListNamespace(g *gin.Context) {

ns, err := K8sClient.CoreV1().Namespaces().List(context.Background(), metav1.ListOptions{})

if err != nil {

g.Error(err)

return

}

ret := make([]*Namespace, 0)

for _, item := range ns.Items {

ret = append(ret, &Namespace{

  Name: item.Name,

})


}

g.JSON(200, ret)

return

}


浏览器访问http://127.0.0.1:8080/namespaces,如下:

2. 关于deployment

参照namespace设置src/service/Deployment.go

package service


import (

"context"

"github.com/gin-gonic/gin"

. "k8s-demo1/src/lib"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


type Deployment struct {

Name string

}


func ListDeployment(g *gin.Context) {

ns := g.Query("ns")


dps, err := K8sClient.AppsV1().Deployments(ns).List(context.Background(), metav1.ListOptions{})

if err != nil {

g.Error(err)

}

ret := make([]*Deployment, 0)

for _, item := range dps.Items {

ret = append(ret, &Deployment{

  Name: item.Name,

})


}

g.JSON(200, ret)

return

}


运行main.go 访问http://127.0.0.1:8080/deploymentshttp://127.0.0.1:8080/deployments?ns=default

3. 关于service

src/service/Service.go如下

package service


import (

"context"

"github.com/gin-gonic/gin"

. "k8s-demo1/src/lib"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

)


type Service struct {

Name string

}


func ListService(g *gin.Context) {

ns := g.Query("ns")

svc, err := K8sClient.CoreV1().Services(ns).List(context.Background(), metav1.ListOptions{})

if err != nil {

g.Error(err)

return

}

ret := make([]*Service, 0)

for _, item := range svc.Items {

ret = append(ret, &Service{

  Name: item.Name,

})


}

g.JSON(200, ret)

return

}

运行main.go 访问http://127.0.0.1:8080/servicehttp://127.0.0.1:8080/service?ns=default

反思:

1.切片的使用,指针的使用......

2.定制化输出更多的相关配置?比如deployments中镜像,副本数。namespace中label?创建时间?

3.gin.Context该让我怎么去理解......

运行main.go 访问[http://127.0.0.1:8080/service](http://127.0.0.1:8080/service) [http://127.0.0.1:8080/service?ns=default](http://127.0.0.1:8080/service?ns=default)

![image.png](https://cdn.nlark.com/yuque/0/2022/png/2505271/1651740170966-44f978db-8818-4a96-85d4-4df22ea81f6d.png#clientId=ub84964fb-43e5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=468&id=u9431c166&margin=%5Bobject%20Object%5D&name=image.png&originHeight=468&originWidth=684&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32924&status=done&style=none&taskId=u1c969fc8-1947-4f4f-b8cd-330c1431500&title=&width=684)

![image.png](https://cdn.nlark.com/yuque/0/2022/png/2505271/1651740213862-0dd8925d-c651-4ff7-83bf-550bc0fd0247.png#clientId=ub84964fb-43e5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=421&id=u692871a2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=421&originWidth=408&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23056&status=done&style=none&taskId=u5a4e3eee-4080-4cf3-b8a4-27720568889&title=&width=408)

# 反思:

1.切片的使用,指针的使用......

2.定制化输出更多的相关配置?比如deployments中镜像,副本数。namespace中label?创建时间?

3.gin.Context该让我怎么去理解......

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
26天前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
162 86
|
3月前
|
人工智能 负载均衡 监控
使用 Go 和 Gin 实现高可用负载均衡代理服务器
本文基于Go语言和Gin框架,实现了一个企业级负载均衡代理服务器,支持动态路由、健康检查、会话保持等功能。具备高可用性与高性能,单节点支持100k+ QPS,延迟达亚毫秒级,并提供完整的压力测试方案与优化建议。
103 7
|
4月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
7月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList<>()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
367 1
Java 中数组Array和列表List的转换
|
8月前
|
SQL JSON 关系型数据库
开箱即用的GO后台管理系统 Kratos Admin - 列表查询规则
Kratos Admin 是一个开箱即用的GO后台管理系统,支持通用列表查询请求。通过 `page`、`pageSize`、`query`(AND过滤)、`or`(OR过滤)、`orderBy`(排序)、`noPaging`(不分页)和 `fieldMask`(字段掩码)等参数,灵活配置查询条件。过滤规则遵循Python ORM风格,支持多种查找类型如 `in`、`gte`、`icontains` 等,适用于不同数据库。
120 1
|
10月前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
166 9
|
10月前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
234 14
|
10月前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
616 10
|
12月前
|
测试技术 开发者 Python
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
在 Python 中,创建列表有两种方法:使用方括号 `[]` 和调用 `list()` 函数。虽然两者都能创建空列表,但 `[]` 更简洁、高效。性能测试显示,`[]` 的创建速度比 `list()` 快约一倍。此外,`list()` 可以接受一个可迭代对象作为参数并将其转换为列表,而 `[]` 则需要逐一列举元素。综上,`[]` 适合创建空列表,`list()` 适合转换可迭代对象。
134 1
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
|
11月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
1050 1