什麼是 Kubernetes 供應容器,什麼時候應該使用它們?
供應容器是用於供應新Pod 的 Kubernetes 機制。Init 容器在其 pod 的主應用程序容器之前啟動和關閉,從而允許引導腳本按順序運行。
在本文中,我們將向您展示如何將 init 容器添加到 pod 並查看一些常見用例。儘管 init 容器的配置與普通容器類似,但由於其特殊用途,它們存在一些差異。
Init 容器的作用
供應容器解決了與首次運行時初始化應用程序相關的問題。通常,服務在完全啟動之前取決於安裝腳本的成功完成。
在較小的系統上,您可以將腳本添加到現有的應用程序容器映像中。然而,這並不理想,因為它為圖像增加了另一個責任。您甚至可以有多個單獨的階段,每個階段都有自己的依賴關係和關係。將所有這些一次性操作添加到您的主容器映像中會迅速產生難以維護的臃腫複雜性。
Init 容器通過允許您在 pod 的應用程序容器啟動之前運行自定義容器來解決此問題。每個模塊可以有多個初始化容器;只有在前一個成功完成後,它們才能保證按順序運行。
在所有初始化容器完成後,Kubernetes 會啟動常規 pod。如果一個 init 容器失敗,它將在完成之前重新啟動。如果 PodrestartPolicy
設置為 Never
,則將該 Pod 標記為失敗。
將 Init 容器添加到 Pod
初始化容器在spec.initContainers
pod manifest 字段中定義。這與通常的spec.containers
定義非常相似。
下面是一個連接了兩個 init 容器的 pod 示例:
使用 Kubectl 將 Pod 添加到您的集群:
$ kubectl apply -f pod.yaml
pod/init-containers-pod created
現在,提取與每個 init 容器關聯的日誌以確保它們已啟動:
$ kubectl logs init-containers-pod -c first-init-container
這是第一個初始化容器
$ kubectl logs init-containers-pod -c second-init-container
This is the second init container
您可以在現場使用Kubernetes容器清單可用的大多數屬性initContainers
。其中包括卷、端口、環境變量和安全上下文。
Init 容器也支持資源限制,但它們的處理方式與常規容器不同。選擇所有供應容器聲明的資源限制的最大值作為模塊的有效限制,除非它小於模塊的應用程序容器限制的總和。此計算值將用於規劃目的。
供應容器的限制之一是缺乏對探測的支持。您不能將字段分配給字段中的livenessProbe
、readinessProbe
或startupProbe
容器對象initContainers
。Init 容器是一種單獨的機制,您可以使用它來代替或與附加到主應用程序容器的探測器一起使用。
常見錯誤
使用 init 容器時有幾個常見的錯誤。以下是一些需要牢記的細節:
- 每次重新啟動其 pod 時都會運行初始化容器。這意味著您的 init 容器操作必須是冪等的,以便它們可以在同一個 Pod 中運行兩次。如果一個 pod 重新啟動,它的所有初始化容器都將再次執行。
initContainers
不支持更改Pod 字段,但有一個例外。您可以更改image
字段。這將重新啟動模塊並啟動新的 init 容器。- 初始化容器名稱在 Pod 中的所有容器中必須是唯一的。這包括其他初始化容器和您的應用程序的容器。如果您嘗試應用違反此規則的清單,您將在控制台中看到 YAML 驗證錯誤。
Initialized: False
當 init 容器運行時,Pod 有一個條件。Conditions
這在啟動時的標題下可見kubectl describe my-pod
。
您還可以使用kubectl get
以下命令檢查 pod init 容器是否已完成:
$ kubectl get init-containers-pod
名稱 就緒 狀態 重新開始 年齡
init-containers-pod 0/1 Init:1/2 0 1m
在這種情況下,STATUS
該列表示該模塊有兩個初始化容器,其中一個已成功完成。一旦所有 init 容器都完成,Kubernetes 將啟動應用程序容器,並且 pod 狀態將變為Running
.
何時使用初始化容器
當您需要以某種方式初始化應用程序的新部署時,供應容器是理想的選擇。它們滿足特殊的先決條件任務,這些任務依賴於主容器映像之外的工具。
以下是您可能需要使用 init 容器的幾種情況:
- 從環境變量創建配置文件。
- 應用程序使用的緩存的預填充。
- 遷移和填充數據庫實例。
- 下載並安裝卷中的應用程序插件。
- 在依賴項(例如數據庫或外部 API)可用之前阻止應用程序啟動。
完成其中一些任務的另一種方法是使用Ready 或 Run 試用版。但是,意圖有所不同:探針主要用於將容器狀態傳達給 Kubernetes,而配置容器旨在在 Pod 初始化期間執行操作。
概括
初始化容器是在 Kubernetes pod 中執行首次運行初始化例程的一種方式。它們可用於在您等待依賴項變為可用或引導腳本完成時阻止或延遲應用程序容器的啟動。
初始化容器的功能有時會與啟動和就緒檢查重疊。當您要執行的操作基本上是阻止應用程序運行直到滿足條件時,您可以使用探針。它們依賴於您的應用程序容器映像中已經存在的腳本。如果您想在不使用一次性實用程序重載主映像的情況下執行特殊操作,那麼初始化容器是最佳選擇。
發佈留言