k8s集羣多容器Pod和資源共享

Pod 是可以在 Kubernetes 中創建和管理的、最小的可部署的計算單元。Pod (就像在鯨魚莢或者豌豆莢中)是一組(一個或多個) 容器,這些容器共享存儲、網絡、以及怎樣運行這些容器的聲明。Pod中的所有容器是相對緊密的耦合在一起的,會被調度到同一個node節點上。
本文測試數據來自源Kubernetes 1.18版本。

k8s的最小可調度單元

如果選擇容器作爲k8s的最小可調度單元,那麼容器的健康檢測,多個耦合性強的容器的調度,多容器之間的資源共享就比較麻煩了。而使用Pod這個虛擬的最小可調度單元,可以完美解決如上問題。具體對比如下:

  • Pod

    1. 多container共享網絡、存儲
    2. 一個Pod可以運行耦合性強的多個container,而不必把多應用全塞到一個container中
    3. 方便監控,我們可以對Pod中的多個容器單獨設置不同的健康檢查,記錄日誌及分析
    4. 不用擔心單個容器內多進程,其某個進程崩潰導致整個容器掛掉的情況
  • Container:
    1. 容器設計理念是一個容器只運行一個主進程(其產生的子進程不算)
    2. 單個容器,與其它container是”完全隔離”的
    3. 常規情況下,無法與其它容器共享網絡、存儲。只能通過expose的端口進行相互訪問

Pod中容器的類型

臨時容器ephemeralcontainers

臨時容器處於早期的 alpha 階段,不適用於生產環境集羣。一種特殊的容器,該容器在現有 Pod 中臨時運行,以便完成用戶發起的操作,例如故障排查。 你會使用臨時容器來檢查服務,而不是用它來構建應用程序。

目前,在k8s 1.18上沒有成功使用此容器。具體參考文檔見:https://kubernetes.io/zh/docs/concepts/workloads/pods/ephemeral-containers/
https://kubernetes.io/zh/docs/tasks/debug-application-cluster/debug-running-pod/
https://www.shogan.co.uk/kubernetes/enabling-and-using-ephemeral-containers-on-kubernetes-1-16/
https://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 初始化應用容器並像平常一樣運行。

使用場景
  1. Init 容器可以包含一些安裝過程中應用容器中不存在的實用工具或個性化代碼。 例如,沒有必要僅爲了在安裝過程中使用類似 sed、awk、python 或 dig 這樣的工具而去 FROM 一個鏡像來生成一個新的鏡像。Init 容器可以安全地運行這些工具,避免這些工具導致應用鏡像的安全性降低。

  2. 應用鏡像的創建者和部署者可以各自獨立工作,而沒有必要聯合構建一個單獨的應用鏡像。

  3. Init 容器能以不同於 Pod 內應用容器的文件系統視圖運行。因此,Init 容器可以訪問 應用容器不能訪問的 Secret 的權限。

  4. 由於 Init 容器必須在應用容器啓動之前運行完成,因此 Init 容器 提供了一種機制來阻塞或延遲應用容器的啓動,直到滿足了一組先決條件。 一旦前置條件滿足,Pod 內的所有的應用容器會並行啓動。

sidecar

在一個Pod中,某個Container運行主要業務的同時,需要另一個Container協同 ——這是一個常見的業務場景,這個協同Container通常稱爲Sidecar。 主要的Container在運行時,Sidecar需要已經就緒;而當主要的Container停止後,Sidecar也需要停止。

一般有緊密聯繫的容器會在同一個Pod中運行。目前,最新k8s官方的最新穩定版本還沒有原生支持sidecar功能。

使用場景
  1. 日誌代理/轉發,例如fluentd
  2. 代理,比如 Docker Ambassador
  3. 探活:檢查某些組件是不是正常工作
  4. 其他輔助性的工作,比如拷貝文件,下載文件等;

應用容器

Pod中的主容器,主要來運行服務的主要業務邏輯

Pod中的容器特點

啓動順序

Pod 內容器的啓動順序按照:初始化容器->Sidecar 容器->業務容器

資源共享

  1. 默認共享網絡,MNT卷存儲,IPC,UTS
  2. 通過配置ShareProcessNamespace實現共享進程namespace
    https://v1-18.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/share-process-namespace/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章