Kubernetes存儲系統介紹及機制實現

Kubernetes存儲系統介紹及機制實現

【編者的話】本次分享分爲三大部分。第一部分主要介紹Kubernetes中經常使用的幾種存儲,及其使用場景和生命週期等等。第二部分試圖介紹一些設計原則和基本架構,並簡要介紹各類存儲plugin的實現機制及持久卷的一些特性,例如訪問模式、回收策略等等。動態卷供給是一個Kubernetes獨有的功能,這一功能容許按需建立存儲卷,使管理員沒必要預先建立存儲卷,而是隨用戶需求進行建立。第三部分會介紹一下v1.9中存儲的一些新特性。html

1、Kubernetes中存儲的應用場景

在Kubernetes中部署和運行的服務大體分爲:git

1. 無狀態服務

Kubernetes使用ReplicaSet來保證一個服務的實例數量,若是說某個Pod實例因爲某種緣由掛掉或崩潰,ReplicaSet會馬上用這個Pod的模版新啓一個Pod來替代它。因爲是無狀態的服務,新Pod與舊Pod如出一轍。此外Kubernetes經過Service(一個Service後面能夠掛多個Pod)對外提供一個穩定的訪問接口,實現服務的高可用。github

2. 普通有狀態服務

和無狀態服務相比,它多了狀態保存的需求。Kubernetes提供了以Volume和Persistent Volume爲基礎的存儲系統,能夠實現服務的狀態保存。docker

3. 有狀態集羣服務

和普通有狀態服務相比,它多了集羣管理的需求。要運行有狀態集羣服務要解決的問題有兩個,一個是狀態保存,另外一個是集羣管理。Kubernetes爲此開發了StatefulSet(之前叫作PetSet),方便有狀態集羣服務在Kubernetes上部署和管理。安全

簡單來講是經過Init Container來作集羣的初始化工做,用Headless Service來維持集羣成員的穩定關係,用動態存儲供給來方便集羣擴容,最後用StatefulSet來綜合管理整個集羣。架構

分析以上的服務類型,Kubernetes中對於存儲的使用主要集中在如下幾個方面:app

  • 服務的基本配置文件讀取、密碼密鑰管理等;
  • 服務的存儲狀態、數據存取等;
  • 不一樣服務或應用程序間共享數據;

2、Kubernetes中幾種常見的存儲系統

目前Kubernetes所支持的Volume Plugins以下表所示,less

Kubernetes已經提供很是豐富的Volume和Persistent Volume插件,你們能夠根據本身業務的須要,使用這些插件給容器提供存儲服務。每一種Plugin的使用方法和注意事項在此不作贅述,請參考 Kubernetes Volume 的官方文檔ide

容器存儲接口(Container Storage Interface,CSI )是一項跨行業標準倡議,旨在下降雲原生存儲開發工做的門檻,從而進一步確保兼容性水平。Kubernetes v1.9已經引入了 CSI 的一套alpha實現版本,將新分卷插件的安裝流程簡化至與安裝pod至關,並容許第三方存儲供應商在無需接觸核心Kubernetes代碼庫的前提下開發本身的解決方案。post

若是上述的這些Plugin不知足業務要求, 你能夠經過如下兩種途徑進行二次開發,

  1. 可使用FlexVolume實現本身的Volume插件。此Plugin還是alpha版本,後向兼容性須要考慮。具體方法在此不作贅述,參考 FlexVolume的社區文檔
  2. 推薦使用CSI。目前還只是alpha版本,使用時須要在feature-gate中enable,不推薦在production環境中使用。v1.9已經把 CSI 做爲in-tree plugin,把out-off-tree volume插件的開發從 Kubernetes 中脫離出來,極大地方便了插件的開發、維護和集成。如何使用CSI,可參考How to Use Kubernetes 1.9.0 with CSI

3、Kubernetes存儲的設計與基本架構

Kubernete存儲在設計的時候遵循着Kubernetes的一向哲學,即聲明式(Declarative)架構。同時爲了儘量多地兼容各類存儲平臺,Kubernetes以in-tree plugin的形式來對接不一樣的存儲系統,知足用戶能夠根據本身業務的須要使用這些插件給容器提供存儲服務。同時兼容用戶使用FlexVolume和CSI定製化插件。相比較於Docker Volume,支持的存儲功能更加豐富和多樣。

