東坡下載:內(nèi)容最豐富最安全的下載站!

首頁IT技術(shù)常見問題 → Kubernetes Resource 監(jiān)控怎么做 Kubernetes Resource 監(jiān)控實(shí)現(xiàn)原理

Kubernetes Resource 監(jiān)控怎么做 Kubernetes Resource 監(jiān)控實(shí)現(xiàn)原理

相關(guān)文章發(fā)表評論 來源:本站整理時(shí)間:2017/10/16 17:54:27字體大。A-A+

更多

作者:專題點(diǎn)擊:24次評論:0次標(biāo)簽: KubernetesResource

Kubernetes有一個(gè)之前系統(tǒng)用來做很多工作的REST-ish HTTP API。這個(gè)API是開放的,而且文檔十分齊全,很容易整合,可以從代碼方面管理集群。然而這個(gè)API還有一個(gè)不直接映射到HTTP的概念:WATCH。resource有任何的修改,它就會(huì)通知API用戶。

WATCH請求剖析

從Python使用Kubernetes API,如果使用Request庫的話,就十分輕松。API運(yùn)行得十分好,總是使用并且返回JSON消息。但是發(fā)行watch請求就變得復(fù)雜多了。發(fā)一個(gè)watch請求理論上有兩種方法:一個(gè)是用流傳輸結(jié)果的普通HTTP請求,同時(shí)使用分塊編碼;另一種方法是使用websockets。不幸的是,當(dāng)測試Kubernetes1.1 master的時(shí)候,并沒有正確地使用websocket協(xié)議,所以使用流傳輸結(jié)果才是正確的方法。

當(dāng)使用分塊編碼流傳輸?shù)臅r(shí)候,Kubernetes master會(huì)通過發(fā)送分塊的尺寸開始傳輸分塊。但是它不會(huì)發(fā)送一整個(gè)分塊,它只會(huì)發(fā)送一行文本,再被一行新的文本終止。這行文本是JSON編碼對象,里面還有event以及修改過的resource項(xiàng)目。所以協(xié)議是基于行的,而分塊編碼只是當(dāng)結(jié)果可得的時(shí)候一個(gè)用來分流這些結(jié)果的方法。從表面上看用請求來做這個(gè)似乎不那么難:

然而iter_lines方法并沒有按照你想要的方向來做,它保有一個(gè)外部緩沖,這個(gè)緩沖意味著你永遠(yuǎn)都看不到最后一個(gè)event因?yàn)槟氵在等著填滿那個(gè)緩沖。
這個(gè)問題的提出意味著通過實(shí)施你自己的iter_lines()函數(shù)來使用原套socket,從回應(yīng)socket到讀取socket。很不幸,那個(gè)簡單的方法犯了一些錯(cuò)誤。首先,它沒有正確地處理分塊編碼,描述分塊大小的八位元數(shù)會(huì)出現(xiàn)在輸出過程。但是更加重要的是,另一個(gè)緩沖層次正在繼續(xù),一個(gè)你不能進(jìn)行應(yīng)急操作的緩沖層次。額外的緩沖是因?yàn)檎埱笫褂玫氖窃继捉幼值纳晌募椒◤闹凶x取數(shù)據(jù)。這對于Requests來說就講得通了,Python標(biāo)準(zhǔn)庫和OS都擅長通過緩沖加速。然而這并不意味著在Requests解析了響應(yīng)的標(biāo)頭后,緩沖就已經(jīng)不知道使用了響應(yīng)本身多大的字節(jié),而且這些字節(jié)無法檢索。所以使用Requests來使用watch API基本上不太可能。

手動(dòng)進(jìn)行HTTP

所以如何從Python使用watch API?通過自己發(fā)出請求和處理響應(yīng)。這個(gè)做起來其實(shí)很簡單,socket編程其實(shí)沒那么嚇人。首先,你需要連接socket到服務(wù)器,然后發(fā)送HTTP request。HTTP非常簡單,你只需要在socket上發(fā)送一些標(biāo)頭即可:

注意,Host標(biāo)頭被Kubernetes master要求用來接受request。
解析HTTP響應(yīng)稍微有點(diǎn)復(fù)雜。然而http-parser庫實(shí)施HTTP解析方面的東西的時(shí)候,沒有涉及到sockets或者任何類似于網(wǎng)絡(luò)的東西。所以我們可以輕松地讀取和解析響應(yīng):

現(xiàn)在我們來響應(yīng)已經(jīng)被解析的標(biāo)頭。很可能,一些本體數(shù)據(jù)已經(jīng)接收到了,這很棒,這些本體數(shù)據(jù)在解析器中仍處于緩沖好的的狀態(tài),直到我們檢索它。但是首先讓我們來保持讀取數(shù)據(jù),直到?jīng)]有剩下的為止(不要在生產(chǎn)過程中這么做,對你的存儲(chǔ)系統(tǒng)不好)。

上圖展示了如何使用select在數(shù)據(jù)可得的時(shí)候只讀數(shù)據(jù),而不是先阻斷,然后使數(shù)據(jù)再次可讀。當(dāng)然,一旦使用了所有的數(shù)據(jù),Kubernetes master 可能就會(huì)發(fā)送下一版本更新到PodList,但是讓我們現(xiàn)在先來讀一下接收到的events:

就是它!如果數(shù)據(jù)接收截至在換行符,然后lines.split() 調(diào)用會(huì)回到一個(gè)空的字符串(b”)作為最后一個(gè)項(xiàng)目。如果數(shù)據(jù)沒有在一個(gè)新的換行符那里結(jié)束,那么一個(gè)未完成的event會(huì)被接收,這樣當(dāng)我們獲得其它數(shù)據(jù)的時(shí)候我們就需要保存下來。

擴(kuò)展知識(shí)

相關(guān)評論

閱讀本文后您有什么感想? 已有 人給出評價(jià)!

  • 2791 喜歡喜歡
  • 2101 頂
  • 800 難過難過
  • 1219 囧
  • 4049 圍觀圍觀
  • 5602 無聊無聊
熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)