client-go 源码结构与客户端对象

client-go 源码结构

$ tree client-go/ -L 1
client-go/
├── discovery
├── dynamic
├── informers
├── kubernetes
├── listers
├── plugin
├── rest
├── scale
├── tools
├── transport
└── util
  • discovery:提供 DiscoveryClient 发现客户端
  • dynamic:提供 DynamicClient 动态客户端
  • informers:每种 kubernetes 资源的 Informer 实现
  • kubernetes:提供 ClientSet 客户端
  • listers:为每一个 Kubernetes 资源提供 Lister 功能,该功能对 Get 和 List 请求提供只读的缓存数据
  • plugin:提供 OpenStack、GCP 和 Azure 等云服务商授权插件
  • rest:提供 RESTClient 客户端,对 Kubernetes API Server 执行 RESTful 操作
  • scale:提供 ScaleClient 客户端,用于扩容或缩容 Deployment、ReplicaSet、Relication Controller 等资源对象
  • tools:提供常用工具,例如 SharedInformer、Reflector、DealtFIFO 及 Indexers。提供 Client 查询和缓存机制,以减少向 kube-apiserver 发起的请求数等
  • transport:提供安全的 TCP 连接,支持 Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如 exec、attach 等操作。该功能由内部的 spdy 包提供支持
  • util:提供常用方法,例如 WorkQueue 功能队列、Certificate 证书管理等

Client 客户端对象

client-go 支持四种客户端对象:

    ClientSet    DynamicClient    DiscoveryClient
        |              |                 |
        ▼              ▼                 ▼
 -------------------------------------------------
|                  RESTClient                     |
 -------------------------------------------------
                       |
                       ▼
 -------------------------------------------------
|                   kubeconfig                    |
 -------------------------------------------------

RESTClient 客户端

RESTClient 是最基础的客户端,是对 HTTP Request 进行了封装:

func main() {
  config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
  
  config.APIPath = "api"
  config.GroupVersion = &corev1.SchemeGroupVersion
  config.NegotiatedSerializer = scheme.Codecs
  
  restClient, err := rest.RESTClientFor(config)
  
  result := &corev1.PodList{}
  err = restClient.Get().
  Namespace("default").
  Resource("pods").
  VersionedParams(&metav1.ListOptions{Limit:500}, scheme.ParameterCodec).
  Do().
  Into(result)
}

ClientSet 客户端

ClientSet 在 RESTClient 的基础上封装了对 Resource 和 Version 的管理方法:

ClientSet 仅能访问 Kubernetes 自身内置的资源(即客户端集合内的资源),不能直接访问 CRD 自定义资源。

func main() {
  config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
  
  clientset, err := kubernetes.NewForConfig(config)
  
  podClient := clientset.CoreV1().Pods(apiv1.NamespaceDefault)
  
  list, err := podClient.List(metav1.ListOptions{Limit:500})
}

DynamicClient 客户端

DynamicClient 是一种动态客户端,它可对任意 Kubernetes 资源进行 RESTful 操作,包括 CRD 自定义资源。

package main

import (
	"fmt"

	apiv1 "k8s.io/api/core/v1"
	corev1 "k8s.io/api/core/v1"
	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"
	"k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/runtime"
)

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

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

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

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

	for _, d := range podList.Items {
		fmt.Printf("NAMESPACE: %v \t NAME:%v \t STATU: %+v\n",
			d.Namespace, d.Name, d.Status.Phase)
	}
}

DiscoveryClient 客户端

DiscoveryClient 主要用于发现 Kubernetes API Server 所支持的资源组、资源版本、资源信息。

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("", "~/.kube/config")
	if err != nil {
		panic(err)
	}

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

	_, APIResourceList, err := discoveryClient.ServerGroupsAndResources()
	if err != nil {
		panic(err)
	}

	for _, list := range APIResourceList {
		gv, err := schema.ParseGroupVersion(list.GroupVersion)
		if err != nil {
			panic(err)
		}
		for _, resource := range list.APIResources {
			fmt.Printf("name: %v, group: %v, version: %v\n",
				resource.Name, gv.Group, gv.Version)
		}
	}
}
posted @ 2020-08-09 20:06  季末的天堂  阅读(577)  评论(0编辑  收藏  举报