天天看點

帶你讀《雲原生應用開發 Operator原理與實踐》第二章 Operator 原理2.2Client-go 原理(三)

2.2.2         Client-go主體結構

Client-go 共支援 4 種與 Kubernetes APIServer互動的用戶端邏輯,如圖 2-4所示。

(1)  RESTClient:最基礎的用戶端,它主要對 HTTP請求進行了封裝,并且支援JSON和Protobuf格式資料。

(2)  DiscoveryClient:發現用戶端,發現API- Server   支援的資源組、資源版本和資源資訊。如 Kubectl Api-Versions 。

(3) ClientSet:Kubernetes自身内置資源的用戶端集合,僅能操作已知類型的内置資源,如Pods、Service 等。

帶你讀《雲原生應用開發 Operator原理與實踐》第二章 Operator 原理2.2Client-go 原理(三)

                     圖2—4   Cient互動圖

(4)  DynamicClient:動态用戶端,可以對任意的 Kubernetes 資源執行通用操作,包括 CRD。

1. RESTClient

RESTClient是所有用戶端的父類,RESTClient提供的 RESTful方法(如 Get()、Put()、Post()、Delete() 等 )與KubernetesAPIServer進 行 交 互,ClientSet、DynamicClient和DiscoveryClient等也都是基于 RESTClient 二次開發實作的。是以,RESTClient可以操作Kubernetes自身内置的原生資源以及 CRD。

前面Example,目錄中的out-of-cluster-client-configuration  示例,用RESTClient實作的代碼見代碼清單 2-10。

packagemain

import(

"context""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"

)

funcmain(){

//加載配置⽂件,⽣成 config對象

config,err:=clientcmd.BuildConfigFromFlags("","/root/.kube/config")

iferr!=nil{

panic(err.Error())

}

//配置 API路徑和請求的資源組 /資源版本資訊

config.APIPath="api"

config.GroupVersion=&corev1.SchemeGroupVersion

//配置資料的編解碼器

config.NegotiatedSerializer=scheme.Codecs

//執行個體化RESTClient對象

restClient,err:=rest.RESTClientFor(config)

//預設傳回值存放對象

result:=&corev1.PodList{}

//Get⽅法設定HTTP請求⽅法 ;Namespace⽅法設定操作的命名空間

//Resource⽅法設定操作的資源類型 ;VersionedParams⽅法設定請求的查詢參數

//Do⽅法發起請求并⽤Into⽅法将APIServer傳回的結果寫⼊Result變量中

err=restClient.Get().

Namespace("default").Resource("pods").

VersionedParams(&metav1.ListOptions{Limit:100},scheme.ParameterCodec).Do(context.TODO()).

Into(result)

iferr!=nil{panic(err)

//列印Pod資訊

for _,d:=rangeresult.Items{fmt.Printf(

"NAMESPACE:%v\tNAME:%v\tSTATUS:%v\n",

d.Namespace,d.Name,d.Status.Phase,

運作以上代碼,會獲得命名空間 Default下的所有 Pod 資源的相關資訊,部分資訊列印輸出見代碼清單 2-11。

# 運⾏輸出

NAMESPACE:default          NAME:nginx-deployment-6b474476c4-lpld7

STATUS:Running

NAMESPACE:default          NAME:nginx-deployment-6b474476c4-t6xl4

RESTClient 實際上是對 KubernetesAPIServer的 RESTfulAPI 的通路進行了封裝抽象,底層調用的是 Go語言 Net/Http庫。

分析 RESTClient發起請求的過程如下。

(1)      Get方法傳回Request類型對象(見代碼清單2-12)。

//GetbeginsaGETrequest.Shortforc.Verb("GET").func(c*RESTClient)Get()*Request{

returnc.Verb("GET")

(2)      Request結構體對象用于建構通路 APIServer的請求, 示例中依次調用的Namespace、Resource、VersionedParams、Do等方法都是 Request結構體的方法,最終Do方法中r.request 發起請求,r.transformResponse将 APIServer 的傳回值解析成corev1.PodList類型對象,即示例中的Result變量(見代碼清單2-13)。

func(r*Request)Do(ctxcontext.Context)Result{varresultResult

err:=r.request(ctx,func(req*http.Request,resp*http.Response){result=r.transformResponse(resp,req)

})

//...