1. 程式人生 > >【原創】k8s原始碼分析------第三方庫etcd client分析

【原創】k8s原始碼分析------第三方庫etcd client分析

程式碼為github.com/coreos/go-etcd/etcd

注: 此版本為k8s v1.1.1 中所使用的etcd client。

首先我看下k8s中是如何使用的。位置在k8s.io\kubernetes\cmd\kube-apiserver\app\server.go


程式碼目錄,從這裡來看,程式碼還是非常清晰的


那麼我們就從此處入口,先看client.go

先看結構體


結構體裡面,比較重要的東西

1、cluster,叢集管理

2、httpclient,這個將是最終的入口

我們繼續


這裡面主要是初始化了cluster,httpclient

其中cluster後面再詳細介紹,這裡我們接著看httpclient



很明顯這裡就是構造了一個標準庫net/http中的Client

大致的初始化很簡單。其實還有一個tls的初始化。為NewTLSClient,對應的httpclient初始化為initHTTPSClient

下面我們看看etcd client都提供了那些操作。

Get操作

我們看get.go


很明顯,我們看到Get呼叫了RawGet,而RawGet呼叫了get

我們再跟蹤get

在request.go中


繼續getCancelable

還是在request.go中


主要有NewRawRequest。request.go中

其實就是對request的一些包裝,包含了一些引數


我們繼續看SendRequest。這個才是整個程式碼的核心


在下面我們看到這裡當RawRequest中的Cancel不為nil的時候,會啟動一個協程來接收cancel訊息。 但目前我們分析的Get是沒有設定的


我們繼續這裡有個for迴圈,attempt為嘗試次數統計,當成功則會退出for迴圈,失敗則會繼續嘗試。其中有個變數為httpPath是個關鍵


我們現在跟進去看看 requet.go中


我們看到了cluster,我們繼續跟進去看看


從上面的cluster的程式碼來看其實pick就是返回cluster中的一臺主機,而pick的機器則是一個隨機的主機,在初始化的時候有隨機,在failure的時候,又會重新隨機

我們回到之前的sendrequest


這裡主要的地方就是構造一個標準庫net/http中的Request

再繼續


我們看到我們之前提到的httpclient,接收剛剛構建的Request,然後Do。就是發起了http的請求。


進行校驗頭部,如果是正常的,則退出for迴圈

 

退出for迴圈之後,返回了一個RawResponse結構體

最後我們返回到


我們看到了結果

其實就是一個解碼的過程


至此Get操作就解析完了

還有一些操作如:

AddChildDir

其實跟蹤進去,最後也是到了SendRequest函式中


還有一些其他的操作,就不一一介紹了,其程式碼的流程是基本一致的。

龔浩華

qq 月牙寂 道長 29185807

2016年3月21日