本章將討論 Kubernetes 如何管理存儲資源。
首先我們會學習 Volume,以及 Kubernetes 如何通過 Volume 爲集羣中的容器提供存儲;然後我們會實踐幾種常用的 Volume 類型並理解它們各自的應用場景;最後,我們會討論 Kubernetes 如何通過 Persistent Volume 和 Persistent Volume Claim 分離集羣管理員與集羣用戶的職責,並實踐 Volume 的靜態供給和動態供給。
Volume
本節我們討論 Kubernetes 的存儲模型 Volume,學習如何將各種持久化存儲映射到容器。
我們經常會說:容器和 Pod 是短暫的。
其含義是它們的生命週期可能很短,會被頻繁地銷燬和創建。容器銷燬時,保存在容器內部文件系統中的數據都會被清除。
爲了持久化保存容器的數據,可以使用 Kubernetes Volume。
Volume 的生命週期獨立於容器,Pod 中的容器可能被銷燬和重建,但 Volume 會被保留。
本質上,Kubernetes Volume 是一個目錄,這一點與 Docker Volume 類似。當 Volume 被 mount 到 Pod,Pod 中的所有容器都可以訪問這個 Volume。Kubernetes Volume 也支持多種 backend 類型,包括 emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等,完整列表可參考 https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes
Volume 提供了對各種 backend 的抽象,容器在使用 Volume 讀寫數據的時候不需要關心數據到底是存放在本地節點的文件系統中呢還是雲硬盤上。對它來說,所有類型的 Volume 都只是一個目錄。
我們將從最簡單的 emptyDir 開始學習 Kubernetes Volume。
emptyDir
emptyDir 是最基礎的 Volume 類型。正如其名字所示,一個 emptyDir Volume 是 Host 上的一個空目錄。
emptyDir Volume 對於容器來說是持久的,對於 Pod 則不是。當 Pod 從節點刪除時,Volume 的內容也會被刪除。但如果只是容器被銷燬而 Pod 還在,則 Volume 不受影響。
也就是說:emptyDir Volume 的生命週期與 Pod 一致。
Pod 中的所有容器都可以共享 Volume,它們可以指定各自的 mount 路徑。下面通過例子來實踐 emptyDir,配置文件如下:
這裏我們模擬了一個 producer-consumer 場景。Pod 有兩個容器 producer
和 consumer
,它們共享一個
Volume。producer
負責往
Volume 中寫數據,consumer
則是從
Volume 讀取數據。
① 文件最底部 volumes
定義了一個 emptyDir
類型的
Volume shared-volume
。
② producer
容器將 shared-volume
mount
到 /producer_dir
目錄。
③ producer
通過 echo
將數據寫到文件 hello
裏。
④ consumer
容器將 shared-volume
mount
到 /consumer_dir
目錄。
⑤ consumer
通過 cat
從文件 hello
讀數據。
執行如下命令創建 Pod:
kubectl
logs
顯示容器 consumer
成功讀到了 producer
寫入的數據,驗證了兩個容器共享
emptyDir Volume。
因爲 emptyDir 是 Docker Host 文件系統裏的目錄,其效果相當於執行了 docker
run -v /producer_dir
和 docker
run -v /consumer_dir
。通過 docker
inspect
查看容器的詳細配置信息,我們發現兩個容器都 mount 了同一個目錄:
這裏 /var/lib/kubelet/pods/3e6100eb-a97a-11e7-8f72-0800274451ad/volumes/kubernetes.io~empty-dir/shared-volume
就是
emptyDir 在 Host 上的真正路徑。
emptyDir 是 Host 上創建的臨時目錄,其優點是能夠方便地爲 Pod 中的容器提供共享存儲,不需要額外的配置。但它不具備持久性,如果 Pod 不存在了,emptyDir 也就沒有了。根據這個特性,emptyDir 特別適合 Pod 中的容器需要臨時共享存儲空間的場景,比如前面的生產者消費者用例。
下一節我們學習 hostPath Volume。
書籍:
1.《每天5分鐘玩轉Kubernetes》
https://item.jd.com/26225745440.html
2.《每天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html
3.《每天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html