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

語言: CN / TW / HK

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上沒有成功使用此容器。具體參考文件見: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 初始化應用容器並像平常一樣執行。

使用場景
  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
    http://v1-18.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/share-process-namespace/