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)
		}
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM