pod通常伴隨著儲存volume,允許pod的容器 pod的生命週期或更長時間內儲存資料,或者與pod的其他容器分享檔案。
Pod就像運行單個應用程式的小型邏輯電腦。此應用程式可以由一個或多個運行應用程式程序的容器組成。 這些程序共用計算資源,例如:CPU、RAM、網路介面等。在典型的電腦中,程序使用相同的檔案系統,但在容器並非如此。相反,每個容器都有自己的由容器image提供的隔離檔案系統。
當容器啟動時,其檔案系統中的檔案是在image構建期間加入到其容器image的檔案。然後在容器中運行的程序可以修改這些檔案或建立新檔案。 當容器終止並重新啟動時,程序對其檔案所做的所有修改都將遺失,因為之前的容器並不是真正重新啟動,而是完全替換新的。 因此,當容器化應用程式重新啟動時,它無法從停止時的地方接著繼續運行。 儘管這對於某些類型的應用程式來說可能沒關係,但對其他應用程式可能需要在重新啟動時保留整個檔案系統或至少部分檔案系統。
這是利用向pod加入一個volume並將volume掛載到容器中來實現的。
<aside> 💡 掛載是將某些儲存設備或volume的檔案系統附加到作業系統檔案樹中的特定位置的行為,如圖 7.1 所示。然後該volume的內容可以在該位置使用。
</aside>
圖 7.1 將檔案系統掛載到檔案樹中
在本章中,您將建立一個需要資料持久化的新服務。因此,運行服務的pod需要包含一個volume。
本書的前14章主要透過向您展示如何部署 Kubernetes in Action Demo Application Suite,來向您介紹k8s的主要概念。您已經知道組成它的三個組件。如下。
圖 7.2 Quiz 服務如何融入 Kiada Suite 的架構
您已經構建了Kiada Web 應用程式和Quote服務的初始版本。現在您將建立Quiz服務。它將提供Kiada Web 應用程式顯示的選擇題,並存儲這些問題的答案。
Quiz服務 ⇒ 前端RESTful API + 後端MongoDB。一開始您將在同一個 pod 的不同容器中運行這兩個元件,如下圖。
圖 7.3 Quiz API 和 MongoDB 在同一個 pod 中運行
正如我在第 5 章的 pod 介紹中所解釋的那樣,建立這樣的pod並不是最好的主意,因為這樣不允許個別單獨擴展容器。 我們將使用單個pod的原因是因為您還沒有學會使pod相互溝通的正確方法。你將在第 11 章中學到這一點。那時你將把兩個容器分成不同的 pod。
Quiz API的容器image的原始碼和產物位於 Chapter07/quiz-api-0.1/ 目錄中。程式碼用 Go 編寫並使用容器建立。 您不必在自己的電腦上安裝Go環境來從 Go原始碼建立執行檔,而是使用包含Go環境的容器中建立執行檔。 建立後的quiz-api執行檔是放在 Chapter07/quiz-api-0.1/app/bin/ 目錄的。
然後使用docker build
指令將此檔案打包到quiz-api:0.1容器image中。
如果您願意,您可以嘗試自己建立執行檔和容器image,或使用作者建立好的容器image在docker.io/luksa/quiz-api:0.1
以下是quiz pod的YAML內容。Chapter07/pod.quiz.novolume.yaml
apiVersion: v1
kind: Pod
metadata:
name: quiz
spec:
containers:
- name: quiz-api
image: luksa/quiz-api:0.1
ports:
- name: http
containerPort: 8080
- name: mongo
image: mongo
內容顯示pod定義了兩個容器。quiz-api容器運行Quiz API,mongo容器運行API用來存儲資料的MongoDB。
使用YAML建立pod,並使用kubectl port-forward
打開一個隧道到pod的port 8080,以便您可以與Quiz API溝通。
要獲取隨機問題,請向URI /questions/random發送GET請求,如下: