k8s叢集多容器Pod和資源共享
Pod 是可以在 Kubernetes 中建立和管理的、最小的可部署的計算單元。Pod (就像在鯨魚莢或者豌豆莢中)是一組(一個或多個) 容器,這些容器共享儲存、網路、以及怎樣執行這些容器的宣告。Pod中的所有容器是相對緊密的耦合在一起的,會被排程到同一個node節點上。
本文測試資料來自源Kubernetes 1.18版本。
k8s的最小可排程單元
如果選擇容器作為k8s的最小可排程單元,那麼容器的健康檢測,多個耦合性強的容器的排程,多容器之間的資源共享就比較麻煩了。而使用Pod這個虛擬的最小可排程單元,可以完美解決如上問題。具體對比如下:
-
Pod
- 多container共享網路、儲存
- 一個Pod可以執行耦合性強的多個container,而不必把多應用全塞到一個container中
- 方便監控,我們可以對Pod中的多個容器單獨設定不同的健康檢查,記錄日誌及分析
- 不用擔心單個容器內多程序,其某個程序崩潰導致整個容器掛掉的情況
- Container:
- 容器設計理念是一個容器只執行一個主程序(其產生的子程序不算)
- 單個容器,與其它container是”完全隔離”的
- 常規情況下,無法與其它容器共享網路、儲存。只能通過expose的埠進行相互訪問
Pod中容器的型別
臨時容器ephemeralcontainers
臨時容器處於早期的 alpha 階段,不適用於生產環境叢集。一種特殊的容器,該容器在現有 Pod 中臨時執行,以便完成使用者發起的操作,例如故障排查。 你會使用臨時容器來檢查服務,而不是用它來構建應用程式。
目前,在k8s 1.18上沒有成功使用此容器。具體參考文件見:http://kubernetes.io/zh/docs/concepts/workloads/pods/ephemeral-containers/
http://kubernetes.io/zh/docs/tasks/debug-application-cluster/debug-running-pod/
http://www.shogan.co.uk/kubernetes/enabling-and-using-ephemeral-containers-on-kubernetes-1-16/
http://kubernetes.io/zh/docs/tasks/configure-pod-container/share-process-namespace/
使用場景
在主容器最小化容器映象構建的基礎上,主容器上會缺少很多排查問題的工具。故一旦主容器有問題需要排查,我們可以用臨時容器在共享程序空間的基礎上來排查問題。
init容器
Init 容器是一種特殊容器,在 Pod 內的應用容器啟動之前執行。Init 容器可以包括一些應用映象中不存在的實用工具和安裝指令碼。每個 Pod 中可以包含多個容器, 應用執行在這些容器裡面,同時 Pod 也可以有一個或多個先於應用容器啟動的 Init 容器。
Init 容器不支援 lifecycle、livenessProbe、readinessProbe 和 startupProbe, 因為它們必須在 Pod 就緒之前執行完成。如果為一個 Pod 指定了多個 Init 容器,這些容器會按順序逐個執行。 每個 Init 容器必須執行成功,下一個才能夠執行。當所有的 Init 容器執行完成時, Kubernetes 才會為 Pod 初始化應用容器並像平常一樣執行。
使用場景
-
Init 容器可以包含一些安裝過程中應用容器中不存在的實用工具或個性化程式碼。 例如,沒有必要僅為了在安裝過程中使用類似 sed、awk、python 或 dig 這樣的工具而去 FROM 一個映象來生成一個新的映象。Init 容器可以安全地執行這些工具,避免這些工具導致應用映象的安全性降低。
-
應用映象的建立者和部署者可以各自獨立工作,而沒有必要聯合構建一個單獨的應用映象。
-
Init 容器能以不同於 Pod 內應用容器的檔案系統檢視執行。因此,Init 容器可以訪問 應用容器不能訪問的 Secret 的許可權。
- 由於 Init 容器必須在應用容器啟動之前執行完成,因此 Init 容器 提供了一種機制來阻塞或延遲應用容器的啟動,直到滿足了一組先決條件。 一旦前置條件滿足,Pod 內的所有的應用容器會並行啟動。
sidecar
在一個Pod中,某個Container執行主要業務的同時,需要另一個Container協同 ——這是一個常見的業務場景,這個協同Container通常稱為Sidecar。 主要的Container在執行時,Sidecar需要已經就緒;而當主要的Container停止後,Sidecar也需要停止。
一般有緊密聯絡的容器會在同一個Pod中執行。目前,最新k8s官方的最新穩定版本還沒有原生支援sidecar功能。
使用場景
- 日誌代理/轉發,例如fluentd
- 代理,比如 Docker Ambassador
- 探活:檢查某些元件是不是正常工作
- 其他輔助性的工作,比如拷貝檔案,下載檔案等;
應用容器
Pod中的主容器,主要來執行服務的主要業務邏輯
Pod中的容器特點
啟動順序
Pod 內容器的啟動順序按照:初始化容器->Sidecar 容器->業務容器
資源共享
- 預設共享網路,MNT卷儲存,IPC,UTS
- 通過配置ShareProcessNamespace實現共享程序namespace
http://v1-18.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/share-process-namespace/
- Highcharts使用HTML表中的資料建立互動式圖表教程
- bzoj1529: [POI2005]ska Piggy banks(並查集)
- 深入剖析Java中的斷言assert
- Nacos 1.4.1 之前存在鑑權漏洞,建議修復到最新版
- 記憶體操作函式:memcpy函式,memove函式
- 微軟開源 Python 自動化神器 Playwright
- Web前端之HTML
- java class檔案安全加密工具
- 5G QoS和DNN以及網路切片技術
- 有獎問答獲獎名單出爐,快來看看有沒有你!
- IDEA Groovy指令碼一鍵生成實體類,用法舒服,高效!
- 微信api呼叫限制,45009 reach max api daily quota limit 解決方法
- OpenStack Placement元件
- 【Linux伺服器開發系列】手寫使用者態協議棧,udpipeth資料包的封裝,零拷貝的實現,柔性陣列
- requestAnimationFrame詳解
- k8s叢集多容器Pod和資源共享
- 梯度提升樹(GBDT)詳解之二:分類舉例
- Automatic Model Evaluation - 知乎
- Linux下IPMI iBMC遠端管理配置查詢及密碼重置
- 京東/淘寶的手機銷售榜(前4名 -- 手機品牌 --手機型號*3 --手機解析度 -- 手機作業系統 --安卓版本號)(android / IOS)