ToB企服应用市场:ToB评测及商务社交产业平台

标题: client-go实战之七:准备一个工程管理后续实战的代码 [打印本页]

作者: 玛卡巴卡的卡巴卡玛    时间: 2023-11-3 02:57
标题: client-go实战之七:准备一个工程管理后续实战的代码
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览

工程结构简述

编码

  1. package action
  2. import "k8s.io/client-go/kubernetes"
  3. type Action interface {
  4.         DoAction(clientset *kubernetes.Clientset) error
  5. }
复制代码
  1. package action
  2. import (
  3.         "context"
  4.         "fmt"
  5.         "k8s.io/apimachinery/pkg/api/errors"
  6.         metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  7.         "k8s.io/client-go/kubernetes"
  8. )
  9. type ListPod struct{}
  10. func (listPod ListPod) DoAction(clientset *kubernetes.Clientset) error {
  11.         namespace := "kube-system"
  12.         // 查询pod列表
  13.         pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
  14.         if err != nil {
  15.                 panic(err.Error())
  16.         }
  17.         nums := len(pods.Items)
  18.         fmt.Printf("There are %d pods in the cluster\n", nums)
  19.         // 如果没有pod就返回了
  20.         if nums < 1 {
  21.                 return nil
  22.         }
  23.         // 遍历列表中的每个pod
  24.         for index, pod := range pods.Items {
  25.                 fmt.Printf("%v. pod name : %v\n", index, pod.Name)
  26.                 // 用pod name精确搜索单个pod
  27.                 podObj, err := clientset.CoreV1().Pods(namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{})
  28.                 if errors.IsNotFound(err) {
  29.                         fmt.Printf("Pod %s in namespace %s not found\n", pod.Name, namespace)
  30.                 } else if statusError, isStatus := err.(*errors.StatusError); isStatus {
  31.                         fmt.Printf("Error getting pod %s in namespace %s: %v\n",
  32.                                 pod.Name, namespace, statusError.ErrStatus.Message)
  33.                 } else if err != nil {
  34.                         panic(err.Error())
  35.                 } else {
  36.                         fmt.Printf("Found pod %s in namespace %s\n", podObj.Name, namespace)
  37.                 }
  38.         }
  39.         return nil
  40. }
复制代码
程序入口


  1. package main
  2. import (
  3.         "client-go-tutorials/action"
  4.         "flag"
  5.         "fmt"
  6.         "path/filepath"
  7.         "k8s.io/client-go/kubernetes"
  8.         "k8s.io/client-go/tools/clientcmd"
  9.         "k8s.io/client-go/util/homedir"
  10. )
  11. func main() {
  12.         var kubeconfig *string
  13.         var actionFlag *string
  14.         // 试图取到当前账号的家目录
  15.         if home := homedir.HomeDir(); home != "" {
  16.                 // 如果能取到,就把家目录下的.kube/config作为默认配置文件
  17.                 kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
  18.         } else {
  19.                 // 如果取不到,就没有默认配置文件,必须通过kubeconfig参数来指定
  20.                 kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
  21.         }
  22.         actionFlag = flag.String("action", "list-pod", "指定实际操作功能")
  23.         flag.Parse()
  24.         fmt.Println("解析命令完毕,开始加载配置文件")
  25.         // 加载配置文件
  26.         config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
  27.         if err != nil {
  28.                 panic(err.Error())
  29.         }
  30.         // 用clientset类来执行后续的查询操作
  31.         clientset, err := kubernetes.NewForConfig(config)
  32.         if err != nil {
  33.                 panic(err.Error())
  34.         }
  35.         fmt.Printf("加载配置文件完毕,即将执行业务 [%v]\n", *actionFlag)
  36.         var actionInterface action.Action
  37.         // 注意,如果有新的功能类实现,就在这里添加对应的处理
  38.         switch *actionFlag {
  39.         case "list-pod":
  40.                 listPod := action.ListPod{}
  41.                 actionInterface = &listPod
  42.         case "conflict":
  43.                 conflict := action.Confilct{}
  44.                 actionInterface = &conflict
  45.         }
  46.         err = actionInterface.DoAction(clientset)
  47.         if err != nil {
  48.                 fmt.Printf("err: %v\n", err)
  49.         } else {
  50.                 fmt.Println("执行完成")
  51.         }
  52. }
复制代码
启动配置

  1. {
  2.     // Use IntelliSense to learn about possible attributes.
  3.     // Hover to view descriptions of existing attributes.
  4.     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  5.     "version": "0.2.0",
  6.     "configurations": [
  7.         {
  8.             "name": "Launch Package",
  9.             "type": "go",
  10.             "request": "launch",
  11.             "mode": "auto",
  12.             "program": "${workspaceFolder}",
  13.             "args": ["-action=list-pod"]
  14.         }
  15.     ]
  16. }
复制代码
源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4