背景

上一步实现了client-go gin的简略整合一(list列表相干操作),实现了简略的namespace deployment service的name的输入!当初我想输入更多的内容,也过后深刻一下kubernetes这些根底!

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

1. 从namespace开始

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


首先我想输入namespace的STATUS状态和AGE!
以develop为例看一下还有什么想输入的信息

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


creationTimestamp labels status状态在这里也是能够体现的!
入手吧
src/service/Namespace.go

package serviceimport (    "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}

注:毕竟老手不太会解决数据,就做了如下解决,先能展现出本人先要的数据。前面再作深刻的学习!


同理status

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

同理labels map[string]string


运行main.go,main.go仍然是原来的没有进行其余批改如下:

package mainimport (    "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()}


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

根本实现,AGE还没有想好怎么展示,是不是要算工夫戳减去CreateTime?前面再去钻研吧......

2.持续deployment的进一步深刻

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


恩 起码的是要把这些根本输入的:READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR!
具体看一眼nginx deployment 看一眼还有什么要输入的:

[root@zhangpeng ~]# kubectl get deployment nginx -o yaml
apiVersion: apps/v1kind: Deploymentmetadata:  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-15576a332755spec:  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: 30status:  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的输入整一下了

src/service/Deployment.go

package serviceimport (    "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}


Images也没有思考其余的,多个镜像或者其余情况,READY CONTAINERS还没有想好怎么展示!
go run main.go
http://127.0.0.1:8080/deployments

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

3.同理service

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

根本就输入NAME TYPE CLUSTER-IP EXTERNAL-IP PORTS SELECTOR

package serviceimport (    "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
http://127.0.0.1:8080/service

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

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

总结

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