client-go gin的简单整合二list列表相关进一步操作

背景

上一步完成了client-go gin的简单整合一(list列表相关操作),实现了简单的namespace deployment service的name的输出!现在我想输出更多的内容,也当时深入一下kubernetes这些基础!

1. client-go gin的简单整合二(list列表相关进一步操作)

1. 从namespace开始

[root@zhangpeng ~]# kubectl get ns -o wide

image.png

首先我想输出namespace的STATUS状态和AGE!

以develop为例看一下还有什么想输出的信息

[root@zhangpeng ~]# kubectl get ns develop -o yaml

image.png

creationTimestamp labels status状态在这里也是可以体现的!

动手吧

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"
	"time"
)

type Time struct {
	time.Time `protobuf:"-"`
}
type Namespace struct {
	Name       string
	CreateTime Time `json:"CreateTime"`
	Status     string
	Labels     map[string]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,
			CreateTime: Time(item.CreationTimestamp),
			Status:     string(item.Status.Phase),
			Labels:     item.Labels,
		})

	}
	g.JSON(200, ret)
	return
}

注:毕竟新手不太会处理数据,就做了如下处理,先能展现出自己先要的数据。后面再作深入的学习!

image.png

image.png

同理status

image.png

但是我这里偷懒了......直接搞了一个string。短期来看应该没有什么问题吧?

image.png

同理labels mapstringstring

image.png

image.png

运行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()
}

image.png

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

image.png

基本完成,AGE还没有想好怎么展现,是不是要算时间戳减去CreateTime?后面再去研究吧......

2.继续deployment的进一步深入

[root@zhangpeng ~]# kubectl get deployment -o wide

image.png

恩 起码的是要把这些基本输出的:READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR!

详细看一眼nginx deployment 看一眼还有什么要输出的:

[root@zhangpeng ~]# kubectl get deployment nginx -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-05-01T13:47:52Z"
  generation: 1
  labels:
    app: nginx
    env: dev
  name: nginx
  namespace: default
  resourceVersion: "16449910"
  uid: ec1423a5-1268-40ea-bbf5-15576a332755
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
      env: dev
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
        env: dev
      name: nginx
    spec:
      containers:
      - image: nginx:1.16.1
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2022-05-01T13:48:10Z"
    lastUpdateTime: "2022-05-01T13:48:10Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2022-05-01T13:47:52Z"
    lastUpdateTime: "2022-05-01T13:48:10Z"
    message: ReplicaSet "nginx-7b5d9df6b8" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

这还没有想好需要什么,就先按照kubectl get deployment -o wide的输出整一下了

image.png

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
	Replicas            int32
	AvailableReplicas   int32
	UnavailableReplicas int32
	Images              string
	Labels              map[string]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,
			Replicas:            item.Status.Replicas,
			AvailableReplicas:   item.Status.AvailableReplicas,
			UnavailableReplicas: item.Status.UnavailableReplicas,
			Images:              item.Spec.Template.Spec.Containers[0].Image,
			Labels:              item.Labels,
		})

	}
	g.JSON(200, ret)
	return
}

image.png

Images也没有考虑其他的,多个镜像或者其他状况,READY CONTAINERS还没有想好怎么展现!

go run main.go

http://127.0.0.1:8080/deployments

image.png

http://127.0.0.1:8080/deployments?ns=kube-system

image.png

3.同理service

[root@zhangpeng .kube]# kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE   SELECTOR
kubernetes   ClusterIP   192.168.0.1   <none>        443/TCP   55d   <none>

基本就输出NAME TYPE CLUSTER-IP EXTERNAL-IP PORTS SELECTOR

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
	Type       string
	ClusterIp  string
	ExternalIp []string
	Ports      []string
	Select     map[string]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,
			Type:       string(item.Spec.Type),
			ClusterIp:  item.Spec.ClusterIP,
			ExternalIp: item.Spec.ExternalIPs,
			Select:     item.Spec.Selector,
		})

	}
	g.JSON(200, ret)
	return
}

注意:ExternalIp貌似会有问题 都是null还没有先好怎么取数据Type 偷懒了直接string了!ports也没有想到怎么取得

go run main.go

image.png

image.png

http://127.0.0.1:8080/service?ns=default

image.png

第一部分list总算能看一下了....除了没有实现的......

总结

  1. 算是基本上实现了list接口的自定义显示?
  2. goland神器是不错,查看源码,可惜还不能深入读懂
  3. service ports ExternalIp,deployment READY CONTAINERS展现,还有image多镜像的处理?
  4. AGE的计算

原文地址:https://cloud.tencent.com/developer/article/1993697

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340