Istio技術與實踐04:最佳實踐之教你寫一個完整的Mixer Adapter


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,一個適配器可以支持多個模板。而Mixeryaml配置可以看成是三種模型的模板集成到一個文件下,分別是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來查看日志了解自己的適配器工作情況。


免責聲明!

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



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