Kubernetes GoClient类型

一、客户端类型

类型简介是否支持CRD资源所需信息
RestClient提供RestClient客户端,也是最基础的客户端。对Kubernetes API执行RESTFUL操作支持(gvr)
Group
Version
Resource
ClientSetrestClient进行了对象分类方式的封装,可以实例化特定资源的客户端。
ResourceVersion的方式暴露。
例如实例化一个只操作appv1版本的Deploy客户端。 ClientSet可以认为是一系列资源的集合客户端
不支持(gvr)
Group
Version
Resource
DynamicClient这是一种动态的客户端,对k8s任意资源进行操作,包括CRD
请求返回的结果是 map[string]interface{}
支持(gvr)
Group
Version
Resource
DiscoveryClient发现客户端,在前面的客户端中需要知道资源的ResourceVersion才能找到你想要的,这些信息太多很难全部记住,这个客户端用于获取资源组、版本等信息

二、客户端使用

2.1 RestClient

获取node信息

// 最基础的客户端,对HTTP Request进行了封装,实现了RESTFul风格的API。

package main

import (
	"fmt"
	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"
	"context"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("", "/Users/xianyuluo/.kube/config-dev")
	if err != nil {
		panic(err.Error())
	}

	config.APIPath = "api"
	config.GroupVersion = &corev1.SchemeGroupVersion
	config.NegotiatedSerializer = scheme.Codecs

	restClient, err := rest.RESTClientFor(config)
	if err != nil {
		panic(err.Error())
	}

	result := &corev1.NodeList{}
	err = restClient.Get().Namespace("").Resource("nodes").VersionedParams(
		&metav1.ListOptions{Limit: 100}, scheme.ParameterCodec).Do(context.TODO()).Into(result)
	if err != nil {
		panic(err.Error())
	}

	for _, d := range result.Items {
		fmt.Printf("Node name is %s \n", d.Name)
	}
}

2.2 ClientSet

获取pod列表和service列表

package main

import (
	"context"
	"fmt"
	apiv1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("", "/Users/xianyuluo/.kube/config-dev")
	if err !=  nil {
		panic(err)
	}

	clientSet, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err)
	}

	podClient := clientSet.CoreV1().Pods(apiv1.NamespaceAll)
	list, err := podClient.List(context.TODO(), metav1.ListOptions{Limit: 500})
	if err != nil {
		panic(err)
	}
	for _, pod := range list.Items {
		if pod.Name == ""{
			fmt.Println("%s pod name is null!", pod)
		}
		fmt.Print("NAME: %s", pod.Name)
	}

	svcClient := clientSet.CoreV1().Services("website-operator-system")
	svcList, err := svcClient.List(context.TODO(), metav1.ListOptions{Limit: 100})
	if err != nil {
		panic(err)
	}
	for _, svc := range svcList.Items {
		fmt.Println("SvcName: \t")
		fmt.Println(svc.Name)
	}

}

2.3 DynamicClient

获取pod列表和指定的CRD资源

package main

import (
	"context"
	"fmt"
	corev1 "k8s.io/api/core/v1"
	apiv1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/tools/clientcmd"
)

func main()  {
	config, err := clientcmd.BuildConfigFromFlags("", "/Users/xianyuluo/.kube/config-dev")
	if err != nil {
		panic(err.Error())
	}

	dynamicClient, err := dynamic.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	gvr := schema.GroupVersionResource{Version: "v1", Resource: "pods"}
	unstructObj, err := dynamicClient.Resource(gvr).Namespace(apiv1.NamespaceAll).List(context.TODO(), metav1.ListOptions{Limit: 100})
	if err != nil {
		panic(err.Error())
	}

	podList := &corev1.PodList{}
	err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(), podList)
	if err != nil {
		panic(err.Error())
	}

	for _, pod := range podList.Items {
		fmt.Println(pod.Namespace, pod.Name)
	}

	// 获取CRD资源
	websiteGvr := schema.GroupVersionResource{Version: "v1", Resource: "Website", Group: "website.xianyuluo.com"}
	websiteUnstructObj, _ := dynamicClient.Resource(websiteGvr).Namespace("website-operator-system").List(context.TODO(), metav1.ListOptions{Limit: 100})
	fmt.Println(websiteUnstructObj)
}

2.4 DiscoverClient

获取所有的GVR

package main

import (
	"fmt"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/client-go/discovery"
	"k8s.io/client-go/tools/clientcmd"
)

func main()  {
	config, err := clientcmd.BuildConfigFromFlags("","/Users/xianyuluo/.kube/config-dev")
	if err != nil {
		panic(err.Error())
	}

	discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
	if err != nil {
		panic(err.Error())
	}

	_, APIResourceList, err := discoveryClient.ServerGroupsAndResources()
	if err != nil {
		panic(err.Error())
	}
	for _, list := range APIResourceList {
		gv, err := schema.ParseGroupVersion(list.GroupVersion)
		if err != nil {
			panic(err.Error())
		}
		for _, resource := range list.APIResources {
			fmt.Printf("name: %v, group: %v, version %v\n", resource.Name, gv.Group, gv.Version)
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值