新聞中心
前面我們學(xué)習(xí)了本地存儲(chǔ)、NFS共享存儲(chǔ),除了這些存儲(chǔ)類型之外,還有一個(gè)塊存儲(chǔ),同樣為 Kubernetes 提供塊存儲(chǔ)的方案有很多,比如 Ceph RBD,今天我們?yōu)榇蠹医榻B的是 Rancher 開(kāi)源的一款 Kubernetes 的云原生分布式塊存儲(chǔ)方案 - Longhorn,Longhorn 是一個(gè)輕量級(jí)且功能強(qiáng)大的云原生 Kubernetes 分布式存儲(chǔ)平臺(tái),可以在任意基礎(chǔ)設(shè)施上運(yùn)行,Longhorn 還可以與 Rancher 結(jié)合使用,將幫助你在 Kubernetes 環(huán)境中輕松、快速和可靠地部署高可用性持久化塊存儲(chǔ)。

使用 Longhorn,可以:
- 使用 Longhorn 卷作為 Kubernetes 集群中分布式有狀態(tài)應(yīng)用程序的持久存儲(chǔ)
- 將你的塊存儲(chǔ)分區(qū)為 Longhorn 卷,以便你可以在有或沒(méi)有云提供商的情況下使用 Kubernetes 卷
- 跨多個(gè)節(jié)點(diǎn)和數(shù)據(jù)中心復(fù)制塊存儲(chǔ)以提高可用性
- 將備份數(shù)據(jù)存儲(chǔ)在 NFS 或 AWS S3 等外部存儲(chǔ)中
- 創(chuàng)建跨集群災(zāi)難恢復(fù)卷,以便可以從第二個(gè) Kubernetes 集群中的備份中快速恢復(fù)主 Kubernetes 集群中的數(shù)據(jù)
- 調(diào)度一個(gè)卷的快照,并將備份調(diào)度到 NFS 或 S3 兼容的二級(jí)存儲(chǔ)
- 從備份還原卷
- 不中斷持久卷的情況下升級(jí) Longhorn
Longhorn 還帶有獨(dú)立的 UI,可以使用 Helm、kubectl 或 Rancher 應(yīng)用程序目錄進(jìn)行安裝。
架構(gòu)
Longhorn 為每個(gè)卷創(chuàng)建一個(gè)專用的存儲(chǔ)控制器,并在多個(gè)節(jié)點(diǎn)上存儲(chǔ)的多個(gè)副本之間同步復(fù)制該卷。Longhorn 在整體上分為兩層:數(shù)據(jù)平面和控制平面,Longhorn Engine 是存儲(chǔ)控制器,對(duì)應(yīng)數(shù)據(jù)平面,Longhorn Manager 對(duì)應(yīng)控制平面。
Longhorn Manager 會(huì)以 DaemonSet 的形式在 Longhorn 集群中的每個(gè)節(jié)點(diǎn)上運(yùn)行,它負(fù)責(zé)在 Kubernetes 集群中創(chuàng)建和管理卷,并處理來(lái)自 UI 或 Kubernetes 卷插件的 API 調(diào)用,它是遵循 Kubernetes 控制器模式。
Longhorn Manager 通過(guò)與 Kubernetes APIServer 通信來(lái)創(chuàng)建新的 Longhorn volume CRD,然后 Longhorn Manager 會(huì)一直 Watch APIServer 的響應(yīng),當(dāng)它看到發(fā)現(xiàn)創(chuàng)建了一個(gè)新的 Longhorn volume CRD 時(shí),Longhorn Manager 就會(huì)去創(chuàng)建一個(gè)新的對(duì)應(yīng)卷。當(dāng) Longhorn Manager 被要求創(chuàng)建一個(gè)卷時(shí),它會(huì)在卷所連接的節(jié)點(diǎn)上創(chuàng)建一個(gè) Longhorn Engine 實(shí)例,并在每個(gè)將放置副本的節(jié)點(diǎn)上創(chuàng)建一個(gè)副本,副本應(yīng)放置在不同的主機(jī)上以確保最大可用性。副本的多條數(shù)據(jù)路徑確保了 Longhorn 卷的高可用性,即使某個(gè)副本或引擎出現(xiàn)問(wèn)題,也不會(huì)影響所有副本或 Pod 對(duì)卷的訪問(wèn)。
Longhorn Engine 始終與使用 Longhorn 卷的 Pod 在同一節(jié)點(diǎn)中運(yùn)行,它在存儲(chǔ)在多個(gè)節(jié)點(diǎn)上的多個(gè)副本之間同步復(fù)制卷。
如下圖所示,描述了 Longhorn 卷、Longhorn Engine、副本實(shí)例和磁盤(pán)之間的讀/寫(xiě)數(shù)據(jù)流:
卷、Longhorn Engine、副本實(shí)例和磁盤(pán)之間的讀/寫(xiě)數(shù)據(jù)流
- 上圖中有3個(gè) Longhorn 卷實(shí)例
- 每個(gè)卷都有一個(gè)專用控制器,稱為 Longhorn Engine,并作為 Linux 進(jìn)程運(yùn)行
- 每個(gè) Longhorn 卷有兩個(gè)副本,每個(gè)副本也是一個(gè) Linux 進(jìn)程
- 圖中的箭頭表示卷、控制器實(shí)例、副本實(shí)例和磁盤(pán)之間的讀/寫(xiě)數(shù)據(jù)流
- 通過(guò)為每個(gè)卷創(chuàng)建單獨(dú)的 Longhorn Engine,如果一個(gè)控制器發(fā)生故障,其他卷的功能不會(huì)受到影響
注意: 圖中的 Engine 并非是單獨(dú)的一個(gè) Pod,而是每一個(gè) Volume 會(huì)對(duì)應(yīng)一個(gè) golang exec 出來(lái)的 Linux 進(jìn)程
在 Longhorn 中,每個(gè) Engine 只需要服務(wù)一個(gè)卷,簡(jiǎn)化了存儲(chǔ)控制器的設(shè)計(jì),由于控制器軟件的故障域與單個(gè)卷隔離,因此控制器崩潰只會(huì)影響一個(gè)卷。由于 Longhorn Engine 足夠簡(jiǎn)單和輕便,因此我們可以創(chuàng)建多達(dá) 100000 個(gè)獨(dú)立的 Engine,Kubernetes 去調(diào)度這些獨(dú)立的 Engine,從一組共享的磁盤(pán)中提取資源,并與 Longhorn 合作形成一個(gè)彈性的分布式塊存儲(chǔ)系統(tǒng)。
因?yàn)槊總€(gè)卷都有自己的控制器,所以每個(gè)卷的控制器和副本實(shí)例也可以升級(jí),而不會(huì)導(dǎo)致 IO 操作明顯中斷。Longhorn 可以創(chuàng)建一個(gè)長(zhǎng)時(shí)間運(yùn)行的 job 任務(wù)來(lái)協(xié)調(diào)所有卷的升級(jí),而不會(huì)中斷系統(tǒng)的運(yùn)行。
Longhorn 是通過(guò) CSI 驅(qū)動(dòng)在 Kubernetes 中管理的,CSI 驅(qū)動(dòng)通過(guò)調(diào)用 Longhorn 來(lái)創(chuàng)建卷,為 Kubernetes 工作負(fù)載創(chuàng)建持久性數(shù)據(jù),CSI 插件可以讓我們創(chuàng)建、刪除、附加、分離、掛載卷,并對(duì)卷進(jìn)行快照操作,Kubernetes 集群內(nèi)部使用 CSI 接口與Longhorn CSI 驅(qū)動(dòng)進(jìn)行通信,而 Longhorn CSI 驅(qū)動(dòng)是通過(guò)使用 Longhorn API 與 Longhorn Manager 進(jìn)行通信。
此外 Longhorn 還提供一個(gè) UI 界面程序,通過(guò) Longhorn API 與 Longhorn Manager 進(jìn)行交互,通過(guò) Longhorn UI 可以管理快照、備份、節(jié)點(diǎn)和磁盤(pán)等,此外,集群工作節(jié)點(diǎn)的空間使用情況還可以通過(guò) Longhorn UI 查看。
安裝
要在 Kubernetes 集群上安裝 Longhorn,需要集群的每個(gè)節(jié)點(diǎn)都必須滿足以下要求:
- 與 Kubernetes 兼容的容器運(yùn)行時(shí)(Docker v1.13+、containerd v1.3.7+ 等)
- Kubernetes v1.18+
- 安裝 open-iscsi,并且 iscsid 守護(hù)程序在所有節(jié)點(diǎn)上運(yùn)行,這是必要的,因?yàn)?Longhorn 依賴主機(jī)上的 iscsiadm 為 Kubernetes 提供持久卷
- RWX 支持需要每個(gè)節(jié)點(diǎn)上都安裝 NFSv4 客戶端
- 宿主機(jī)文件系統(tǒng)支持 file extents 功能來(lái)存儲(chǔ)數(shù)據(jù),目前我們支持:ext4 與 XFS
- bash、curl、findmnt、grep、awk、blkid、lsblk 等工具必須安裝
- Mount propagation 必須啟用,它允許將一個(gè)容器掛載的卷與同一 pod 中的其他容器共享,甚至可以與同一節(jié)點(diǎn)上的其他 pod 共享
Longhorn workloads 必須能夠以 root 身份運(yùn)行才能正確部署和操作 Longhorn。
依賴
為了驗(yàn)證這些環(huán)境要求,Longhorn 官方提供了一個(gè)腳本來(lái)幫助我們進(jìn)行檢查,執(zhí)行該腳本需要在本地安裝 jq 工具,執(zhí)行下面的命令即可運(yùn)行腳本:
curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.2.3/scripts/environment_check.sh | bash
daemonset.apps/longhorn-environment-check created
waiting for pods to become ready (0/2)
waiting for pods to become ready (0/2)
all pods ready (2/2)
MountPropagation is enabled!
cleaning up...
daemonset.apps "longhorn-environment-check" deleted
clean up complete
如果沒(méi)有檢查通過(guò)會(huì)給出相關(guān)的提示信息。
要安裝 open-iscsi,可以直接使用下面的命令即可:
# apt-get install open-iscsi # Debian 和 Ubuntu 系統(tǒng)命令
yum install -y iscsi-initiator-utils
Longhorn 官方還為我們還提供了一個(gè) iscsi 安裝程序,可以更輕松地自動(dòng)安裝 open-iscsi:
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.2.3/deploy/prerequisite/longhorn-iscsi-installation.yaml
部署完成后,運(yùn)行以下命令來(lái)檢查安裝程序的 pod 狀態(tài):
kubectl get pod | grep longhorn-iscsi-installation
longhorn-iscsi-installation-49hd7 1/1 Running 0 21m
longhorn-iscsi-installation-pzb7r 1/1 Running 0 39m
也可以通過(guò)以下命令查看日志,查看安裝結(jié)果:
kubectl logs longhorn-iscsi-installation-pzb7r -c iscsi-installation
...
Installed:
iscsi-initiator-utils.x86_64 0:6.2.0.874-7.amzn2
Dependency Installed:
iscsi-initiator-utils-iscsiuio.x86_64 0:6.2.0.874-7.amzn2
Complete!
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsid.service to /usr/lib/systemd/system/iscsid.service.
iscsi install successfully
同樣要安裝 NFSv4 客戶端,可以直接使用下面的命令一鍵安裝:
# apt-get install nfs-common # Debian 和 Ubuntu 系統(tǒng)命令
yum install nfs-utils
同樣 Longhorn 官方也提供了一個(gè) nfs 客戶端安裝程序,可以更輕松地自動(dòng)安裝 nfs-client:
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.2.3/deploy/prerequisite/longhorn-nfs-installation.yaml
部署完成后,運(yùn)行以下命令來(lái)檢查安裝程序的 pod 狀態(tài):
kubectl get pod | grep longhorn-nfs-installation
NAME READY STATUS RESTARTS AGE
longhorn-nfs-installation-t2v9v 1/1 Running 0 143m
longhorn-nfs-installation-7nphm 1/1 Running 0 143m
也可以通過(guò)以下命令查看日志,查看安裝結(jié)果:
kubectl logs longhorn-nfs-installation-t2v9v -c nfs-installation
...
nfs install successfully
相關(guān)依賴環(huán)境準(zhǔn)備好過(guò)后就可以開(kāi)始安裝 Longhorn 了。
部署
官方支持使用 Rancher Catalog 應(yīng)用、kubectl 與 helm 三種方式來(lái)進(jìn)行安裝,同樣這里我們選擇使用 helm 進(jìn)行安裝。
首先添加 longhorn 的 chart 倉(cāng)庫(kù):
helm repo add longhorn https://charts.longhorn.io
helm repo update
然后可以根據(jù)自己的實(shí)際場(chǎng)景定制 values 文件,可以通過(guò)下面的命令獲取默認(rèn)的 values 文件:
curl -Lo values.yaml https://raw.githubusercontent.com/longhorn/charts/master/charts/longhorn/values.yaml
然后可以修改 values 文件中的配置,longhorn 推薦單獨(dú)掛盤(pán)作為存儲(chǔ)使用,這里作為測(cè)試直接使用默認(rèn)的 /var/lib/longhorn 目錄。
如下所示默認(rèn)配置的示例片段:
defaultSettings:
backupTarget: s3://backupbucket@us-east-1/backupstore
backupTargetCredentialSecret: minio-secret
createDefaultDiskLabeledNodes: true
defaultDataPath: /var/lib/longhorn-example/
replicaSoftAntiAffinity: false
storageOverProvisioningPercentage: 600
storageMinimalAvailablePercentage: 15
upgradeChecker: false
defaultReplicaCount: 2
defaultDataLocality: disabled
guaranteedEngineCPU:
defaultLonghornStaticStorageClass: longhorn-static-example
backupstorePollInterval: 500
taintToleration: key1=value1:NoSchedule; key2:NoExecute
systemManagedComponentsNodeSelector: "label-key1:label-value1"
priority-class: high-priority
autoSalvage: false
disableSchedulingOnCordonedNode: false
replicaZoneSoftAntiAffinity: false
volumeAttachmentRecoveryPolicy: never
nodeDownPodDeletionPolicy: do-nothing
mkfsExt4Parameters: -O ^64bit,^metadata_csum
guaranteed-engine-manager-cpu: 15
guaranteed-replica-manager-cpu: 15
ingress: # 開(kāi)啟ingress
enabled: true
ingressClassName: nginx # 配置 ingressclass
host: longhorn.k8s.local
annotations: # 添加annotations
nginx.ingress.kubernetes.io/proxy-body-size: 10000m
enablePSP: false
然后執(zhí)行下面的命令一鍵安裝 Longhorn:
helm upgrade --install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace -f values.yaml
NAME: longhorn
LAST DEPLOYED: Sun Feb 20 16:14:05 2022
NAMESPACE: longhorn-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Longhorn is now installed on the cluster!
Please wait a few minutes for other Longhorn components such as CSI deployments, Engine Images, and Instance Managers to be initialized.
Visit our documentation at https://longhorn.io/docs/
部署后可以查看 Pod 的運(yùn)行狀態(tài)來(lái)確保安裝正確:
kubectl get pods -n longhorn-system
NAME READY STATUS RESTARTS AGE
csi-attacher-5f46994f7-fqntq 1/1 Running 0 33s
csi-attacher-5f46994f7-ltxg8 1/1 Running 0 36m
csi-attacher-5f46994f7-vw75d 1/1 Running 0 36m
csi-provisioner-6ccbfbf86f-bvc99 1/1 Running 0 33s
csi-provisioner-6ccbfbf86f-k46hn 1/1 Running 0 36m
csi-provisioner-6ccbfbf86f-lxm8h 1/1 Running 0 36m
csi-resizer-6dd8bd4c97-52gmm 1/1 Running 0 35m
csi-resizer-6dd8bd4c97-9btj6 1/1 Running 0 3s
csi-resizer-6dd8bd4c97-fdjmp 1/1 Running 0 35m
csi-snapshotter-86f65d8bc-5mjk2 1/1 Running 0 33s
csi-snapshotter-86f65d8bc-5rrfs 1/1 Running 0 35m
csi-snapshotter-86f65d8bc-bg6nv 1/1 Running 0 35m
engine-image-ei-fa2dfbf0-jrb2d 1/1 Running 0 36m
engine-image-ei-fa2dfbf0-m5799 1/1 Running 0 36m
instance-manager-e-051171e6 1/1 Running 0 36m
instance-manager-e-db94b4b7 1/1 Running 0 24m
instance-manager-r-dd84ad5c 1/1 Running 0 36m
instance-manager-r-f5eefb8a 1/1 Running 0 24m
longhorn-csi-plugin-mljt2 2/2 Running 0 35m
longhorn-csi-plugin-rfzcj 2/2 Running 0 24m
longhorn-driver-deployer-6db849975f-dh4p4 1/1 Running 0 58m
longhorn-manager-bxks6 1/1 Running 0 24m
longhorn-manager-tj58k 1/1 Running 0 2m50s
longhorn-ui-6f547c964-k56xr 1/1 Running 0 58m
由于上面安裝的時(shí)候我們添加了 Ingress 支持,所以可以通過(guò)配置的域名去訪問(wèn) Longhorn UI:
kubectl get ingress -n longhorn-system
NAME CLASS HOSTS ADDRESS PORTS AGE
longhorn-ingress nginx longhorn.k8s.local 192.168.31.31 80 4m11s
這里我們使用的 ingress-nginx 這個(gè)控制器,安裝完成后在瀏覽器中直接訪問(wèn) http://longhorn.k8s.local 即可:
Longhorn UI 界面中展示了當(dāng)前存儲(chǔ)系統(tǒng)的狀態(tài),也可以在頁(yè)面中進(jìn)行其他相關(guān)配置。
此外還會(huì)創(chuàng)建一個(gè)默認(rèn)的 StorageClass 對(duì)象:
kubectl get sc longhorn
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
longhorn (default) driver.longhorn.io Delete Immediate true 91m
kubectl get sc longhorn -o yaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
......
storageclass.kubernetes.io/is-default-class: "true"
creationTimestamp: "2022-02-20T09:32:51Z"
......
name: longhorn
resourceVersion: "4524911"
uid: 6066e858-e7ab-4dab-95db-7ff829e6e01b
parameters:
fromBackup: ""
fsType: ext4
numberOfReplicas: "3"
staleReplicaTimeout: "30"
provisioner: driver.longhorn.io
reclaimPolicy: Delete
volumeBindingMode: Immediate
測(cè)試
下面我們來(lái)測(cè)試使用 longhorn 提供一個(gè)存儲(chǔ)卷,由于提供了默認(rèn)的 StorageClass,所以直接創(chuàng)建 PVC 即可,創(chuàng)建一個(gè)如下所示的 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
storageClassName: longhorn
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
然后部署一個(gè) mysql 應(yīng)用來(lái)使用上面的 PVC 進(jìn)行數(shù)據(jù)持久化:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
分享標(biāo)題:創(chuàng)新互聯(lián)Kubernetes分布式存儲(chǔ)平臺(tái)Longhorn初體驗(yàn)
分享地址:http://fisionsoft.com.cn/article/dphoisd.html


咨詢
建站咨詢
