1. 程式人生 > >Kubernetes Resource實現監控功能_Kubernetes中文社群

Kubernetes Resource實現監控功能_Kubernetes中文社群

Kubernetes Resource實現監控功能:

Kubernetes有一個之前系統用來做很多工作的REST-ish HTTP API。這個API是開放的,而且文件十分齊全,很容易整合,可以從程式碼方面管理叢集。然而這個API還有一個不直接對映到HTTP的概念:WATCH。resource有任何的修改,它就會通知API使用者。

WATCH請求剖析

從Python使用Kubernetes API,如果使用Request庫的話,就十分輕鬆。API執行得十分好,總是使用並且返回JSON訊息。但是發行watch請求就變得複雜多了。發一個watch請求理論上有兩種方法:一個是用流傳輸結果的普通HTTP請求,同時使用分塊編碼;另一種方法是使用websockets。不幸的是,當測試Kubernetes1.1 master的時候,並沒有正確地使用websocket協議,所以使用流傳輸結果才是正確的方法。

當使用分塊編碼流傳輸的時候,Kubernetes master會通過傳送分塊的尺寸開始傳輸分塊。但是它不會發送一整個分塊,它只會傳送一行文字,再被一行新的文字終止。這行文字是JSON編碼物件,裡面還有event以及修改過的resource專案。所以協議是基於行的,而分塊編碼只是當結果可得的時候一個用來分流這些結果的方法。從表面上看用請求來做這個似乎不那麼難:

螢幕快照_2016-05-27_下午9.28_.40_.png

然而iter_lines方法並沒有按照你想要的方向來做,它保有一個外部緩衝,這個緩衝意味著你永遠都看不到最後一個event因為你還在等著填滿那個緩衝。
這個問題的提出意味著通過實施你自己的iter_lines()函式來使用原套socket,從迴應socket到讀取socket。很不幸,那個簡單的方法犯了一些錯誤。首先,它沒有正確地處理分塊編碼,描述分塊大小的八位元數會出現在輸出過程。但是更加重要的是,另一個緩衝層次正在繼續,一個你不能進行應急操作的緩衝層次。額外的緩衝是因為請求使用的是原始套接字的生成檔案方法從中讀取資料。這對於Requests來說就講得通了,Python標準庫和OS都擅長通過緩衝加速。然而這並不意味著在Requests解析了響應的標頭後,緩衝就已經不知道使用了響應本身多大的位元組,而且這些位元組無法檢索。所以使用Requests來使用watch API基本上不太可能。

手動進行HTTP

所以如何從Python使用watch API?通過自己發出請求和處理響應。這個做起來其實很簡單,socket程式設計其實沒那麼嚇人。首先,你需要連線socket到伺服器,然後傳送HTTP request。HTTP非常簡單,你只需要在socket上傳送一些標頭即可:

螢幕快照_2016-05-27_下午9.29_.17_.png

注意,Host標頭被Kubernetes master要求用來接受request。
解析HTTP響應稍微有點複雜。然而http-parser庫實施HTTP解析方面的東西的時候,沒有涉及到sockets或者任何類似於網路的東西。所以我們可以輕鬆地讀取和解析響應:

螢幕快照_2016-05-27_下午9.29_.46_.png

現在我們來響應已經被解析的標頭。很可能,一些本體資料已經接收到了,這很棒,這些本體資料在解析器中仍處於緩衝好的的狀態,直到我們檢索它。但是首先讓我們來保持讀取資料,直到沒有剩下的為止(不要在生產過程中這麼做,對你的儲存系統不好)。

螢幕快照_2016-05-27_下午9.30_.11_.png

上圖展示瞭如何使用select在資料可得的時候只讀資料,而不是先阻斷,然後使資料再次可讀。當然,一旦使用了所有的資料,Kubernetes master 可能就會發送下一版本更新到PodList,但是讓我們現在先來讀一下接收到的events:

螢幕快照_2016-05-27_下午9.30_.42_.png

就是它!如果資料接收截至在換行符,然後lines.split() 呼叫會回到一個空的字串(b”)作為最後一個專案。如果資料沒有在一個新的換行符那裡結束,那麼一個未完成的event會被接收,這樣當我們獲得其它資料的時候我們就需要儲存下來。

結論

所以為了正確地使用Kubernetes watch API呼叫的響應,你需要建立你自己的socket連線,並且解析HTTP響應。很幸運,這並沒有想象得那麼難。你並不需要全部自己來寫!我們已經都實施過了,而且更多資訊在我們的kube專案裡,這也給我們提供了一個相當好的被包裝成一個迭代器API的安裝啟用。Kube本身仍然需要更多的新功能,但是watch功能的實現已經十分有用了。