client-go gin的简单整合七-继续完善

网友投稿 213 2022-09-10

client-go gin的简单整合七-继续完善

背景:

紧接上文:client-go gin的简单整合六-list-watch二(关于Rs与Pod以及Deployment的完善),继续去完善相关的event 以及显示pod ip等相关配置还要继续搞一下指定deployment name显示相关pod信息!

client-go gin的简单整合七-继续完善

为什么要加一下event呢?

举一个例子

cat nginx3.yaml

apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx3 spec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx name: nginx command: ["/abc"] resources: {} status: {}

[zhangpeng@zhangpeng k8s]$ kubectl apply -f nginx3.yaml deployment.apps/nginx3 created [zhangpeng@zhangpeng k8s]$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-85b98978db-xk7kc 1/1 Running 0 21d 10.244.1.22 k8s-2 nginx1-85b98978db-wmvck 1/1 Running 0 28h 10.244.1.29 k8s-2 nginx2-6b5fb95cd4-77lk5 1/1 Running 0 29h 10.244.1.27 k8s-2 nginx3-9df8ff7bf-mjb2g 0/1 CrashLoopBackOff 1 (17s ago) 50s 10.244.1.32 k8s-2

为什么pod明明CrashLoopBackOff 了但是他还显示running......

解决方式:

想到的是判断pod contonditions中status是否为True,如果不是true则打印message字段,写一个方法:/src/service/PodUtil.go

package service import v1 "k8s.io/api/core/v1" func GetPodMessage(pod v1.Pod) string { message := "" for _, contition := range pod.Status.Conditions { if contition.Status != "True" { message += contition.Message } } return message }

Pod的struct ,添加对应字段Message:/src/service/Pod.go

