首页 > 其他分享 >client-go实战之七:准备一个工程管理后续实战的代码

client-go实战之七:准备一个工程管理后续实战的代码

时间:2023-10-16 16:57:35浏览次数:45  
标签:实战 之七 err fmt action client go pod

欢迎访问我的GitHub

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

本篇概览

  • 本文是《client-go实战》系列的第八篇,主要内容是新建一个golang工程,用于管理代码,后面整个系列的代码都会保存在这个工程中

工程结构简述

  • 此工程打算写一个简单的接口,接下来所有实战的功能代码都实现这个接口,在命中输入参数来决定执行哪个实现类
  • 整个工程结构如下图所示,后续的实战中,每个功能类都如绿色箭头所示,是个独立的go文件
    在这里插入图片描述

编码

  • 新建一个名为client-go-tutorials的golang工程
  • 为了便于扩展,新建名为action的文件夹,里面增加action.go文件,内容如下
package action

import "k8s.io/client-go/kubernetes"

type Action interface {
	DoAction(clientset *kubernetes.Clientset) error
}
  • 后面的实战都实现这个接口,先把前文的helloworld迁移到本工程中,即list_pod.go
package action

import (
	"context"
	"fmt"

	"k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
)

type ListPod struct{}

func (listPod ListPod) DoAction(clientset *kubernetes.Clientset) error {
	namespace := "kube-system"

	// 查询pod列表
	pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}

	nums := len(pods.Items)

	fmt.Printf("There are %d pods in the cluster\n", nums)

	// 如果没有pod就返回了
	if nums < 1 {
		return nil
	}

	// 遍历列表中的每个pod
	for index, pod := range pods.Items {
		fmt.Printf("%v. pod name : %v\n", index, pod.Name)

		// 用pod name精确搜索单个pod
		podObj, err := clientset.CoreV1().Pods(namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{})
		if errors.IsNotFound(err) {
			fmt.Printf("Pod %s in namespace %s not found\n", pod.Name, namespace)
		} else if statusError, isStatus := err.(*errors.StatusError); isStatus {
			fmt.Printf("Error getting pod %s in namespace %s: %v\n",
				pod.Name, namespace, statusError.ErrStatus.Message)
		} else if err != nil {
			panic(err.Error())
		} else {
			fmt.Printf("Found pod %s in namespace %s\n", podObj.Name, namespace)
		}
	}

	return nil
}

程序入口

  • 接下来是main.go,这是程序的入口,代码有以下功能:
  1. 加载kubernetes的配置文件,以便后续的处理
  2. 检查命令的入参action,根据不同的值执行不同的实现类,在本篇就是list-pod,即获取pod列表并在控制台输出
  • main.go源码如下
package main

import (
	"client-go-tutorials/action"
	"flag"
	"fmt"
	"path/filepath"

	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
)

func main() {
	var kubeconfig *string
	var actionFlag *string

	// 试图取到当前账号的家目录
	if home := homedir.HomeDir(); home != "" {
		// 如果能取到,就把家目录下的.kube/config作为默认配置文件
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		// 如果取不到,就没有默认配置文件,必须通过kubeconfig参数来指定
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}

	actionFlag = flag.String("action", "list-pod", "指定实际操作功能")

	flag.Parse()

	fmt.Println("解析命令完毕,开始加载配置文件")

	// 加载配置文件
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// 用clientset类来执行后续的查询操作
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	fmt.Printf("加载配置文件完毕,即将执行业务 [%v]\n", *actionFlag)

	var actionInterface action.Action

	// 注意,如果有新的功能类实现,就在这里添加对应的处理
	switch *actionFlag {
	case "list-pod":
		listPod := action.ListPod{}
		actionInterface = &listPod
	case "conflict":
		conflict := action.Confilct{}
		actionInterface = &conflict
	}

	err = actionInterface.DoAction(clientset)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	} else {
		fmt.Println("执行完成")
	}
}

