随着K8s二次开发及Operator的开发越来越普及,入门的client是第一步也非常重要。本文主要谈K8s相关的client。
1、kubeConfig文件获取
获取kubeConfig就是获取对应的K8s集群信息,所以操作K8s时,获取kubeConfig是使用client前提。其中使用的package包为”k8s.io/client-go/tools/clientcmd”
-
1.1、当kubeconfig为具体的config内容时,需要string内容转换字节切片,使用RESTConfigFromKubeConfig函数
注意:可能需要替换kubeconfig里面的master地址
config, err := clientcmd.RESTConfigFromKubeConfig([]byte(kubeconfig))
if err != nil {
log.Error().Err(err)
return
}
-
1.2、当kubeconfig为config路径时,使用BuildConfigFromFlags函数
if len(kubeConfigFile) > 0 {
conf, err := clientcmd.BuildConfigFromFlags("", kubeConfigFile)
if err != nil{
log.Error().Err(err)
return
}
}
-
1.3、当本地调试时,默认的kubeconfig路径时,
usr, err := user.Current()
if err != nil {
return fmt.Errorf("user not found")
}
// OS user found. Parse ~/.kube/config file
conf, err := kubeclientcmd.BuildConfigFromFlags("", filepath.Join(usr.HomeDir, ".kube", "config"))
if err != nil {
return fmt.Errorf("~/.kube/config not found")
}
-
1.4、最重要的方法,当业务是pod运行时,client使用默认的sa方式获取
使用的package包为:"k8s.io/client-go/rest",函数为InClusterConfig
if conf, err := kuberest.InClusterConfig(); err == nil {
// in-cluster configuration found
return conf, nil
}
总的代码:
import (
kuberest "k8s.io/client-go/rest"
"os"
"os/user"
kubeclientcmd "k8s.io/client-go/tools/clientcmd"
)
func getKubeConfig(kubeConfigFile, masterURL string) (*kuberest.Config, error) {
if len(kubeConfigFile) > 0 {
// kube config file specified as CLI flag
return kubeclientcmd.BuildConfigFromFlags(masterURL, kubeConfigFile)
}
if len(os.Getenv("KUBECONFIG")) > 0 {
// kube config file specified as ENV var
return kubeclientcmd.BuildConfigFromFlags(masterURL, os.Getenv("KUBECONFIG"))
}
if conf, err := kuberest.InClusterConfig(); err == nil {
// in-cluster configuration found
return conf, nil
}
usr, err := user.Current()
if err != nil {
return nil, fmt.Errorf("user not found")
}
// OS user found. Parse ~/.kube/config file
conf, err := kubeclientcmd.BuildConfigFromFlags("", filepath.Join(usr.HomeDir, ".kube", "config"))
if err != nil {
return nil, fmt.Errorf("~/.kube/config not found")
}
// ~/.kube/config found
return conf, nil
}
2、不同作用的client
不同的client对应不同的功能使用,其中包括client-go、RESTClient、DynamicClient、controller-runtime、DiscoveryClient、apiextensionsClient和自定义client。其中每个使用的kubeconfig是一样的。本文先不介绍自定义client,主要在crd资源的curd。
-
2.1、最常用的client,client-go
提供了与Kubernetes API进行交互的功能,包括创建、更新、删除和查询各种资源对象(如Pod、Deployment、Service等)。它还提供了对API对象的CRUD操作、事件监听、集群认证和授权等功能。其中使用的package包为”k8s.io/client-go/kubernetes”
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatal(err)
}
//获取nodes
podClient := clientset.CoreV1().Pods(coreV1.NamespaceDefault)
restClient, err := rest.RESTClientFor(config)
if err != nil {
log.Fatal(err)
}
result := &coreV1.PodList{}
err = restClient.Get().Namespace("default").Resource("pods").VersionedParams(&metaV1.ListOptions{}, scheme.ParameterCodec).Do(context.TODO()).Into(result)
if err != nil {
log.Fatal(err)
}
-
2.3、DynamicClient客户端
是一个动态客户端,可以对任意Kubernetes资源进行RESTFful操作,包括CRD自定义资源。DynamicClient与Client-go最大的不同就是,Client-go仅能访问Kubernetes自带的资源,不能直接访问CRD自定义资源。Client-go内部的数据都是结构化数据,而DynamicClient内部实现了Unstructured,用于处理非结构化数据结构,这是能够处理CRD自定义资源的关键。DynamicClient不是类型安全的,因此访问CRD自定义资源时需要特别注意。需要使用的package为”k8s.io/client-go/dynamic”
注意:操作crd资源时,需要添加对应的ClusterRole权限
client, err := dynamic.NewForConfig(config)
if err != nil {
log.Fatal(err)
}
// 创建一个Unstructured对象,表示要操作的资源
unstructuredObj := &unstructured.Unstructured{}
unstructuredObj.SetGroupVersionKind(schema.GroupVersionKind{
Group: "apps",
Version: "v1",
Kind: "Deployment",
})
unstructuredObj.SetName("example-deployment")
unstructuredObj.SetNamespace("default")
// 获取资源的动态客户端
resourceClient := client.Resource(unstructuredObj.GroupVersionKind().GroupVersion().WithResource("deployments"))
// 创建资源
createdObj, err := resourceClient.Namespace(unstructuredObj.GetNamespace()).Create(context.TODO(), unstructuredObj, metav1.CreateOptions{})
if err != nil {
log.Fatal(err)
}
-
2.4、controller-runtime客户端
它是一个高级的控制器框架,提供了编写自定义控制器的功能。它构建在client-go库之上,并为常见的操作(如处理资源的增删改查、事件监听等)提供了简化的抽象和工具,提供了类型安全的方式处理核心资源数据为Unstructured,其中使用的package为:”sigs.k8s.io/controller-runtime/pkg/client”
注意:操作crd资源时,需要添加对应的ClusterRole权限
k8sClient, err := client.New(kubeConfig, client.Options{})
if err != nil {
log.Fatal(err)
}
// 创建一个Unstructured对象,表示要操作的资源
unstructuredObj := &unstructured.Unstructured{}
unstructuredObj.SetGroupVersionKind(schema.GroupVersionKind{
Group: "apps",
Version: "v1",
Kind: "Deployment",
})
unstructuredObj.SetName("example-deployment")
unstructuredObj.SetNamespace("default")
// 创建资源
createdObj, err := k8sClient.Create(context.TODO(), unstructuredObj, metav1.CreateOptions{})
if err != nil {
log.Fatal(err)
}
-
2.5、DiscoveryClient
DiscoveryClient是发现客户端,主要用于发现Kubernetes API Server所支持的资源组、资源版本、资源信息。除此之外,还可以将这些信息存储到本地,用户本地缓存,以减轻对Kubernetes API Server访问的压力。其中使用package:”k8s.io/client-go/discovery”
// 新建discoveryClient实例
discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
if err != nil {
panic(err.Error())
}
// 获取所有分组和资源数据
APIGroup, APIResourceListSlice, err := discoveryClient.ServerGroupsAndResources()
if err != nil {
panic(err.Error())
}
apiextensionsClientset, err := apiextensions.NewForConfig(kubeConfig)
if err != nil {
panic(err.Error())
}
crd, err := apiextensionsClientset.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, "xx.yy.altinity.com", newGetOptions())
原文始发于微信公众号(云原生内经):Kubernetes客户端的大杂烩
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/167918.html