Kubernetes客户端的大杂烩

随着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)


2.2、RESTClient客户端

RESTClient是最基础的客户端,其它的客户端都是基于RESTClient实现的。RESTClient对HTTP Request进行了封装,实现了RESTFful风格的API,具有很高的灵活性,数据不依赖于方法和资源,因此RESTClient能够处理多种类型的调用,返回不同的数据格式。其中package:”k8s.io/client-go/rest”
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())
}


2.6、apiextensionsClient
提供了访问Kubernetes API中apiextensions/v1版本的资源的方法。通过该接口,您可以执行CRD的创建、更新、删除等操作。其中使用package:”k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset”
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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!