启动配置

  • 最后,如果您用的是vscode,可以像下面这样配置launch.json文件,以便快速运行main.go,以及输入参数
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}",
            "args": ["-action=list-pod"]
        }
    ]
}
  • 最后,确认.kube/config文件可以正常使用
  • 按照下图操作,可以正常运行程序,输出pod列表信息
    在这里插入图片描述
  • 至此,本篇完成,接下来的实战都会使用本篇创建的工程,在这里面添加action接口的实现类

源码下载

名称 链接 备注
项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
git仓库地址(ssh) [email protected]:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本篇的源码在tutorials/client-go-tutorials文件夹下,如下图红框所示:
    在这里插入图片描述

欢迎关注博客园:程序员欣宸

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

标签:实战,之七,err,fmt,action,client,go,pod
From: https://www.cnblogs.com/bolingcavalry/p/17724739.html

相关文章

  • Go - Creating a TCP Client
    Problem: YouwanttocreateaTCPclienttosenddatatoaTCPserver.Solution: UsetheDialfunctioninthenetpackagetoconnecttoaTCPserver. CreatingaTCPclientissimilartocreatingaTCPserverbutevensimpler.Themaindifferenceistha......
  • 【matplotlib 实战】--南丁格尔玫瑰图
    南丁格尔玫瑰图是一种用极坐标下的柱状图或堆叠柱状图来展示数据的图表。虽然南丁格尔玫瑰图外观类似饼图,但是表示数据的方式不同,它是以半径来表示数值的,而饼图是以扇形的弧度来表达数据的。所以,南丁格尔玫瑰图在视觉上会夸大数据的比例,因为半径和面积之间是平方关系。因此,当需......
  • hadoop集群 大数据项目实战_电信用户行为分析_day02
    集群配置好后,运行一个小例子,统计单词1.hdfsdfs-put将本地系统的文件或文件夹复制到HDFS上2.hdfsdfs-ls/output  将所有的文件显示出来3.hdfsdfs-cat/output/ 将所有的文件读取出来 下载part-r-000000安装Redis1.下载Rediswgethttps://download.redis.i......
  • 《Node.js实战》高清高质量电子书PDF
    下载:https://pan.quark.cn/s/aa6e22dcf756......
  • Filebeat 采集 k8s Pod 和 Events 日志实战操作
    目录一、概述1)采集Pod日志流程介绍3)采集Events日志流程介绍二、K8s集群部署三、ElasticSearch和kibana环境部署四、Filebeat采集配置1)采集Pod日志配置2)采集Events日志配置1、创建filebeat授权token2、filebeat配置一、概述要使用Filebeat采集Kubernetes中......
  • 每个后端都应该了解的OpenResty入门以及网关安全实战
    简介在官网上对OpenResty是这样介绍的(http://openresty.org):“OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。”“......
  • smardaten实战丨谁说无代码不能开发出漂亮的门户首页?
    一、需求背景门户首页对于一个公司或组织来说是一个极其重要的网站页面,它可以作为访问者了解和获取相关信息的入口,同时也是展示品牌形象和吸引目标受众的重要工具。开发一个门户首页需要开发团队在向访问者展示关于公司或组织基本信息的基础上,使用多种样式设计和布局来突出展示公司......
  • springboot结合shiro实战-身份认证
     目录环境搭建配置shiro环境总结hello,大家好,我们写任何企业级项目基本都会需要做权限,权限包含身份认证和授权。所谓身份认证,就是证明你是你。所谓授权就是明白你登录之后能干什么。现在,让我们用springboot项目入手,结合shiro框架来完成这一切。环境搭建基本信息:springboot版本:初始......
  • java——redis随笔——实战——商户查询缓存
                      把key做了下代码优化: /***根据id查询商铺信息*@paramid商铺id*@return商铺详情数据*/@OverridepublicResultqueryById(Longid){//key要唯......
  • kubernetes client-go 避坑
    原文链接:https://www.cnblogs.com/gaorong/p/16939111.htmlinformercache中的数据是只读的,任何修改都先deepcopyinformercache中的数据是只读的,任何修改都应该先deepcopy出来,然后提交apiserver,利用apiserverinformerevent重新同步回cache中。如果直接修改cache中的数据......