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 等。
圖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)
})
//...