近日见闻
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)
}
}
领取专属 10元无门槛券
私享最新 技术干货