client-go实战之六:时隔两年,刷新版本继续实战

news2024/11/18 21:24:28

欢迎访问我的GitHub

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

系列文章链接

  1. client-go实战之一:准备工作
  2. client-go实战之二:RESTClient
  3. client-go实战之三:Clientset
  4. client-go实战之四:dynamicClient
  5. client-go实战之五:DiscoveryClient

时隔两年,《client-go实战》被激活,更多内容将会继续更新

  • 时间过得真快,《client-go实战》系列已是两年前的作品,近期工作中再次用到client-go时,突然发现自己原创的内容远达不到工作要求(入门级,让您见笑了),于是打算继续更新此系列文章,重点是实用性和理解深度,既为自己补全短板,也为有同样需要的读者提供更多参考

本篇概览

  • 本篇的作用是为后续实战准备环境,主要有以下内容
  1. 安装kubernetes
  2. 本地安装辅助工具kubectl
  3. 确定client-go的版本
  4. 写个helloworld程序验证基本功能

版本信息

  • 这里列举出实战中各软件的版本情况,供您参考
  1. go:1.19.3
  2. kubernetes:1.22.8
  3. client-go:v0.22.8
  4. 开发环境:MacBook Pro 14寸(M1 Pro芯片),macOS Ventura 13.1

安装kubernetes

  • 接下来的实战中,我安装的kubernetes版本是v1.22.8,选此版本的原因很简单:之前写过《快速搭建云原生开发环境(k8s+pv+prometheus+grafana)》,按照这篇文章操作,几分钟就能成功部署v1.22.8的kubernetes
  • 本次实战中,我的kubernetes是部署在一台阿里云服务器上的

本地安装辅助工具kubectl

  • 如果想在本地远程操作kubernetes,除了ssh登录到kubernetes所在服务器,还可以在本地安装kubectl工具,这样就不用远程ssh登录服务器了
  • 针对M1芯片的MacBook,执行以下命令即可安装kubectl
curl -LO "https://dl.k8s.io/release/v1.22.8/bin/darwin/arm64/kubectl" \
&& chmod +x ./kubectl \
&& sudo mv ./kubectl /usr/local/bin/kubectl \
&& sudo chown root: /usr/local/bin/kubectl
  • 对于其他类型的电脑和其他版本的kubernetes,只需要修改下载路径中的参数即可,详细的参数请参考kubernetes官方文档
  • 执行kubectl version --client命令验证,如果安装成功则响应如下
➜  ~ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.8", GitCommit:"7061dbbf75f9f82e8ab21f9be7e8ffcaae8e0d44", GitTreeState:"clean", BuildDate:"2022-03-16T14:10:06Z", GoVersion:"go1.16.15", Compiler:"gc", Platform:"darwin/arm64"}
  • 现在虽然kubectl安装成功,但还不能远程连接kubernetes,咱们需要把配置文件搞到手

  • 登录kubernetes所在服务器,在~/.kube/目录下有个config文件,将其下载下来,放在本机的~/.kube/目录下(没有目录就新建)

  • 另外还要注意:如果您的kubernetes环境部署在阿里云,那么服务器可能有多个IP,此时x509证书上如果没有外网IP,那么在本地是无法用kubectl连接这个kubernetes的,需要把外网IP添加到证书上去,具体方法就不在本篇展开了,可以参考这位大佬的文章:https://blog.csdn.net/lwlfox/article/details/122718568

  • 现在,在本机执行kubectl命令就能访问远程kubernetes环境了

➜  ~ kubectl get pod -A
NAMESPACE          NAME                                              READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-bf576f79d-ljtst                  1/1     Running   0          105m
calico-apiserver   calico-apiserver-bf576f79d-tmmxm                  1/1     Running   0          105m
calico-system      calico-kube-controllers-78687bb75f-86nm6          1/1     Running   0          106m
calico-system      calico-node-njxv4                                 1/1     Running   0          106m
calico-system      calico-typha-59df5f67b9-hmngq                     1/1     Running   0          106m
calico-system      csi-node-driver-5l6nk                             2/2     Running   0          106m
kube-system        coredns-78fcd69978-gvzh8                          1/1     Running   0          106m
kube-system        coredns-78fcd69978-xfftz                          1/1     Running   0          106m
kube-system        etcd-izwz9h7q9tnbtp2qnzu8prz                      1/1     Running   0          107m
kube-system        kube-apiserver-izwz9h7q9tnbtp2qnzu8prz            1/1     Running   0          107m
kube-system        kube-controller-manager-izwz9h7q9tnbtp2qnzu8prz   1/1     Running   0          107m
kube-system        kube-proxy-cqsgp                                  1/1     Running   0          106m
kube-system        kube-scheduler-izwz9h7q9tnbtp2qnzu8prz            1/1     Running   0          107m
tigera-operator    tigera-operator-6f669b6c4f-7tssg                  1/1     Running   0          106m

