k8s Client 类型

  • RestClient: 最基础的客户端,提供最基本的封装
  • Clientset: 是一个Client的集合,在Clientset中包含了所有k8s内置资源的client,通过Clientset便可以很方便操作PodService等这些资源
  • DynamicClient: 动态客户端,可以操作任意k8s的资源,包括CRD定义的资源
  • DiscoveryClient: 用于发现k8s提供的资源组、资源版本和资源信息,比如kubectl api-resources

RestClient的使用

  • RestClientFor: 为创建RESTClient准备config,比如编解器限速器
  • UnversionedRESTClientFor: 与RestClientFor类似,只是允许config.GroupVersion为空

RestClientFor指定namespace获取pods

package main

import (
	"context"
	"fmt"

	v1 "k8s.io/api/core/v1"
	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {

	// config
	config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
	if err != nil {
		panic(err)
	}
	config.GroupVersion = &v1.SchemeGroupVersion
	config.NegotiatedSerializer = scheme.Codecs
	config.APIPath = "/api"

	// client
	clientFor, err := rest.RESTClientFor(config)
	if err != nil {
		panic(err)
	}

	// get data
	var pods = v1.PodList{}
	if err = clientFor.Get().Namespace("kube-system").Resource("pods").Do(context.Background()).Into(&pods); err != nil {
		panic(err)
	}

	for _, item := range pods.Items {
		fmt.Println(item.Name)
	}
}

Clientset使用

通过*rest.Config参数和NewForConfig方法来获取clientset对象,clientset是多个client的集合,每个client可能包含不同版本的方法调用

package main

import (
	"context"
	"fmt"

	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("", clientcmd.RecommendedHomeFile)
	if err != nil {
		panic(err)
	}

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

	list, err := clientset.CoreV1().Pods("kube-system").List(context.Background(), metav1.ListOptions{})
	if err != nil {
		panic(err)
	}

	for _, item := range list.Items {
		fmt.Println(item.Name)
	}
}

DynamicClient

package main

import (
	"context"
	"fmt"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
	if err != nil {
		panic(err)
	}

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

	resource := schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}
	list, err := dynamicClient.Resource(resource).Namespace("kube-system").List(context.Background(), metav1.ListOptions{})
	if err != nil {
		panic(err)
	}

	for _, item := range list.Items {
		fmt.Println(item.GetName())
	}
}

DiscoveryClient

package main

import (
	"fmt"

	"k8s.io/client-go/discovery"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
	if err != nil {
		panic(err)
	}

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

	resources, err := discoveryClient.ServerPreferredNamespacedResources()
	if err != nil {
		panic(err)
	}

	for _, res := range resources {
		for _, apiResource := range res.APIResources {
			fmt.Println(apiResource.Name)
		}
	}
}