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

网友投稿 313 2022-09-11

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

背景:

完成了client-go连接kubernetes集群-delete相关操作,稍微看过一些B站go圈里最会写js的奇淼 的go 与gin的视频,还有沈叔的一些课程: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

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,浏览器访问是否正常返回

1. namespace:

2. deployment

3. service

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 }

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 }

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 }

反思:

1.切片的使用,指针的使用......2.定制化输出更多的相关配置?比如deployments中镜像,副本数。namespace中label?创建时间?3.gin.Context该让我怎么去理解......

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:科技狐:微博 CEO ,深夜亲自下场扫黄!
下一篇:client-go连接kubernetes集群-delete相关操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~