欢迎访问我的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) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本篇的源码在tutorials/client-go-tutorials文件夹下,如下图红框所示:

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

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

client-go实战之七:准备一个工程管理后续实战的代码的更多相关文章

  1. 运用集合来做一个DVD管理器(全代码)

    package DVD;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Array ...

  2. 6、GNU makefile工程管理学习的一个例子

    在之前我们已经学习了一个文件的编译过程,但是做过项目的都知道,一个工程中的源文件不计其数,其按类型.功能.模块会分别放在若干个目录中,而这些文件如何编译就需要有一个编译规则,虽然现在很多大型的项目都是 ...

  3. 做一个阅读管理APP

    背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...

  4. 使用BLADE构建c++工程管理

    使用BLADE构建c++工程管理 字数764 阅读2753 评论2 喜欢4 一. c++工程依赖管理 之前在百度一直使用comake2构建c++项目,十分方便.免去了手写Makefile的痛苦,很多项 ...

  5. emacs工程管理,cedet ede插件自动构建Make,Automake

    鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...

  6. Keil MDK入门---从新建一个工程开始

    熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...

  7. SDWebImage使用——一个可管理远程图片加载的类库

    SDWebImage使用——一个可管理远程图片加载的类库     SDWebImage使用——一个可管理远程图片加载的类库 SDWebImage托管在github上.https://github.co ...

  8. [原创].NET 业务框架开发实战之七 业务层初步构想

    原文:[原创].NET 业务框架开发实战之七 业务层初步构想 .NET 业务框架开发实战之七 业务层初步构想 前言:本篇主要讲述如何把DAL和BLL衔接起来. 本篇议题如下: 1.       DAL ...

  9. make工程管理器

    1.概述 大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生. make可以自动识别文件时间戳,只处理修改的文件: make ...

  10. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

随机推荐

  1. 无法将“Ethernet0”连接到虚拟网络“VMnet8”。

    出现这个问题的解决办法,请参考右侧链接:https://blog.csdn.net/big_bigwolf/article/details/79147388

  2. 面试官:讲讲MySql索引失效的几种情况

    索引失效 准备数据: CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAUL ...

  3. 国标GB28181协议客户端开发(三)查询和实时视频画面

    国标GB28181协议客户端开发(三)查询和实时视频画面 本文是<国标GB28181协议设备端开发>系列的第三篇,探讨了信息查询和实时视频在GB28181协议中的应用.首先,介绍了设备目录 ...

  4. 1.4 编写简易ShellCode弹窗

    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关于ShellCode的相关知识体系,ShellCode 通常是指一个原始的可执行 ...

  5. SpringBoot项目:net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:XXXXX

    原文地址 写在前面 最近开发过程中,在where条件中使用IF函数,在MySQL数据库中,使用Navicat运行没有问题,但是运行项目的时候,死活过不去,一直报错,后来一番折腾找到了解决方案,所以,以 ...

  6. KVM 虚拟机 热插拔硬盘

    新建硬盘 lvm 命令 lvcreate -L 200G -n lv02 ssd01 qemu-img 命令 qemu-img create -f raw test1G.raw 1G dd 命令 dd ...

  7. UPS设备在物流机房中的应用浅析

    1 UPS 简介 UPS 即不间断电源 (Uninterruptible Power Supply),是一种含有储能装置的不间断电源.主要用于给部分对电源稳定性要求较高的设备,提供不间断的电源. 当市 ...

  8. Robot Framework 自动化测试随笔(二)

    二.Web自动化(1) 1.安装selenium2library库 pip install robotframework-selenium2library   2.指定报告的生成路径 在[Run]标签 ...

  9. redis 中的 set

    set是String中的无序集合  底层是 是 value为null 的hash表  时间复杂化是o(1): sadd  k1 v1 v2 v3  set中添加数据 smembers k1 取出set ...

  10. [碎碎念]和ljf老师聊天得到的一些启发,希望大家一起来吹水

    关于写这个小文 和ljf老师聊天得到的一些启发,希望能够总结出来方便回顾,并且我觉得这些想法有一定的普适性,可以供大家参考. 疑问 我的疑问是,我现在主要在做fuzz+pwn,能够进行漏洞挖掘,以及w ...