1. 程式人生 > >Pod 在微服務中的運用

Pod 在微服務中的運用

本文主要包括 Pod 的基本概念、使用場景,以及如何在時速雲平臺上進行 Pod 的編排部署,希望對大家在進行微服務架構實踐時有所幫助。

1.我們先來看一下 Pod 的基本特性

Pod 是 Kubernetes 為部署、管理、編排容器化應用提出的概念,也是 Kubernetes 中的最小部署單元,直譯過來的意思是“豆莢”,既簡單又實用。

請輸入圖片名稱

Pod 是由一組緊耦合的容器組成的容器組,當然目前最流行的就是 Docker 容器, Pod 就可以作為 1 或者多個 Docker 容器的載體,當然也支援 CoreOS 的 rkt ,並很容易擴充套件支援更多容器技術。

Pod 中的所用容器會被一致排程、同節點部署,並且在一個“共享環境”中執行。這裡的“共享環境”包括以下幾點:

1 )所有容器共享一個 IP 地址和埠空間,意味著容器之間可以通過 localhost 高效訪問,不能有埠衝突

2 )允許容器之間共享儲存卷,通過檔案系統互動資訊

3 )容器之間可以通過 IPC ( inter-process communication)進行通訊(目前這個 feature 還沒有實現,主要依賴於 Docker 對容器之間程序通訊的支援,在 Docker 社群有 issue track )

所以,如果按照每個 Docker 容器一個 process 的建議, Pod 則是支援多個關係緊密程序很好的方式,更像是一個容器化的虛擬機器。

Pod 也提供探針功能,對容器服務進行健康檢查,目前有兩種方式:

1 ) LivenessProbe,用來檢測服務是否正常執行,如果定義的規則失敗了,系統就會殺掉這個容器,預設情況下自動建立一個新的容器。

請輸入圖片名稱

比如一個容器服務對外提供 Restful Service ,服務可能會在某些情況下 hang 或者響應時間變長,我們就可以定義一個 URL 作為 health check ,一旦這個 URL 沒有正常響應,就認為需要重啟服務,這時候就可以使用 LivenessProbe 。

2 ) ReadinessProbe,用來標識容器是否準備好提供正常服務,如果沒有啟動完成檢測失敗,系統會將該服務節點從服務代理的列表中刪除,使用者的請求就不會路由到該節點了。 Pod 定義和 LivenessProbe 類似:

請輸入圖片名稱

在 Pod 的生命週期管理中,還提供了在容器啟動後(postStart) 和容器停止前(preStop)兩個 handler ,方便我們在這兩個事件上新增自定義的 hook 操作。

比如我們可以定義在容器建立後,先執行一條命令把自己的應用複製到 tomcat 的 webapps 下,那麼直到這個 hook 操作完成,才會進行容器啟動等後續操作。

請輸入圖片名稱

2.接下來,我們看看 Pod 有哪些主要的應用場景

Pod 可以用來承載垂直化的整合應用,比如 LAMP ,但是 Pod 的主要目的還是支援需要一起部署、一起管理的輔助程序,包括:

1 )內容管理系統,檔案和資料載入程序,本地 cache 管理程序等

2 )日誌壓縮、 rotation 、備份、快照等

3 )資料變化監聽、日誌和監控介面卡,事件分發等

4 )控制、管理、配置、升級程式

如果希望瞭解更多相關解釋,推薦一篇關於這種容器組的設計模式的文章,也是微服務架構中很重要的思想:

下面我們來看幾個實際的使用場景:

1 )業務服務需要收集日誌

請輸入圖片名稱

某服務模組已經實現了一些核心的業務邏輯,並且穩定運行了一段時間,日誌記錄在了某個目錄下,按照不同級別分別為 error.log 、 warning.log 、 info.log ,現在希望收集這些日誌併發送到統一的日誌處理伺服器上。

這時我們可以修改原來的服務模組,在其中新增日誌收集、傳送的服務,但這樣可能會影響原來服務的配置、部署方式,從而帶來不必要的問題和成本,也會增加業務邏輯和基礎服務的藕合度。

如果使用 Pod 的方式,通過簡單的編排,既可以保持原有服務邏輯、部署方式不變,又可以增加新的日誌收集服務。

而且如果我們對所有服務的日誌生成有一個統一的標準,或者僅對日誌收集服務稍加修改,就可以將日誌收集服務和其他服務進行 Pod 編排,提供統一、標準的日誌收集方式。

這裡的“核心業務服務”、“日誌收集服務”分別是一個 Docker 映象,執行在隔離的容器環境中。

2 )提供 ssh 、 ftp 訪問容器資料的能力

Docker Hub 或者很多第三方的映象並沒有安裝 sshd 的服務,不方便我們進入容器進行配置、程式碼的修改、除錯,很多時候需要重新構建映象、或者在映象基礎上安裝 sshd 的服務,這都需要時間和一定的學習成本。

而通過 Pod 的方式,我們就可以將現有映象和一個 ssh 、 ftp 映象進行編排,獲得操作容器內資料的能力。

請輸入圖片名稱

3 )程式碼自動更新

我們部署了一個 node.js 的應用,而且部署了幾十、上百個節點,那麼我希望這個應用可以定時的同步最新的程式碼,以便自動升級線上環境。

