主要内容是理解并使用client-go四种客户端,为什么需要四种客户端,场景分别是什么,如何初始化四种客户端,并使用四个客户端分别去获取资源。
Client-go提供了四种客户端,简单描述如下
客户端名称 | 源码目录 | 简单描述 |
---|---|---|
RESTClient | client-go/rest/ | 基础客户端,对HTTP Request进行封装,提供了对应的 RESTful 方法与 Kubernetes APIServer RESTful API 进行交互 |
Clientset | client-go/kubernetes/ | 在RESTClient基础上对k8s内置资源进行了封装, 例如AppsV1().Deployments或者CoreV1.Pods,缺点是只能访问k8s内建资源,不能访问CRD自定义资源 |
DynamicClient | client-go/dynamic/ | 在RESTClient基础上对任意类型的资源进行了封装,可以对任意的K8S API对象执行通用操作,包括CRD自定义资源 |
DiscoveryClient | client-go/discovery/ | 也是在RESTClient基础上封装的,上述客户端都是针对k8s资源对象管理的,而DiscoveryClient用于发现API Server支持的资源组,资源版本和资源信息 |
RESTClient 是所有客户端的父类,它可以操作 Kubernetes 所有的内置资源对象以及 CRD。RESTClient 底层使用了golang的 net/http 库,将调用 APIServer 的请求进行了封装,对参数和返回结果进行序列化及反序列化。
使用RESTClient 获取指定的deployment资源信息:
func TestRESTClient(t *testing.T) {
conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
t.Fatal(err)
}
conf.APIPath = "apis"
conf.GroupVersion = &appsv1.SchemeGroupVersion
conf.NegotiatedSerializer = legacyscheme.Codecs
client, err := rest.RESTClientFor(conf)
if err != nil {
t.Fatal(err)
}
var deployment appsv1.Deployment
if err := client.Get().Namespace("rook-ceph").Resource("deployments").Name("rook-ceph-operator").
Do(context.TODO()).Into(&deployment); err != nil {
t.Fatal(err)
}
t.Log(deployment)
}
Clientset是根据k8s所有内置资源组的每一个version实现的客户端集合,通过这些资源对象客户端提供的操作方法,即可对 Kubernetes 内置的资源对象进行 Create、Update、Get、List、Delete 等操作。
使用Clientset获取指定的deployment资源信息:
func TestClientset(t *testing.T) {
conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
t.Fatal(err)
}
client, err := kubernetes.NewForConfig(conf)
if err != nil {
t.Fatal(err)
}
deployment, err := client.AppsV1().Deployments("rook-ceph").Get(context.TODO(), "rook-ceph-operator", metav1.GetOptions{})
if err != nil {
t.Fatal(err)
}
t.Log(deployment)
}
DynamicClient 是一种动态客户端,通过动态指定资源组、资源版本和资源等信息来操作任意的 k8s 资源对象。
使用DynamicClient 获取指定的deployment资源信息:
func TestDynamicClient(t *testing.T) {
conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
t.Fatal(err)
}
client, err := dynamic.NewForConfig(conf)
if err != nil {
t.Fatal(err)
}
unst, err := client.Resource(schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}).
Namespace("rook-ceph").Get(context.TODO(), "rook-ceph-operator", metav1.GetOptions{})
if err != nil {
t.Fatal(err)
}
var deployment appsv1.Deployment
if err := runtime.DefaultUnstructuredConverter.FromUnstructured(unst.UnstructuredContent(), &deployment); err != nil {
t.Fatal(err)
}
t.Log(deployment)
}
DiscoveryClient 是用于查看当前 k8s 集群支持那些资源组、资源版本、资源信息,与以上3种客户端的功能不同。
使用DiscoveryClient 获取当前k8s集群所支持的gvr:
func TestDiscoveryClient(t *testing.T) {
conf, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
t.Fatal(err)
}
client, err := discovery.NewDiscoveryClientForConfig(conf)
if err != nil {
t.Fatal(err)
}
_, APIResourceList, err := client.ServerGroupsAndResources()
if err != nil {
t.Fatal(err)
}
for _, r := range APIResourceList {
gv, err := schema.ParseGroupVersion(r.GroupVersion)
if err != nil {
t.Fatal(err)
}
for _, resource := range r.APIResources {
t.Logf("name: %v, group: %v, version %v\n", resource.Name, gv.Group, gv.Version)
}
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。