选择版本

  • 在确定了kubernetes版本后如何确定client-go的版本呢?来看client-go官方说明,如下图
    在这里插入图片描述
  • 简单解释一下如何确定版本
  1. client-go的版本一共有两类:旧版的kubernetes-1.x.y和新版v0.x.y
  2. 如果kubernetes版本大于或等于1.17.0,client-go版本请选择新版,举例:如果kubernetes版本是1.20.4,client-go版本就是v0.20.4
  3. 如果kubernetes版本小于1.17.0,client-go版本请选择旧版,举例:如果kubernetes版本是1.20.4,client-go版本就是kubernetes-1.16.3
  • 综上所述,《client-go实战》系列接下来的文章,都会使用:kubernetes:1.22.8和client-go:v0.22.8的组合

helloworld应用的运行和部署方式

  • 接下来新建一个helloworld应用,试试client-go的基本功能是否正常
  • 为了简单省事儿,这个helloworld应用就不要部署在kubernetes缓解了,直接在vscode上运行即可,远程访问kubernetes环境

开发helloworld应用

  • 新建名为basic的目录,进入此目录
  • 创建一个go项目,执行go mod init basic
  • 下载client-go依赖并指定版本
go get k8s.io/client-go@v0.22.8
go get k8s.io/client-go/rest@v0.22.8
go get k8s.io/client-go/tools/clientcmd@v0.22.8
go get k8s.io/client-go/discovery@v0.22.8
  • 新建main.go文件,内容如下
package main

import (
	"context"
	"flag"
	"fmt"
	"path/filepath"

	"k8s.io/apimachinery/pkg/api/errors"
	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"
)

func main() {
	var kubeconfig *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")
	}
	flag.Parse()

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

	// 用clientset类来执行后续的查询操作
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.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
	}

	// 遍历列表中的每个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)
		}
	}

}
  • 由于config文件之前已经存放在当前电脑的~/.kube/目录下,因此无需任何额外参数,直接在vscode上运行main方法即可,控制台输出如下,可见client-go可以正常访问kubernetes,接下来的实战也能顺利展开了
There are 7 pods in the cluster
0. pod name : coredns-78fcd69978-gvzh8
Found pod coredns-78fcd69978-gvzh8 in namespace kube-system
1. pod name : coredns-78fcd69978-xfftz
Found pod coredns-78fcd69978-xfftz in namespace kube-system
2. pod name : etcd-izwz9h7q9tnbtp2qnzu8prz
Found pod etcd-izwz9h7q9tnbtp2qnzu8prz in namespace kube-system
3. pod name : kube-apiserver-izwz9h7q9tnbtp2qnzu8prz
Found pod kube-apiserver-izwz9h7q9tnbtp2qnzu8prz in namespace kube-system
4. pod name : kube-controller-manager-izwz9h7q9tnbtp2qnzu8prz
Found pod kube-controller-manager-izwz9h7q9tnbtp2qnzu8prz in namespace kube-system
5. pod name : kube-proxy-cqsgp
Found pod kube-proxy-cqsgp in namespace kube-system
6. pod name : kube-scheduler-izwz9h7q9tnbtp2qnzu8prz
Found pod kube-scheduler-izwz9h7q9tnbtp2qnzu8prz in namespace kube-system
  • 至此,新版本的client-go和新环境都已经准备就绪,接下来咱们一起深入探索client-go

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb开发(三)3.3——Spring Bean详解

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

【B-树、B+树、B* 树】多叉平衡搜索树,解决“IO次数”与“树高”问题~

目录 一、为什么会出现B-树&#xff1f; 面试题&#xff1a; 二、什么是B-树&#xff1f; 2.1、B,B-树,B*树 导航 三、B-树的模拟实现 3.1、插入结点分析 3.1.1、根节点的分裂 3.1.2、继续插入数据&#xff0c;分裂子节点 3.2.3、再次插入数据&#xff0c;导致根节点继…

tomcat和apache有什么区别?如何将内网发布到互联网访问?

tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联…

Android原生检测Selinux的三种方法

本文介绍 3 种检测 Android 设备 SELinux 状态的方法, Java 层检测Selinux已经没有太多意义,因为不是很靠谱,随便一个hook代码就能绕过,所以我要告诉你如何在 C 层完成检测。这几种方法在效率和抵抗mock SELinux State 的技术方面都不相同,因此在使用之前你需要知道每种方…

Windows server——部署DNS服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.DNS概述 1.DNS的诞生 二.DNS的功能 使用域名访问具有以下优点…

