k8s 代码走读---client-go 编程交互测试代码
时间:2022-07-24
本文章向大家介绍k8s 代码走读---client-go 编程交互测试代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
这部分还是以 client-go 为基础的代码测试,今天这里分享的一个是我测试过的 client-go 代码例子,
package main
import (
"context"
"flag"
"fmt"
"log"
"path/filepath"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
var clientset *kubernetes.Clientset
func main() {
var kubeconfig *string
// 获取配置文件路径
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse() // flags解析
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) // 根据配置文件生成配置文件对象,这个对象如下面的代码注释
if err != nil {
log.Println(err)
return
}
clientset, err = kubernetes.NewForConfig(config) // 根据配置文件对象构建客户端
if err != nil {
log.Fatalln(err)
return
} else {
fmt.Println("connect k8s success")
}
pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{}) // 获取 pods 列表信息
if err != nil {
log.Println(err.Error())
return
}
for index, pod := range pods.Items {
fmt.Println("pods info", index)
fmt.Println("pods info", pod.Name)
fmt.Println("pods info", pod.CreationTimestamp)
fmt.Println("pods info", pod.Labels)
fmt.Println("pods namespace", pods.Items[1].Namespace)
fmt.Println("pods info", pod.Status.HostIP)
fmt.Println("pods info", pod.Status.PodIP)
fmt.Println("pods info", pod.Status.StartTime)
fmt.Println("pods info", pod.Status.Phase)
fmt.Println("pods info", pod.Status.ContainerStatuses[0].RestartCount) //重启次数
fmt.Println("pods info", pod.Status.ContainerStatuses[0].Image) //获取重启时间
}
fmt.Println("##################")
nodes, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
for index, node := range nodes.Items {
fmt.Println("index info", index)
fmt.Println("node info ", node.Name)
fmt.Println("node info ", node.CreationTimestamp) //加入集群时间
fmt.Println("node info ", node.Status.NodeInfo)
fmt.Println("node info ", node.Status.Conditions[len(nodes.Items[0].Status.Conditions)-1].Type)
fmt.Println("node info ", node.Status.Allocatable.Memory().String())
}
}
Clientset 这个对象可以看一下,可以看出这个对象是一些不同版本客户端对象的集合。
type Clientset struct {
*discovery.DiscoveryClient
admissionregistrationV1 *admissionregistrationv1.AdmissionregistrationV1Client
admissionregistrationV1beta1 *admissionregistrationv1beta1.AdmissionregistrationV1beta1Client
appsV1 *appsv1.AppsV1Client
appsV1beta1 *appsv1beta1.AppsV1beta1Client
appsV1beta2 *appsv1beta2.AppsV1beta2Client
authenticationV1 *authenticationv1.AuthenticationV1Client
authenticationV1beta1 *authenticationv1beta1.AuthenticationV1beta1Client
authorizationV1 *authorizationv1.AuthorizationV1Client
authorizationV1beta1 *authorizationv1beta1.AuthorizationV1beta1Client
...
}
下面是这个是配置文件的对象。
type Config struct {
Host string // host:port 对,或者是一个 apiserver 的 URL。
APIPath string // 是用于访问 apiserver 的一个 API 前缀。
ContentConfig // 包含了对象转换的配置信息
Username string // 基本鉴权需要的用户名和密码
Password string
BearerToken string // Bearer 认证需要的信息
BearerTokenFile string // 包含 BearerToken 的文件
Impersonate ImpersonationConfig
AuthProvider *clientcmdapi.AuthProviderConfig
AuthConfigPersister AuthProviderConfigPersister
ExecProvider *clientcmdapi.ExecConfig
TLSClientConfig //
UserAgent string
DisableCompression bool // 是否开启 GZip 压缩
Transport http.RoundTripper //
WrapTransport transport.WrapperFunc //
QPS float32 // client 访问的最大 QPS,默认是 5
Burst int // 最大突发请求量,默认是 10
RateLimiter flowcontrol.RateLimiter // 这个 client 到 master 的最大请求速率
WarningHandler WarningHandler // 处理服务响应的告警事件
Timeout time.Duration // server 访问的超时时间,0 表示不超时
Dial func(ctx context.Context, network, address string) (net.Conn, error) // 非加密 tcp 链接探测
Proxy func(*http.Request) (*url.URL, error) // 代理
}
编译
默认使用 go mod
编译,但是 go mod
默认获取的 client-go 版本有问题,需要自己调整,才能编译过。我使用的 go.mod 文件。
module k8sclientx
go 1.13
require (
github.com/imdario/mergo v0.3.11 // indirect
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
k8s.io/apimachinery v0.18.8
k8s.io/client-go v0.18.8
k8s.io/utils v0.0.0-20200815180417-3bc9d57fc792 // indirect
)
输出结果:
[root@vm-74-51-centos /data/k8s/client-test]# ./k8sclient
connect k8s success
pods info 0
pods info grafana-54b54568fc-qzv46
pods info 2020-06-02 18:07:11 +0800 CST
pods info map[app:grafana chart:grafana heritage:Tiller pod-template-hash:54b54568fc release:istio-system]
pods namespace istio-system
pods info 9.134.74.51
pods info 192.168.10.8
pods info 2020-06-02 18:07:11 +0800 CST
pods info Running
pods info 1
pods info grafana/grafana:6.5.2
pods info 1
pods info istio-egressgateway-5cbb74b6d-8xskg
pods info 2020-06-02 18:07:10 +0800 CST
pods info map[app:istio-egressgateway chart:gateways heritage:Tiller istio:egressgateway pod-template-hash:5cbb74b6d release:istio service.istio.io/canonical-name:istio-egressgateway service.istio.io/canonical-revision:latest]
pods namespace istio-system
pods info 9.134.74.51
pods info 192.168.10.6
......
总结
通过上面的分析和示例代码的编译,基本上我掌握了 kubernetes 的 client 编写方式和编译方式,这里比较坑的一点就在编译。默认 gomod 的编译引入的库是有版本冲突的,需要核对使用的版本并修改 go.mod
中的相应版本号才能编译通过。
- 走进科学: 无线安全需要了解的芯片选型、扫描器使用知识
- React Native之携程Moles框架
- 从Android短信漏洞到手机钓鱼木马
- 老外手把手带你搭建DMZ渗透测试实验室(Part 1,2)
- 与机器学习算法有关的数据结构
- 32764端口后门重出江湖,影响多款路由器
- 安全科普:SQLi Labs 指南 Part 1
- Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板
- 2014上半年国内安卓银行应用隐私泄露和安全隐患研究报告
- Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
- Metasploitable2使用指南
- 在渗透测试中使用fuzz技术(附windows安装指南)
- 黑了记者:写个恶意软件玩玩(二)
- 开源BUG跟踪平台JIRA目录遍历漏洞分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法
- Android Bitmap压缩方式分析
- Android自定义View实现游戏摇杆键盘的方法示例
- 详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法
- Android ImageView的selector效果实例详解
- 完美解决关于禁止ViewPager预加载的相关问题
- Android开发之OpenGL绘制2D图形的方法分析
- Android实现RecyclerView下拉刷新效果
- 详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题
- Android Shader应用开发之雷达扫描效果
- Android开发之绘制平面上的多边形功能分析
- Android Surfaceview的绘制与应用
- Android SQLite数据库版本升级的管理实现
- Android自定义view实现拖拽选择按钮
- Android 中ViewPager中使用WebView的注意事项