這時,我們當然也不希望改動原來的 node.js 應用,可以開發一個 Git 程式碼倉庫的自動同步服務,然後通過 Pod 的方式進行編排,並共享程式碼目錄,就可以達到更新 node.js 應用程式碼的效果。

並且這個同步服務還可以同其他使用 Git 程式碼倉庫的服務編排,實現同樣的需求。

請輸入圖片名稱

4 )適配不同 IaaS 平臺的環境

我們開發了一個節點管理的 agent ,這個 agent 需要讀取當前部署環境的一些資訊,可以通過底層平臺的 API 實現。

但是,當部署到 AWS 、阿里雲、青雲等不同平臺時, API 就無法統一了。這樣,我們可以實現不同平臺的適配服務來獲取各自的資訊,並且和 agent 通過 Pod 編排部署,在不改變 agent 邏輯的情況下,通過服務組合來適配於不同平臺。

請輸入圖片名稱

其實, Kubernetes 的一些新的功能需求,也會建議先通過 Pod 的編排來解決,而不是直接修改 Kubernetes 的程式碼,可見 Pod 還是用處多多的。

3.最後,我們一起看看如何在時速雲平臺上進行 Pod 的編排

1 )登入到時速雲公有云平臺,通過右側的導航,選擇“服務編排” -> “公有編排”,其中分為” Pod 編排“和“ Stack 編排”兩類,點選“ Pod 編排”可以看到官方示例” ubuntu-mysql ”,這個模版會將 ubuntu 和 mysql 兩個容器編排在一個 Pod 中。

2 )點選“部署”,可以預覽 yaml 格式的編排檔案:

請輸入圖片名稱

請輸入圖片名稱

其中關鍵是儲存卷的配置,我們需要提前建立這個儲存卷,並修改 yaml 中的 disk 屬性,以匹配自己的儲存卷。

如果我們需要修改儲存卷名稱,或者對其他映象進行編排,可以複製這個模版,建立自己的 Pod 編排。注意:目前只有北京 2 區、杭州區支援儲存卷功能,所以請在這兩個區建立儲存和部署 Pod 。

建立成功後,可以在容器服務的列表中看到一個“多容器服務”:

請輸入圖片名稱

點選“檢視所有服務地址”,可以看到對應的 mysql 和 ubuntu 的訪問地址。

通過 ssh 登陸到 22 埠對應的服務地址,就可以直接訪問到 mysql 的資料了。

請輸入圖片名稱

並且儲存卷中的資料會儲存在獨立的分散式儲存系統中,保證資料的安全和高可用。

詳細資訊可以參考官方文件:

所以,我們可以在很多實際的部署場景中充分發揮 Pod 的這些特性,將服務進行更細力度的拆分,通過編排增強服務模組,這樣既可以減少重複的開發工作,降低服務的藕合度,也可以使我們的系統更輕量、更靈活。

Q&A

1.問:關於“提供 ssh 、 ftp 訪問容器資料的能力”, pod 中包含一個業務 container 和一個 ssh 服務 container ,時速雲的控制檯可以進入到容器內部。那麼 ssh 進入的 container 只是提供 ssh 服務的 container ,好像也沒辦法 ssh 到業務 container 。

答:業務應用 Container 和 ssh 服務 container 共享資料儲存,可以通過 ssh 訪問共享儲存,這樣也避免了修改“業務應用”中的不可變執行環境。(參考“不可變基礎設施”)

請輸入圖片名稱

2.問: pod 和 swarm 的最大區別是什麼?我感覺差不多,是不是 Pod 更偏上層一些?

答:兩者沒有可比性。 Pod 只是一種容器的部署、管理方式,是 kubernetes 的最小部署和管理單元,是一組容器的集合; swarm 是容器編排工具,和 kubernetes 屬於同一類。

3.問:一個 pod 最好包含幾個容器?啟動 pod 的配置檔案裡面能不能定義容器的大小?

答: Pod 裡面多少個容器理論上沒有特別的限制,目前我們一般是 2-3 個。 Pod 裡面定義的容器,基本上就是對 Docker 容器的定義。 Pod 中支援 Docker 容器本身的絕大部分引數,比如 cpu 、 memory 、是否 privilege 、是否 root 等。 Pod 對 Docker 容器基本引數有所刪減,但從更高的層面進行了擴充套件。具體可以檢視 kubernetes 文件。

4.問: Pod 中定義容器時包括 pause 嗎

答:每個 Pod 都會附帶一個 pause 容器, pause 容器不執行實際的業務邏輯,只是對 pod 的網路、 IO 等進行控制。

5.問:時速雲對 docker hub 上的映象部署,也能提供 ssh 到容器內部的功能麼?我的理解是,“開啟 web 控制檯”是 ssh 到容器裡。

答:嗯, web 控制檯和 ssh 並不一樣。如果你使用 scp 、 sftp 傳送檔案,則需要容器內安裝 sshd 服務。

6.問: Pod 沒用過,不過用過 docker compose , 它們倆有什麼區別?

答: compose 不支援緊耦合的容器組,也不支援容器共享儲存。

7.問:能定義容器(磁碟)的大小嗎?如果有的話,在哪兒修改?

答: docker daemon 的引數包含磁碟的定義,指定 devicemapper 的 option 來改變預設大小。