Istio內置的部分適配器以及相應功能舉例如下:
-
circonus:微服務監控分析平台。
-
cloudwatch:針對AWS雲資源監控的工具。
-
fluentd:開源的日志采集工具。
-
prometheus:開源的時序數據庫,非常適合用來存儲監控指標數據。
-
statsd:采集匯總應用指標的工具。
-
stdio:使Istio能將日志和metrics輸出到本地,結合內置的ES、Grafana就可以查看相應的日志或指標了。
現在我們將逐步向您介紹如何在Mixer中開發、測試和集成一個簡單的適配器。該適配器可以支持Mixer附帶的metric模板,並且對於每一個請求,在請求時將從Mixer接收的數據打印到文件中去。
完成本次實例的開發部署與編譯運行總共只需要幾步,大約需時30分鍾。所以通過本實例,您只需要短短半個小時就可以掌握一個adpater適配器的開發運行過程,是不是很easy?那我們現在就開始吧!
因篇幅有限,只截取關鍵代碼(后續代碼模塊皆為關鍵代碼)如下所示,它定義了適配器Builder和Handler類型以及處理metric的業務邏輯接口。雖然還沒有實現業務處理,但我們不妨通過下圖先了解一下adapter的代碼結構。
var _ metric.HandlerBuilder = &builder{} var _ metric.Handler = &handler{} func (b *builder) Build(ctx context.Context, env adapter.Env) (adapter.Handler, error) { return &handler{}, nil } func (h *handler) HandleMetric(ctx context.Context, insts []*metric.Instance) error { return nil }
但是二者必不可少。Builder的功能類似於構造器,可以通過加載相關參數(比如從配置文件中直接讀取)生成一個Handler,而Handler是配置好的Adapter的實例。后者可以參與處理metric業務。
如上所示現在我們有了一個適配器的基本框架,其中包含HandleMetric接口的空實現。HandlerMetric是適配器中處理業務邏輯的實現方法也是核心方法,在該方法中我們可以將收集到的metric進行數據處理然后上報出去,后台的程序接收到這些處理后的metric數據就可以進行相應數據監控和分析了。在后面的步驟中將添加此適配器的核心代碼。
適配器配置
適配器要發揮特定的作用,必須要對其做相應的配置處理。由於在本次實踐中我們只是將通過將從Mixer接收的數據打印到文件中來演示一下adapter的功能。因此適配器需要將文件的路徑作為配置字段,在config目錄下創建配置proto文件。
config.proto文件是一個專門用來配置適配器參數的文件,在該文件中我們可以設置testAdapter.go中需要用到的所有配置信息比如緩存大小、發生計時器大小等,但是一定要注意proto中每行代碼都需要注釋,后面的yaml文件也可以從該文件中讀取參數。編寫完成后,用go generate ./ …指令可以進行編譯並生成相應go文件。現在讓我們將config.proto文件生成相應的go文件。然后我們可以輸入如下指令來編譯調試proto文件。
go generate ./... go build ./...
配置完proto文件,咱們還需要配置yaml文件。不同的adapter具有不同的attributes,yaml用模板的形式定義了attributes到adapter輸入數據映射的schema,一個適配器可以支持多個模板。而Mixer的yaml配置可以看成是三種模型的模板集成到一個文件下,分別是Handler、Instance和Rule。
這三種模型分別具有什么樣的功能呢?
Handler是配置好的Adpater的實例,它從yaml配置文件中取出adapter需要的配置數據。
Instance定義了attributes到adapter輸入的映射。
Rule定義了一個特定的Instance何時調用一個特定的Handler。
三種模型通過yaml中的kind進行區分。要讓適配器工作起來,我們必然需要配置yaml來將attributes映射到adapter里面。所以,讓我們給Mixer編寫一個簡單的yaml配置,以便將數據發送到您的適配器。我們需要將實例,處理程序和規則配置傳遞給Mixer服務器。當然我們本次實踐主要是為了進行一個adapter端到端的演示,所以一個完整的輸出到文件中的metric應該還需要指定它的輸出路徑。
通過配置文件在對應的文件中打印實例和關聯的類型信息,這需要在配置時存儲metric標准類型信息並在請求時使用它。要添加此功能,需要在文件testAdapter.go中加入相應業務邏輯處理的代碼。如下所示:
func (h *handler) HandleMetric(ctx context.Context, insts []*metric.Instance) error { for _, inst := range insts { if _, ok := h.metricTypes[inst.Name]; !ok { h.env.Logger().Errorf("Cannot find type %s",inst.Name) continue } h.f.WriteString(fmt.Sprintf(`HandleMetric invoke for : Instance Name :'%s' Instance Value : %v, Type : %v`, inst.Name, *inst, *h.metricTypes[inst.Name])) } return nil }
然后編譯就可以了,這樣就完成了適配器代碼的實現部分。那么適配器是如何在Mixer中進行工作以及我們如何驗證所編寫的代碼做了哪些事呢?下面的步驟將告訴你答案。
將適配器插入Mixer中
適配器開發完以后,我們還需要將適配器插入進Mixer中,首先要更新inventory.yaml文件並且將新的適配器添加到Mixer的適配器注冊列表中。通過go generate命令在/adapter目錄中運行來重新生成庫存代碼。到這里您的適配器已經插入到Mixer中並已經准備好接收數據。
本地驗證適配器
以上工作做完以后,我們就可以在本地進行端到端的驗證了。啟動Mixer終端將會輸出相應信息,並處於等待服務請求狀態。
現在讓我們使用Mixer客戶端調用report請求。在這里我們需要Mixer服務器使用yaml構造的實例對象調用樣例adapter。並啟動一個新的終端窗口。在新窗口中調用命令:
tail $ ISTIO /istio/cloud.txttail $ ISTIO /istio/cloud.txt
執行完以后檢查cloud.txt文件,就會看到相應的打印信息。
如何將Mixer集成到K8S環境中運行調試
在上面我們僅向大家演示了如何在本地測試自己開發的adapter。我想大家對於Istio充滿熱情的很大原因都是因為其可以部署集成到Kubernates(K8S)環境中運行。那么今天正好可以向您介紹如何將Mixer打包成鏡像在K8S集群節點上運行調試。
在這里我們需要再回顧一下yaml文件,yaml文件可以完美的將我們需要上報的參數傳遞給k8s,在這里我們以一個流量監控的案例來簡單描述一下adapter怎樣與K8S協作運行。如下圖所示:
首先定義一個用來計數的metric,它會根據我們定義的參數去采集相應數據,例如命名空間等,這些都將會傳遞到K8S中,還會將自己的value屬性傳遞進HandlerMetric業務邏輯中,在HandlerMetric中我們就可以通過它的屬性“1”來進行一個請求計數,從而實現流量監控的功能。
定義完了metric,我們還需要定義一個Handler來處理這個metric,如下所示:
在這個handler中我們將去處理COUTER類型的metric並獲取其上報上來的參數,然后上報到指定的ip地址(自己根據需要設置)、集群等等。最后我們還需要在yaml中定義一個規則去調度使用你的handler,如下所示:
通過以上我們可以很清晰的看到。Mixer與K8S直接是通過上述yaml文件定義的參數來實現無縫銜接的集成部署。定義完yaml,我們還需要將其部署到heml文件夾下,如下圖所示的目錄中:
並且將上述yaml中的內容配置到該文件夾下的config.yaml中,這樣當在界面上安裝Istio控制面的時候,適配器上報過來的環境變量就會自動注入K8S的環境中。進而可以實現Mixer在K8S環境中的集成部署。接下來我們就可以將Mixer下的文件編譯成二進制文件,然后制作成鏡像,將鏡像輸出為tar包。通過遠程登錄命令ssh到自己的集群節點上,然后將鏡像拷貝到環境上。到這里,如果你在pod列表中看到我們剛剛自己創建的鏡像名,那么就表示我們的適配器已經成功部署到K8S環境中了。然后可以通過kubectl來查看日志了解自己的適配器工作情況。