【大厂高频真题100题】《二叉树的序列化与反序列化》 真题练习第23题 持续更新~

二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限…

c语言 图形化贪吃蛇 多种功能 无需安装第三方库 课设 (附代码)

前言 类贪吃蛇是利用c语言模仿并实现经典游戏贪吃蛇&#xff0c;使其在窗口有贪吃蛇活动的规定范围&#xff0c;并完成一系列包括但不限于模仿蛇的移动&#xff0c;方向控制&#xff0c;吃到食物加分&#xff0c;撞上墙壁及蛇头碰到蛇身死亡等游戏功能。 附加功能&#xff1a…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖符号测试错误…

前端leaflet框选下载bing遥感图

微软必应bing遥感图。bing地图比百度遥感图清晰很多&#xff0c;19级&#xff0c;百度是18级&#xff0c;同样的18级&#xff0c;bing地图比百度也清晰很多。所以没有必要用百度地图了。不过bing地图仅用于学习&#xff0c;商用要付费。参考了https://xiaozhuanlan.com/topic/6…

CV+Deep Learning——网络架构Pytorch复现系列——Detection(二:RtinaNet)更换backbones

上一话 CVDeep Learning——网络架构Pytorch复现系列——Detection(一&#xff1a;SSD:Single Shot MultiBox Detector 4.推理Detect)https://blog.csdn.net/XiaoyYidiaodiao/article/details/128683973?spm1001.2014.3001.5501 复现Object Detection&#xff0c;会复现的网络…

设计模式-门面模式

医院的例子 现代的软件系统都是比较复杂的&#xff0c;设计师处理复杂系统的一个常见方法便是将其"分而治之"&#xff0c;把一个系统划分为几个较小的子系统。如果把医院作为一个子系统&#xff0c;按照部门职能&#xff0c;这个系统可以划分为挂号、门诊、划价、化…

Web--Jedis

# Redis 1. 概念&#xff1a; redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL Not Only SQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库。 随着互联网web2.0网…

Arch Linux 来报道!!!

导读Ubuntu 的制造商 Canonical 早已和微软进行合作&#xff0c;让我们体验了极具争议的 Bash on Windows。外界对此也是褒贬不一&#xff0c;许多 Linux 重度用户则是质疑其是否有用&#xff0c;以及更进一步认为 Bash on Windows 是一个安全隐患。 Unix 的 Bash 是通过 WSL (…

LabVIEW使用VI脚本创建和打开VI

LabVIEW使用VI脚本创建和打开VI按照下列步骤&#xff0c;可以创建一个VI&#xff0c;该VI使用VI脚本创建和打开VI。创建VI前&#xff0c;需先了解VI脚本的基本内容。必须启用VI脚本&#xff0c;才能显示VI脚本选板&#xff0c;使用相关属性和方法。1. 选择文件新建VI&#xff0…

第1章 ESP32-VSCODE环境搭建

ESP32-VSCODE环境搭建 环境安装 在Windows中安装ESP-IDF在vscode中安装Espressif IDF插件开始配置Espressif IDF插件 在vscode最上方点击&#xff1a;查看->命令面板&#xff0c;输入esp-idf:config&#xff0c;选择ESP-IDF:Configure ESP-IDF extension 选择EXPRESS Sele…

java07-面向对象2

一&#xff1a;面向对象的第二个特征&#xff1a;继承&#xff0c;关键字extends 1.继承的好处&#xff1a; 1&#xff09;减少代码的冗余&#xff0c;提高代码的复用​​​​​性。 2&#xff09;便于功能的扩展 3&#xff09;为之后多态性的使用&#xff0c;提供了前提 …

【阶段三】Python机器学习27篇:机器学习项目实战:数据降维:主成分分析PCA、基本原理与PCA模型:人脸识别

本篇的思维导图: 数据降维:主成分分析PCA 建立模型分析特征数据时,很可能会面临特征数据维度过大的问题。例如,根据已有的信用卡持有人信息及其违约数据来建立信用卡违约预测模型时,数据可能包含申请人的收入、年龄、性别、婚姻状况、工作单位等数百个维度的特征。…

【图像分类】基于yolov5的钢板表面缺陷分类(附代码和数据集)

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 Hello&#xff0c;大家好&#xf…

ArcGIS基础实验操作100例--实验100三维可视性分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验100 三维可视性分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&a…

JavaScript---DOM---高级事件---1.8

注册事件&#xff08;绑定事件&#xff09; 给元素添加事件称为注册事件或绑定事件。注册事件有两种方式&#xff1a;传统方式、方法监听注册方式。 传统注册方式&#xff1a; 利用on开头的事件onclick&#xff1a; <button onclick"alert(hi~)"></butt…