首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

探索Kubernetes Client-Go:实现K8s资源操作

近日见闻

1、尤雨溪宣布正式发布 VitePress 1.0 版本,并声称其 “基于 Vite 和 Vue 构建,是 VuePress 的精神继承者和现代替代品。” --vue社区

2、Podman 5.0 已正式发布。新版本针对 Windows 和 Mac 平台完全重写了代码,并对这两个平台上的虚拟机管理程序支持进行了重大改进。 --podman

3、Canonical 宣布全面推出 Legacy Support —— 一个 Ubuntu Pro 插件,可将 Ubuntu LTS 版本的安全性和支持范围扩大到 12 年。适用于 Ubuntu 14.04 LTS 及以上版本。 --Ubuntu

摘抄:

这个世界并不在乎你的自尊,

只在乎你做出来的成绩,

然后再去强调你的感受。

——比尔.盖茨

client-go

访问kubernetes集群有几种方式,通过web-UI、kubectl、client-go/java/python。之前我们的操作一般通过ui界面或者kubectl终端命令行完成,如果想做一些定制化的内容或者自定义的资源操作,就需要用到这个client-go客户端了。可以直接调用api服务器接口,但是使用过程中,需要注意api的版本。以下将仓库的内容进行简单的总结概述,分享给大家。

官网: 暂无

仓库:https://github.com/kubernetes/client-go

目前这个项目已有将近580名贡献者,简单介绍下项目仓库的内容:

kubernetes软件包包含用于访问 Kubernetes API 的客户端集。

discovery包用于发现 Kubernetes API 服务器支持的 API。

dynamic包包含一个动态客户端,可以对任意 Kubernetes API 对象执行通用操作。

plugin/pkg/client/auth软件包包含可选的身份验证插件,用于从外部源获取凭据。

transport包用于设置身份验证并启动连接。

tools/cache包对于编写控制器很有用。

版本兼容性

一般是k8s-v1.28.0对应client-go-v0.28.0如图所示:

关键点说明

在 client-go 和 Kubernetes 版本中具有完全相同的功能/API对象。

client-go 拥有可能在 Kubernetes 集群中不存在的功能或 API 对象,这可能是因为 client-go 有额外的新 API,或者服务器删除了旧 API。然而,他们共同拥有的大部分 API 都将工作。请注意,alpha API 可能会在单个版本中消失或发生重大变化。

Kubernetes 集群具有 client-go 库无法使用的功能,这可能是因为服务器有额外的新 API,或者 client-go 删除了旧 API。然而,他们共同拥有的大部分 API 都将工作。 有关 client-go 版本之间变化的详细描述,请查看更新日志。

维护分支

release-1.25Kubernetes 主仓库, 1.25 分支

release-1.26Kubernetes 主仓库, 1.26 分支

release-1.27Kubernetes 主仓库, 1.27 分支

release-1.28Kubernetes 主仓库, 1.28 分支

client-go HEADKubernetes 主仓库, master 分支

注意:至少维护分支直到它们的第一个稳定标签被打出后的六个月。

要获取最新版本,请使用 go1.16+ 并使用 go get 命令获取。例如:

go?get?k8s.io/client-go@latest

要获取特定版本,请使用 go1.11+ 并使用 go get 命令获取所需版本。例如:

最新示例

地址:https://github.com/kubernetes/client-go/tree/master/examples目录包含了涵盖各种用例和client-go功能的示例。

上个月更新的示例:

这个示例演示了如何在测试中使用带有SharedInformerFactory的假客户端。

它包括:

创建假客户端

设置真实的Informer

向那些Informer注入事件

执行命令:

go?test?-v?k8s.io/client-go/examples/fake-client

代码太长,具体在这里:https://github.com/kubernetes/client-go/blob/master/examples/fake-client/main_test.go

其余的示例还有:

-?create-update-delete-deployment

deployment增删改查

-?dynamic-create-update-delete-deployment

动态创建

-?fake-client

假客户端

-?in-cluster-client-configuration

集群内客户端配置

-?leader-election

领导选举

-?out-of-cluster-client-configuration

集群外客户端配置

-?workqueue

工作队列

以下是其中一个比较常用的集群外与k8s互动的示例(由GPT注释):

