使用 OpenEBS 實現(xiàn) Local PV 動態(tài)持久化存儲
OpenEBS(https://openebs.io) 是一種模擬了 AWS 的 EBS、阿里云的云盤等塊存儲實現(xiàn)的基于容器的存儲開源軟件。OpenEBS 是一種基于 CAS(Container Attached Storage)?理念的容器解決方案,其核心理念是存儲和應(yīng)用一樣采用微服務(wù)架構(gòu),并通過 Kubernetes 來做資源編排。其架構(gòu)實現(xiàn)上,每個卷的 Controller 都是一個單獨的 Pod,且與應(yīng)用 Pod 在同一個節(jié)點,卷的數(shù)據(jù)使用多個 Pod 進行管理。
OpenEBS 有很多組件,可以分為以下幾類:
控制平面組件 - 管理 OpenEBS 卷容器,通常會用到容器編排軟件的功能 數(shù)據(jù)平面組件 - 為應(yīng)用程序提供數(shù)據(jù)存儲,包含 Jiva 和 cStor 兩個存儲后端 節(jié)點磁盤管理器 - 發(fā)現(xiàn)、監(jiān)控和管理連接到 Kubernetes 節(jié)點的媒體 與云原生工具的整合 - 與 Prometheus、Grafana、Fluentd 和 Jaeger 進行整合。
控制平面
OpenEBS 集群的控制平面通常被稱為 Maya,控制平面負責供應(yīng)卷、相關(guān)的卷操作,如快照、制作克隆、創(chuàng)建存儲策略、執(zhí)行存儲策略、導(dǎo)出卷指標供 Prometheus/grafana 消費等。
OpenEBS 控制平面 Maya 實現(xiàn)了創(chuàng)建超融合的 OpenEBS,并將其掛載到如 Kubernetes 調(diào)度引擎上,用來擴展特定的容器編排系統(tǒng)提供的存儲功能;OpenEBS 的控制平面也是基于微服務(wù)的,通過不同的組件實現(xiàn)存儲管理功能、監(jiān)控、容器編排插件等功能。
OpenEBS 提供了一個動態(tài)供應(yīng)器,它是標準的 Kubernetes 外部存儲插件。OpenEBS PV 供應(yīng)器的主要任務(wù)是向應(yīng)用 Pod 發(fā)起卷供應(yīng),并實現(xiàn)Kubernetes 的 PV 規(guī)范。
m-apiserver 暴露了存儲 REST API,并承擔了大部分的卷策略處理和管理。
控制平面和數(shù)據(jù)平面之間的連接采用 Kubernetes sidecar 模式。有如下幾個場景,控制平面需要與數(shù)據(jù)平面進行通信。
對于 IOPS、吞吐量、延遲等卷統(tǒng)計 - 通過 volume-exportersidecar實現(xiàn)用于通過卷控制器 Pod 執(zhí)行卷策略,以及通過卷復(fù)制 Pod 進行 磁盤/池管理 - 通過卷管理 sidecar 實現(xiàn)。
下面對上述控制平面的組成進行詳細說明。
OpenEBS PV Provisioner
該組件作為一個 Pod 運行,并做出供應(yīng)決策。它的使用方式是開發(fā)者用所需的卷參數(shù)構(gòu)建一個請求,選擇合適的存儲類,并在 YAML 規(guī)范上調(diào)用 kubelet。OpenEBS PV 動態(tài)供應(yīng)器與maya-apiserver 交互,在適當?shù)墓?jié)點上為卷控制器 Pod 和卷復(fù)制 Pod 創(chuàng)建部署規(guī)范。可以使用 PVC 規(guī)范中的注解來控制容量 Pod(控制器/副本)的調(diào)度。
目前,OpenEBS 供應(yīng)器只支持一種類型的綁定,即 iSCSI。
Maya-ApiServer
m-apiserver 作為一個 Pod 運行,主要是用來暴露 OpenEBS REST APIs。
m-apiserver 還負責創(chuàng)建創(chuàng)建卷 Pod 所需的部署規(guī)范文件,在生成這些規(guī)范文件后,它調(diào)用 kube-apiserver 來相應(yīng)地調(diào)度Pods。在 OpenEBS PV 供應(yīng)器的卷供應(yīng)結(jié)束時,會創(chuàng)建一個Kubernetes 對象 PV,并掛載在應(yīng)用 Pod 上,PV由控制器 Pod 托管,控制器 Pod 由一組位于不同節(jié)點的副本 Pod 支持,控制器 Pod和副本 Pod 是數(shù)據(jù)平面的一部分,。
m-apiserver 的另一個重要任務(wù)是卷策略管理。OpenEBS 提供了非常細化的規(guī)范來表達策略,m-apiserver 解釋這些 YAML 規(guī)范,將其轉(zhuǎn)換為可執(zhí)行的組件,并通過卷管理 sidecar 來執(zhí)行。
Maya Volume Exporter
Maya Volume Exporter 是每個存儲控制器 Pod(cStor/Jiva)的 sidecar。這些 sidecars 將控制平面與數(shù)據(jù)平面連接起來,以獲取統(tǒng)計數(shù)據(jù),比如:
volume 讀/寫延遲 讀/寫 IOPS 讀/寫塊大小 容量統(tǒng)計 OpenEBS volume exporter數(shù)據(jù)流
Volume 管理 Sidecars
Sidecars 還用于將控制器配置參數(shù)和卷策略傳遞給作為數(shù)據(jù)平面的卷控制器 Pod,以及將副本配置參數(shù)和副本數(shù)據(jù)保護參數(shù)傳遞給卷副本 Pod。
數(shù)據(jù)平面
OpenEBS 持久化存儲卷通過 Kubernetes 的 PV 來創(chuàng)建,使用 iSCSI 來實現(xiàn),數(shù)據(jù)保存在節(jié)點上或者云存儲中。OpenEBS 的卷完全獨立于用戶的應(yīng)用的生命周期來管理,和 Kuberentes 中 PV 的思路一致。OpenEBS 卷為容器提供持久化存儲,具有針對系統(tǒng)故障的彈性,更快地訪問存儲,快照和備份功能。同時還提供了監(jiān)控使用情況和執(zhí)行 QoS 策略的機制。
目前,OpenEBS 提供了兩個可以輕松插入的存儲引擎。這兩個引擎分別叫做 Jiva 和 cStor。這兩個存儲引擎都完全運行在Linux 用戶空間中,并且基于微服務(wù)架構(gòu)。
Jiva
Jiva 存儲引擎是基于 Rancher 的 LongHorn 和 gotgt 開發(fā)的,采用 GO 語言編寫,運行在用戶空間。LongHorn 控制器將傳入的 IO 同步復(fù)制到 LongHorn 復(fù)制器上。復(fù)制器考慮以 Linux 稀疏文件為基礎(chǔ),進行動態(tài)供應(yīng)、快照、重建等存儲功能。
cStor
cStor 數(shù)據(jù)引擎是用C語言編寫的,具有高性能的 iSCSI 目標和Copy-On-Write 塊系統(tǒng),可提供數(shù)據(jù)完整性、數(shù)據(jù)彈性和時間點快照和克隆。cStor 具有池功能,可將節(jié)點上的磁盤以鏡像式或 RAIDZ 模式聚合,以提供更大的容量和性能單位。
Local PV
對于那些不需要存儲級復(fù)制的應(yīng)用,Local PV 可能是不錯的選擇,因為它能提供更高的性能。OpenEBS LocalPV 與 Kubernetes LocalPV 類似,只不過它是由 OpenEBS 控制平面動態(tài)調(diào)配的,就像其他常規(guī) PV 一樣。OpenEBS LocalPV 有兩種類型--主機路徑 LocalPV 或設(shè)備 LocalPV,主機路徑 LocalPV 指的是主機上的一個子目錄,設(shè)備 LocalPV 指的是節(jié)點上的一個被發(fā)現(xiàn)的磁盤(直接連接或網(wǎng)絡(luò)連接)。OpenEBS 引入了一個LocalPV 供應(yīng)器,用于根據(jù) PVC 和存儲類規(guī)范中的一些標準選擇匹配的磁盤或主機路徑。
節(jié)點磁盤管理器
Node Disk Manager (NDM)填補了使用 Kubernetes 管理有狀態(tài)應(yīng)用的持久性存儲所需的工具鏈中的空白。容器時代的 DevOps 架構(gòu)師必須以自動化的方式服務(wù)于應(yīng)用和應(yīng)用開發(fā)者的基礎(chǔ)設(shè)施需求,以提供跨環(huán)境的彈性和一致性。這些要求意味著存儲棧本身必須非常靈活,以便 Kubernetes 和云原生生態(tài)系統(tǒng)中的其他軟件可以輕松使用這個棧。NDM 在 Kubernetes 的存儲棧中起到了基礎(chǔ)性的作用,它將不同的磁盤統(tǒng)一起來,并通過將它們識別為 Kubernetes 對象來提供部分池化的能力。同時, NDM 還可以發(fā)現(xiàn)、供應(yīng)、監(jiān)控和管理底層磁盤,這樣Kubernetes PV 供應(yīng)器(如 OpenEBS 和其他存儲系統(tǒng)和Prometheus)可以管理磁盤子系統(tǒng)。
安裝
由于 OpenEBS 通過 iSCSI 協(xié)議提供存儲支持,因此,需要在所有 Kubernetes 節(jié)點上都安裝 iSCSI 客戶端(啟動器)。
比如我們這里使用的是 CentOS 的系統(tǒng),執(zhí)行下面的命令安裝啟動 iSCSI 啟動器:
#?安裝?iscsi
$?yum?install?iscsi-initiator-utils?-y
#?查看?InitiatorName?是否正常配置
$?cat?/etc/iscsi/initiatorname.iscsi
#?啟動查看狀態(tài)
$?systemctl?enable?--now?iscsid
$?systemctl?start?iscsid.service
$?systemctl?status?iscsid.service
iSCSI 客戶端啟動完成后就可以開始安裝 OpenEBS 了。
直接使用下面的命令安裝 OpenEBS 即可:
$?kubectl?apply?-f?https://openebs.github.io/charts/openebs-operator.yaml
該命令會將應(yīng)用安裝到名為 openebs 的命名空間中,安裝成功后正常可以看到如下所示的 Pod:
$?kubectl?get?pods?-n?openebs???????????????????????????????
NAME???????????????????????????????????????????READY???STATUS????RESTARTS???AGE
maya-apiserver-5db4c7f9bc-fv9sc????????????????1/1?????Running???0??????????19h
openebs-admission-server-6c64d9ff64-sklvp??????1/1?????Running???0??????????19h
openebs-localpv-provisioner-784d8f9b56-9mphk???1/1?????Running???1??????????19h
openebs-ndm-fdlpx??????????????????????????????1/1?????Running???0??????????19h
openebs-ndm-jfxbj??????????????????????????????1/1?????Running???0??????????19h
openebs-ndm-operator-6d5978d6fb-swp65??????????1/1?????Running???0??????????19h
openebs-provisioner-7b99c87dbf-zpxqn???????????1/1?????Running???1??????????19h
openebs-snapshot-operator-69b9f8cd8b-r6hrn?????2/2?????Running???1??????????19h
默認情況下 OpenEBS 還會安裝一些內(nèi)置的 StorageClass 對象:
$?kubectl?get?sc
NAME????????????????????????PROVISIONER????????????????????????????????????????????????RECLAIMPOLICY???VOLUMEBINDINGMODE??????ALLOWVOLUMEEXPANSION???AGE
openebs-device??????????????openebs.io/local???????????????????????????????????????????Delete??????????WaitForFirstConsumer???false??????????????????19h
openebs-hostpath????????????openebs.io/local???????????????????????????????????????????Delete??????????WaitForFirstConsumer???false??????????????????19h
openebs-jiva-default????????openebs.io/provisioner-iscsi???????????????????????????????Delete??????????Immediate??????????????false??????????????????19h
openebs-snapshot-promoter???volumesnapshot.external-storage.k8s.io/snapshot-promoter???Delete??????????Immediate??????????????false??????????????????19h
測試
接下來我們創(chuàng)建一個 PVC 資源對象,Pods 使用這個 PVC 就可以從 OpenEBS 動態(tài) Local PV Provisioner 中請求 Hostpath Local PV 了。
直接使用上面自帶的 openebs-hostpath 這個 StorageClass 來創(chuàng)建 PVC:
#?local-hostpath-pvc.yaml
apiVersion:?v1
kind:?PersistentVolumeClaim
metadata:
??name:?local-hostpath-pvc
spec:
??storageClassName:?openebs-hostpath
??accessModes:
????-?ReadWriteOnce
??resources:
????requests:
??????storage:?5Gi
直接創(chuàng)建這個 PVC 即可:
$?kubectl?apply?-f?local-hostpath-pvc.yaml
$?kubectl?get?pvc?local-hostpath-pvc
NAME?????????????????STATUS????VOLUME???CAPACITY???ACCESS?MODES???STORAGECLASS???????AGE
local-hostpath-pvc???Pending??????????????????????????????????????openebs-hostpath???12s
我們可以看到這個 PVC 的狀態(tài)是 Pending,這是因為對應(yīng)的 StorageClass 是延遲綁定模式,所以需要等到 Pod 消費這個 PVC 后才會去綁定,接下來我們?nèi)?chuàng)建一個 Pod 來使用這個 PVC。
聲明一個如下所示的 Pod 資源清單:
#?local-hostpath-pod.yaml
apiVersion:?v1
kind:?Pod
metadata:
??name:?hello-local-hostpath-pod
spec:
??volumes:
??-?name:?local-storage
????persistentVolumeClaim:
??????claimName:?local-hostpath-pvc
??containers:
??-?name:?hello-container
????image:?busybox
????command:
???????-?sh
???????-?-c
???????-?'while?true;?do?echo?"`date`?[`hostname`]?Hello?from?OpenEBS?Local?PV."?>>?/mnt/store/greet.txt;?sleep?$(($RANDOM?%?5?+?300));?done'
????volumeMounts:
????-?mountPath:?/mnt/store
??????name:?local-storage
直接創(chuàng)建這個 Pod:
$?kubectl?apply?-f?local-hostpath-pod.yaml
$?kubectl?get?pods?hello-local-hostpath-pod??????????
NAME???????????????????????READY???STATUS????RESTARTS???AGE
hello-local-hostpath-pod???1/1?????Running???0??????????2m7s
$?kubectl?get?pvc?local-hostpath-pvc???????????
NAME?????????????????STATUS???VOLUME?????????????????????????????????????CAPACITY???ACCESS?MODES???STORAGECLASS???????AGE
local-hostpath-pvc???Bound????pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88???5Gi????????RWO????????????openebs-hostpath???5m41s
可以看到 Pod 運行成功后,PVC 也綁定上了一個自動生成的 PV,我們可以查看這個 PV 的詳細信息:
$?kubectl?get?pv?pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88?-o?yaml
apiVersion:?v1
kind:?PersistentVolume
metadata:
??annotations:
????pv.kubernetes.io/provisioned-by:?openebs.io/local
??creationTimestamp:?"2021-01-07T02:48:14Z"
??finalizers:
??-?kubernetes.io/pv-protection
??labels:
????openebs.io/cas-type:?local-hostpath
??......
??name:?pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88
??resourceVersion:?"21193802"
??selfLink:?/api/v1/persistentvolumes/pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88
??uid:?f7cccdb3-d23a-4831-86c3-4363eb1a8dee
spec:
??accessModes:
??-?ReadWriteOnce
??capacity:
????storage:?5Gi
??claimRef:
????apiVersion:?v1
????kind:?PersistentVolumeClaim
????name:?local-hostpath-pvc
????namespace:?default
????resourceVersion:?"21193645"
????uid:?3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88
??local:
????fsType:?""
????path:?/var/openebs/local/pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88
??nodeAffinity:
????required:
??????nodeSelectorTerms:
??????-?matchExpressions:
????????-?key:?kubernetes.io/hostname
??????????operator:?In
??????????values:
??????????-?node2
??persistentVolumeReclaimPolicy:?Delete
??storageClassName:?openebs-hostpath
??volumeMode:?Filesystem
status:
??phase:?Bound
我們可以看到這個自動生成的 PV 和我們前面自己手動創(chuàng)建的 Local PV 基本上是一致的,和 node2 節(jié)點是親和關(guān)系,本地數(shù)據(jù)目錄位于 /var/openebs/local/pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88 下面。
接著我們來驗證下 volume 數(shù)據(jù),前往 node2 節(jié)點查看下上面的數(shù)據(jù)目錄中的數(shù)據(jù):
[root@node2?~]#?ls?/var/openebs/local/pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88
greet.txt
[root@node2?~]#?cat?/var/openebs/local/pvc-3f4a1a65-6cbc-42bf-a1f8-87ad238c0b88/greet.txt
Thu?Jan??7?10:48:49?CST?2021?[hello-local-hostpath-pod]?Hello?from?OpenEBS?Local?PV.
Thu?Jan??7?10:53:50?CST?2021?[hello-local-hostpath-pod]?Hello?from?OpenEBS?Local?PV.
可以看到 Pod 容器中的數(shù)據(jù)已經(jīng)持久化到 Local PV 對應(yīng)的目錄中去了。但是需要注意的是 StorageClass 默認的數(shù)據(jù)回收策略是 Delete,所以如果將 PVC 刪掉后數(shù)據(jù)會自動刪除,我們可以 Velero 這樣的工具來進行備份還原。
進階訓(xùn)練營第二期
本次訓(xùn)練營采用線上直播的形式,基于1.19.x版本,根據(jù)第1期課程的打磨,我們總結(jié)出了 Docker 基礎(chǔ) + Kubernetes 基礎(chǔ) + 原理 + 基本使用 + 進階技能 + 完整項目實踐?的課程體系。加強系統(tǒng)知識吸收、夯實基礎(chǔ)的同時,并在實際操作過程中去了解排查問題的方式方法,更為重要的是我們的老師非常負責任,隨時幫你答疑解惑,我們認為不只是課堂上講授知識,更重要的是售后支持,完全不用擔心學習不到知識。
?點擊屏末?|?閱讀原文?|?即刻學習