Kubernetes中mount 一個PV的基本過程包括:

  1. 用戶經過API建立一個包含PVC的Pod;
  2. Scheduler把這個Pod分配到某個節點,好比Node1;
  3. Node1上的Kubelet開始等待Volume Manager準備device;
  4. PV controller調用相應Volume Plugin(in-tree或者out-of-tree),建立PV,並在系統中與對應的PVC綁定;
  5. Attach/Detach controller或者Volume Manager經過Volume Plugin實現device掛載(Attach);
  6. Volume Manager等待device掛載完成後,將卷掛載到節點指定目錄(mount), 好比/var/lib/kubelet/pods/xxxxxxxxxxx/volumes/aws-ebs/vol-xxxxxxxxxxxxxxxxx;
  7. Node1上的Kubelet此時被告知volume已經準備好後,開始啓動Pod,經過volume mapping將PV已經掛載到相應的容器中去。

其實對於Kubernetes中大部分的Volume Plugin來講,mount的過程遵循着以下的規則:

/some/global/mount/path -> /var/lib/kubelet/pods/<pod uid>
/volumes/<volume plugin>/<volume name>/ -> container volume

這種方式的好處至關於熱插拔,一旦Pod掛掉,kubelet能夠立刻重啓,並快速mount volume,不會出現相似於device busy的情形。

可是對於hostpath這個Plugin而言,直接就是 /some/global/mount/path -> container volume

4、Persistent Volume與Persistent Volume Claim

一個運行中的容器,缺省狀況下,對文件系統的寫入,都是發生在其分層文件系統的可寫層的(Copy-on-Write)。當遷移的應用程序從開發到生產環境時候,開發人員面臨着巨大的挑戰。當容器掛掉、崩潰或運行結束時,任何與之相關的數據都會丟失。爲了解決這個問題引起的數據丟失,咱們須要將數據存儲持久化,也能夠稱爲Persistent Volume。

Kubernetes使用兩種資源管理存儲:

  • PersistentVolume(簡稱PV):由管理員添加的的一個存儲的描述,是一個全局資源,包含存儲的類型,存儲的大小和訪問模式等。它的生命週期獨立於Pod,例如當使用它的Pod銷燬時對PV沒有影響。
  • PersistentVolumeClaim(簡稱PVC):是Namespace裏的資源,描述對PV的一個請求。請求信息包含存儲大小,訪問模式等。

Kubernetes中的Volume則是基於Docker進行擴展,使用Docker Volume掛載宿主機上的文件目錄到容器中。

通常來講,Kubernetes中Pod經過以下三種方式來訪問存儲資源。

直接訪問

該種方式移植性較差,可擴展能力差,把Volume的基本信息徹底暴露給用戶,有嚴重的安全隱患,同時須要協調不一樣users對Volume的訪問。

靜態provision

 

動態provision

StorageClass將說明Volume將由哪一種Volume Plugin建立、建立時參數以及從其餘功能性/非功能性角度描述的後臺volume的各類參數。通常爲storage cluster的一些配置信息,以及label註釋信息。

通常來講,PV和PVC的生命週期分爲5個階段:

  1. Provisioning,即PV的建立,能夠直接建立PV(靜態方式),也可使用StorageClass動態建立
  2. Binding,將PV分配給PVC
  3. Using,Pod經過PVC使用該Volume
  4. Releasing,Pod釋放Volume並刪除PVC
  5. Reclaiming,回收PV,能夠保留PV以便下次使用,也能夠直接從雲存儲中刪除

根據這5個階段,Volume的狀態有如下4種:

  1. Available:可用
  2. Bound:已經分配給PVC
  3. Released:PVC解綁但還未執行回收策略
  4. Failed:發生錯誤

 

5、v1.9中對存儲作了哪些更改

  1. 引入了CSI alpha版本的實現,可見第二部分關於CSI的介紹。
  2. 修復Bug:刪除運行狀態container的PVC這個bug會致使數據丟失。社區的解決辦法是引入一個Finalizer來保護PVC。

    詳細的步驟請參考相關的 Proposal其代碼實現

    簡單來講,這個Fianlizer相似於垃圾回收(GC)裏面的指針計數,當這個使用這個PVC的POD都被刪除(deleted)或處於完成狀態(completed)時,才能夠刪除這個PVC。從而避免了刪除正在運行中的container的PVC,從而引起數據丟失。

 

6、參考資料

  1. Kubernetes dealing with storage and persistence
  2. KubeCon EU 2016: Kubernetes Storage 101
  3. Container Storage Architectures: How Does Kubernetes, Docker, and Mesos Compare?
  4. How to Use Kubernetes 1.9.0 with CSI
  5. Kubernetes Storage
相關文章
相關標籤/搜索