//?版权声明部分表明这段代码是根据Apache?License?2.0许可协议发布的,并归Kubernetes作者所有。

/*

Copyright?2016?The?Kubernetes?Authors.

Licensed?under?the?Apache?License,?Version?2.0?(the?"License");

you?may?not?use?this?file?except?in?compliance?with?the?License.

You?may?obtain?a?copy?of?the?License?at

http://www.apache.org/licenses/LICENSE-2.0

Unless?required?by?applicable?law?or?agreed?to?in?writing,?software

distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,

WITHOUT?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.

See?the?License?for?the?specific?language?governing?permissions?and

limitations?under?the?License.

*/

//?程序的主包声明。

package?main

//?导入必要的Go标准库和client-go库的包。

import?(

"context"?//?用于创建上下文,用于控制API调用的取消和超时。

"flag"?//?用于解析命令行参数。

"fmt"?//?提供格式化输出函数。

"path/filepath"?//?用于处理文件路径。

"time"?//?提供时间操作函数。

"k8s.io/apimachinery/pkg/api/errors"?//?Kubernetes的API错误处理包。

metav1?"k8s.io/apimachinery/pkg/apis/meta/v1"?//?Kubernetes的元数据API。

"k8s.io/client-go/kubernetes"?//?Kubernetes的客户端Go库。

"k8s.io/client-go/tools/clientcmd"?//?用于处理kubeconfig文件的库。

"k8s.io/client-go/util/homedir"?//?用于获取用户的home目录。

//?下面的注释可以被取消注释以加载所有或特定的认证插件。

//?_?"k8s.io/client-go/plugin/pkg/client/auth"

//?_?"k8s.io/client-go/plugin/pkg/client/auth/azure"

//?_?"k8s.io/client-go/plugin/pkg/client/auth/gcp"

//?_?"k8s.io/client-go/plugin/pkg/client/auth/oidc"

)

//?main是程序的入口函数。

func?main()?{

//?定义kubeconfig的路径。如果在用户的HOME目录下找到了.kube/config,

//?则使用该路径,否则使用用户提供的路径。

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()?//?解析命令行参数。

//?使用kubeconfig配置创建clientset,用于与API服务器通信。

config,?err?:=?clientcmd.BuildConfigFromFlags("",?*kubeconfig)

if?err?!=?nil?{

panic(err.Error())?//?处理创建配置失败的情况。

}

//?基于上面创建的配置建立客户端集。

clientset,?err?:=?kubernetes.NewForConfig(config)

if?err?!=?nil?{

panic(err.Error())?//?处理创建客户端集失败的情况。

}

//?程序开始无限循环,每10秒执行一次列出Pods和检查特定Pod的操作。

for?{

//?列出所有Pods并打印Pod数量。

pods,?err?:=?clientset.CoreV1().Pods("").List(context.TODO(),?metav1.ListOptions{})

if?err?!=?nil?{

panic(err.Error())?//?错误处理。

}

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

//?尝试获取默认命名空间中名为"example-xxxxx"的Pod。

namespace?:=?"default"

pod?:=?"example-xxxxx"

_,?err?=?clientset.CoreV1().Pods(namespace).Get(context.TODO(),?pod,?metav1.GetOptions{})

//?错误处理:检查是否是因为Pod不存在导致的错误。

if?errors.IsNotFound(err)?{

fmt.Printf("Pod?%s?in?namespace?%s?not?found\n",?pod,?namespace)

}?else?if?statusError,?isStatus?:=?err.(*errors.StatusError);?isStatus?{

//?如果是其他类型的API错误,则打印错误详情。

fmt.Printf("Error?getting?pod?%s?in?namespace?%s:?%v\n",

pod,?namespace,?statusError.ErrStatus.Message)

}?else?if?err?!=?nil?{

//?如果是未知类型的错误,则产生panic。

panic(err.Error())

}?else?{

//?当成功找到Pod时,打印相应的消息。

fmt.Printf("Found?pod?%s?in?namespace?%s\n",?pod,?namespace)

}

//?休眠10秒钟。

time.Sleep(10?*?time.Second)

}

}

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O1qMkcYfHPsD_6vD97RFoQLg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com