本章將討論 Kubernetes 如何管理存儲資源。html
首先咱們會學習 Volume,以及 Kubernetes 如何經過 Volume 爲集羣中的容器提供存儲;而後咱們會實踐幾種經常使用的 Volume 類型並理解它們各自的應用場景;最後,咱們會討論 Kubernetes 如何經過 Persistent Volume 和 Persistent Volume Claim 分離集羣管理員與集羣用戶的職責,並實踐 Volume 的靜態供給和動態供給。docker
本節咱們討論 Kubernetes 的存儲模型 Volume,學習如何將各類持久化存儲映射到容器。學習
咱們常常會說:容器和 Pod 是短暫的。
其含義是它們的生命週期可能很短,會被頻繁地銷燬和建立。容器銷燬時,保存在容器內部文件系統中的數據都會被清除。 spa
爲了持久化保存容器的數據,可使用 Kubernetes Volume。 3d
Volume 的生命週期獨立於容器,Pod 中的容器可能被銷燬和重建,但 Volume 會被保留。 code
本質上,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 orm
Volume 提供了對各類 backend 的抽象,容器在使用 Volume 讀寫數據的時候不須要關心數據究竟是存放在本地節點的文件系統中呢仍是雲硬盤上。對它來講,全部類型的 Volume 都只是一個目錄。 htm
咱們將從最簡單的 emptyDir 開始學習 Kubernetes Volume。 blog
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