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

简介: 上一步完成了[client-go gin的简单整合一(list列表相关操作)](https://www.yuque.com/duiniwukenaihe/hg6ymd/dt6ro1),实现了简单的**namespace deployment service**的name的输出!现在我想输出更多的内容,也当时深入一下kubernetes这些基础!

背景

上一步完成了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 map[string]string
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.pnghttp://127.0.0.1:8080/service
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的计算
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7天前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
25 9
|
15天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
32 14
|
17天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
30 10
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
88 1
|
1月前
|
索引 Python
List(列表)
List(列表)。
49 4
|
2月前
|
测试技术 开发者 Python
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
在 Python 中,创建列表有两种方法:使用方括号 `[]` 和调用 `list()` 函数。虽然两者都能创建空列表,但 `[]` 更简洁、高效。性能测试显示,`[]` 的创建速度比 `list()` 快约一倍。此外,`list()` 可以接受一个可迭代对象作为参数并将其转换为列表,而 `[]` 则需要逐一列举元素。综上,`[]` 适合创建空列表,`list()` 适合转换可迭代对象。
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
|
1月前
|
JavaScript 数据管理 虚拟化
ArkTS List组件基础:掌握列表渲染与动态数据管理
在HarmonyOS应用开发中,ArkTS的List组件是构建动态列表视图的核心。本文深入探讨了List组件的基础,包括数据展示、性能优化和用户交互,以及如何在实际开发中应用这些知识,提升开发效率和应用性能。通过定义数据源、渲染列表项和动态数据管理,结合虚拟化列表和条件渲染等技术,帮助开发者构建高效、响应式的用户界面。
210 2
|
2月前
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
33 2
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
2月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)