package service import ( "context" "fmt" "github.com/gin-gonic/gin" "k8s-demo1/src/core" . "k8s-demo1/src/lib" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Pod struct { Namespace string Name string Status string Images string NodeName string CreateTime string Message string Labels map[string]string } func ListallPod(g *gin.Context) { ns := g.Query("ns") //pods, err := K8sClient.CoreV1().Pods(ns).List(context.Background(), metav1.ListOptions{}) pods, err := core.PodMap.ListByNS(ns) if err != nil { g.Error(err) } ret := make([]*Pod, 0) for _, item := range pods { ret = append(ret, &Pod{ Namespace: item.Namespace, Name: item.Name, Status: string(item.Status.Phase), Labels: item.Labels, NodeName: item.Spec.NodeName, Images: item.Spec.Containers[0].Image, Message: GetPodMessage(*item), CreateTime: item.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } g.JSON(200, ret) return }

/src/service/Deployment.go

package service import ( "fmt" "github.com/gin-gonic/gin" "k8s-demo1/src/core" v1 "k8s.io/api/apps/v1" "log" ) type Deployment struct { Namespace string Name string Replicas int32 AvailableReplicas int32 UnavailableReplicas int32 Images string CreateTime string Labels map[string]string Pods []*Pod } func ListDeployment(g *gin.Context) { ns := g.Query("ns") deplist, _ := core.DepMap.ListByNS(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 deplist { ret = append(ret, &Deployment{ Namespace: item.Namespace, 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.GetLabels(), Pods: GetPodsByDep(*item), CreateTime: item.CreationTimestamp.Format("2006-01-02 15:03:04"), }) } g.JSON(200, ret) return } func GetLabels(m map[string]string) string { labels := "" // aa=xxx,xxx=xx for k, v := range m { if labels != "" { labels += "," } labels += fmt.Sprintf("%s=%s", k, v) } return labels } func GetPodsByDep(dep v1.Deployment) []*Pod { rsLabelsMap, err := core.RSMap.GetRsLabelsByDeployment(&dep) if err != nil { log.Fatal(err) } pods, err := core.PodMap.ListByRsLabels(dep.Namespace, rsLabelsMap) if err != nil { log.Fatal(err) } ret := make([]*Pod, 0) for _, pod := range pods { if core.RSMap.GetRsLabelsByDeploymentname(&dep) == pod.OwnerReferences[0].Name { ret = append(ret, &Pod{ Name: pod.Name, Namespace: pod.Namespace, Images: pod.Spec.Containers[0].Image, NodeName: pod.Spec.NodeName, Labels: pod.Labels, Status: string(pod.Status.Phase), Message: GetPodMessage(*pod), CreateTime: pod.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } } return ret }

list-watch实现一下event

注:抄来的,还要消化一下/src/core/event_int.go

package core import ( "fmt" v1 "k8s.io/api/core/v1" "sync" ) var EventMap *EventMapStruct type EventMapStruct struct { data sync.Map } func (eventmap EventMapStruct) GetMessage(ns string, kind string, name string) string { key := fmt.Sprintf("%s-%s-%s", ns, kind, name) if v, ok := eventmap.data.Load(key); ok { return v.(*v1.Event).Message } return "" } type EventHandler struct{} func (eventmap *EventHandler) storeData(obj interface{}, isDelete bool) { if event, ok := obj.(*v1.Event); ok { key := fmt.Sprintf("%s-%s-%s", event.Namespace, event.InvolvedObject.Kind, event.InvolvedObject.Name) if !isDelete { EventMap.data.Store(key, event) } else { EventMap.data.Delete(key) } } } func (eventmap *EventHandler) OnAdd(obj interface{}) { eventmap.storeData(obj, false) } func (eventmap *EventHandler) OnUpdate(oldObj, newObj interface{}) { eventmap.storeData(newObj, false) } func (eventmap *EventHandler) OnDelete(obj interface{}) { eventmap.storeData(obj, true) } func init() { EventMap = &EventMapStruct{} }

在/src/core/deployment_int.go int初始化中添加eventInformer:

func InitDeployment() { factory := informers.NewSharedInformerFactory(lib.K8sClient, 0) depinformer := factory.Apps().V1().Deployments() depinformer.Informer().AddEventHandler(&DepHandler{}) Podinformer := factory.Core().V1().Pods() Podinformer.Informer().AddEventHandler(&PodHandler{}) Rsinformer := factory.Apps().V1().ReplicaSets() Rsinformer.Informer().AddEventHandler(&RSHandler{}) eventInformer := factory.Core().V1().Events() eventInformer.Informer().AddEventHandler(&EventHandler{}) factory.Start(wait.NeverStop) }

/src/service/Pod.go

package service import ( "context" "fmt" "github.com/gin-gonic/gin" "k8s-demo1/src/core" . "k8s-demo1/src/lib" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Pod struct { Namespace string Name string Status string Images string NodeName string CreateTime string //IsReady bool Message string HostIp string PodIp string RestartCount int32 Labels map[string]string } func ListallPod(g *gin.Context) { ns := g.Query("ns") //pods, err := K8sClient.CoreV1().Pods(ns).List(context.Background(), metav1.ListOptions{}) pods, err := core.PodMap.ListByNS(ns) if err != nil { g.Error(err) } ret := make([]*Pod, 0) for _, item := range pods { ret = append(ret, &Pod{ Namespace: item.Namespace, Name: item.Name, Status: string(item.Status.Phase), Labels: item.Labels, NodeName: item.Spec.NodeName, Images: item.Spec.Containers[0].Image, //IsReady: GetPodIsReady(*item), //Message: GetPodMessage(*item), Message: core.EventMap.GetMessage(item.Namespace, "Pod", item.Name), HostIp: item.Status.HostIP, PodIp: item.Status.PodIP, RestartCount: item.Status.ContainerStatuses[0].RestartCount, CreateTime: item.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } g.JSON(200, ret) return } func ListPodsByLabel(ns string, labels []map[string]string) (ret []*Pod) { list, err := core.PodMap.ListByRsLabels(ns, labels) if err != nil { return nil } for _, item := range list { ret = append(ret, &Pod{ Name: item.Name, Namespace: item.Namespace, Images: item.Spec.Containers[0].Image, NodeName: item.Spec.NodeName, Status: string(item.Status.Phase), //Message: GetPodMessage(*item), Message: core.EventMap.GetMessage(item.Namespace, "Pod", item.Name), RestartCount: item.Status.ContainerStatuses[0].RestartCount, CreateTime: item.CreationTimestamp.Format("2006-01-02 15:22:33"), }) } return }

package service import ( "fmt" "github.com/gin-gonic/gin" "k8s-demo1/src/core" v1 "k8s.io/api/apps/v1" "log" ) type Deployment struct { Namespace string Name string Replicas int32 AvailableReplicas int32 UnavailableReplicas int32 Images string CreateTime string Labels map[string]string Pods []*Pod } func ListDeployment(g *gin.Context) { ns := g.Query("ns") deplist, _ := core.DepMap.ListByNS(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 deplist { ret = append(ret, &Deployment{ Namespace: item.Namespace, 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.GetLabels(), Pods: GetPodsByDep(*item), CreateTime: item.CreationTimestamp.Format("2006-01-02 15:03:04"), }) } g.JSON(200, ret) return } func GetLabels(m map[string]string) string { labels := "" // aa=xxx,xxx=xx for k, v := range m { if labels != "" { labels += "," } labels += fmt.Sprintf("%s=%s", k, v) } return labels } func GetPodsByDep(dep v1.Deployment) []*Pod { rsLabelsMap, err := core.RSMap.GetRsLabelsByDeployment(&dep) if err != nil { log.Fatal(err) } pods, err := core.PodMap.ListByRsLabels(dep.Namespace, rsLabelsMap) if err != nil { log.Fatal(err) } ret := make([]*Pod, 0) for _, pod := range pods { if core.RSMap.GetRsLabelsByDeploymentname(&dep) == pod.OwnerReferences[0].Name { ret = append(ret, &Pod{ Name: pod.Name, Namespace: pod.Namespace, Images: pod.Spec.Containers[0].Image, NodeName: pod.Spec.NodeName, Labels: pod.Labels, Status: string(pod.Status.Phase), //IsReady: GetPodIsReady(*pod), // Message: GetPodMessage(*pod), Message: core.EventMap.GetMessage(pod.Namespace,"Pod",pod.Name), HostIp: pod.Status.HostIP, PodIp: pod.Status.PodIP, RestartCount: pod.Status.ContainerStatuses[0].RestartCount, CreateTime: pod.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } } return ret }

关于Pod IP

[zhangpeng@zhangpeng k8s]$ kubectl edit pod nginx1-85b98978db-wmvck

package service import ( "context" "fmt" "github.com/gin-gonic/gin" "k8s-demo1/src/core" . "k8s-demo1/src/lib" v1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type Pod struct { Namespace string Name string Status string Images string NodeName string CreateTime string Message string HostIp string PodIp string Labels map[string]string } func ListallPod(g *gin.Context) { ns := g.Query("ns") //pods, err := K8sClient.CoreV1().Pods(ns).List(context.Background(), metav1.ListOptions{}) pods, err := core.PodMap.ListByNS(ns) if err != nil { g.Error(err) } ret := make([]*Pod, 0) for _, item := range pods { ret = append(ret, &Pod{ Namespace: item.Namespace, Name: item.Name, Status: string(item.Status.Phase), Labels: item.Labels, NodeName: item.Spec.NodeName, Images: item.Spec.Containers[0].Image, Message: GetPodMessage(*item), HostIp: item.Status.HostIP, PodIp: item.Status.PodIP, CreateTime: item.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } g.JSON(200, ret) return } func ListPodsByLabel(ns string, labels []map[string]string) (ret []*Pod) { list, err := core.PodMap.ListByRsLabels(ns, labels) if err != nil { return nil } for _, item := range list { ret = append(ret, &Pod{ Name: item.Name, Namespace: item.Namespace, Images: item.Spec.Containers[0].Image, NodeName: item.Spec.NodeName, Status: string(item.Status.Phase), //Message: GetPodMessage(*item), Message: core.EventMap.GetMessage(item.Namespace, "Pod", item.Name), CreateTime: item.CreationTimestamp.Format("2006-01-02 15:22:33"), }) } return }

/src/service/Deployment.go

package service import ( "fmt" "github.com/gin-gonic/gin" "k8s-demo1/src/core" v1 "k8s.io/api/apps/v1" "log" ) type Deployment struct { Namespace string Name string Replicas int32 AvailableReplicas int32 UnavailableReplicas int32 Images string CreateTime string Labels map[string]string Pods []*Pod } func ListDeployment(g *gin.Context) { ns := g.Query("ns") deplist, _ := core.DepMap.ListByNS(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 deplist { ret = append(ret, &Deployment{ Namespace: item.Namespace, 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.GetLabels(), Pods: GetPodsByDep(*item), CreateTime: item.CreationTimestamp.Format("2006-01-02 15:03:04"), }) } g.JSON(200, ret) return } func GetLabels(m map[string]string) string { labels := "" // aa=xxx,xxx=xx for k, v := range m { if labels != "" { labels += "," } labels += fmt.Sprintf("%s=%s", k, v) } return labels } func GetPodsByDep(dep v1.Deployment) []*Pod { rsLabelsMap, err := core.RSMap.GetRsLabelsByDeployment(&dep) if err != nil { log.Fatal(err) } pods, err := core.PodMap.ListByRsLabels(dep.Namespace, rsLabelsMap) if err != nil { log.Fatal(err) } ret := make([]*Pod, 0) for _, pod := range pods { if core.RSMap.GetRsLabelsByDeploymentname(&dep) == pod.OwnerReferences[0].Name { ret = append(ret, &Pod{ Name: pod.Name, Namespace: pod.Namespace, Images: pod.Spec.Containers[0].Image, NodeName: pod.Spec.NodeName, Labels: pod.Labels, Status: string(pod.Status.Phase), Message: GetPodMessage(*pod), HostIp: pod.Status.HostIP, PodIp: pod.Status.PodIP, CreateTime: pod.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } } return ret }

Pod重启次数

[zhangpeng@zhangpeng k8s]$ kubectl edit pod nginx3-9df8ff7bf-mzddn

type Pod struct { Namespace string Name string Status string Images string NodeName string CreateTime string //IsReady bool Message string HostIp string PodIp string RestartCount int32 Labels map[string]string } func ListallPod(g *gin.Context) { ns := g.Query("ns") //pods, err := K8sClient.CoreV1().Pods(ns).List(context.Background(), metav1.ListOptions{}) pods, err := core.PodMap.ListByNS(ns) if err != nil { g.Error(err) } ret := make([]*Pod, 0) for _, item := range pods { ret = append(ret, &Pod{ Namespace: item.Namespace, Name: item.Name, Status: string(item.Status.Phase), Labels: item.Labels, NodeName: item.Spec.NodeName, Images: item.Spec.Containers[0].Image, //IsReady: GetPodIsReady(*item), Message: GetPodMessage(*item), //Message: core.EventMap.GetMessage(item.Namespace, "Pod", item.Name), HostIp: item.Status.HostIP, PodIp: item.Status.PodIP, RestartCount: item.Status.ContainerStatuses[0].RestartCount, CreateTime: item.CreationTimestamp.Format("2006-01-02 15:04:05"), }) } g.JSON(200, ret) return }

接下来的问题:

先删除nginx3 deployment:

[zhangpeng@zhangpeng k8s]$ kubectl delete -f nginx3.yaml deployment.apps "nginx3" deleted

创建一个正常的nginx3.yaml

apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx3 spec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx name: nginx resources: {} status: {}

[zhangpeng@zhangpeng k8s]$ kubectl apply -f nginx3.yaml deployment.apps/nginx3 created [zhangpeng@zhangpeng k8s]$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-85b98978db-xk7kc 1/1 Running 0 23d nginx1-85b98978db-wmvck 1/1 Running 0 3d23h nginx2-6b5fb95cd4-77lk5 1/1 Running 0 4d nginx3-6f97cd4f65-k7ffx 0/1 ContainerCreating 0 4s

[zhangpeng@zhangpeng k8s]$ cp nginx3.yaml nginx33.yaml

vim nginx33.yaml继续创建一个无法成功启动的Pod:

apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx3 spec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx name: nginx command: ["/abc"] resources: {} status: {}

[zhangpeng@zhangpeng k8s]$ kubectl apply -f nginx33.yaml deployment.apps/nginx3 configured

总结:

event实现了list watch ip restartcount如何在pod中获取 怎么样显示nginx3示例中两个pod?要好好想一下!

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

上一篇:“花钱打投”被禁,奶企综艺营销何去何从!
下一篇:云原生存储解决方案Rook-Ceph与Rainbond结合的实践
相关文章

 发表评论

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