原文地址
https://haiyux.cc/2023/02/26/k8s-client-go/
client-go是什么?
client-go是Kubernetes官方提供的Go语言客户端库,用于与Kubernetes API服务器交互。使用client-go,您可以编写Go语言程序来创建、修改和删除Kubernetes对象,如Pod、Deployment、Service等。
作用
client-go的主要功能包括:
- 连接Kubernetes API服务器:client-go提供了一个API客户端,用于连接Kubernetes API服务器。
- 对象管理:client-go提供了一组API,用于创建、读取、更新和删除Kubernetes对象,如Pod、Deployment、Service等。
- Watch API:client-go提供了一个Watch API,可以用于监视Kubernetes对象的变化。
- 命名空间支持:client-go支持多个命名空间,并提供了一组API,用于管理命名空间。
- 认证和授权:client-go提供了一组API,用于执行身份验证和授权,以确保只有授权的用户才能对Kubernetes对象进行操作。
client-go是使用Kubernetes API的标准方式,是Kubernetes生态系统中的重要组成部分。
api client
client-go 中包含四种client,RestClient
, ClientSet
,DynamicClient
和DiscoveryClient
。
ClientSet
,DynamicClient
,DiscoveryClient
都是RestClient
上的封装
RestClient
RestClient是最基础的客户端,它基于HTTP请求进行了封装,实现了RESTful API。使用RESTClient提供的RESTful方法,如Get()、Put()、Post()和Delete(),可以直接与API进行交互。同时,它支持JSON和Protocol Buffers,并支持所有原生资源和自定义资源定义(CRDs)。然而,为了更加优雅地处理API交互,一般需要进一步封装,通过Clientset对RESTClient进行封装,然后再对外提供接口和服务。
package main
import (
"context"
"fmt"
"path/filepath"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
// 使用kubeconfig生成配置
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config"))
if err != nil {
panic(err)
}
config.APIPath = "api"
config.GroupVersion = &corev1.SchemeGroupVersion
config.NegotiatedSerializer = scheme.Codecs
// 生成restClient
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err)
}
rest := &corev1.PodList{}
if err = restClient.Get().Namespace("default").Resource("pods").VersionedParams(&metav1.ListOptions{},
scheme.ParameterCodec).Do(context.TODO()).Into(rest); err != nil {
panic(err)
}
for _, v := range rest.Items {
fmt.Printf("NameSpace: %v Name: %v Status: %v \n", v.Namespace, v.Name, v.Status.Phase)
}
}
/*
结果
NameSpace: default Name: nginx-76d6c9b8c-8ljkt Status: Running
NameSpace: default Name: nginx-76d6c9b8c-jqv9h Status: Running
NameSpace: default Name: nginx-76d6c9b8c-kr9d2 Status: Running
NameSpace: default Name: nginx-76d6c9b8c-m4g5l Status: Running
NameSpace: default Name: nginx-76d6c9b8c-n8st9 Status: Running
*/
ClientSet
ClientSet是在RestClient的基础上封装了对资源和版本的管理方法。资源可以理解为一个客户端,而ClientSet是多个客户端的集合。在操作资源对象时,需要指定Group和Version,然后根据资源获取。然而,ClientSet不支持自定义资源定义(CRDs),但使用kubebuilder生成代码时,会生成相应的ClientSet。
package main
import (
"context"
"fmt"
"path/filepath"
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() {
ctx := context.Background()
// 使用kubeconfig生成配置 ~/.kube/config
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeD