基於主機安裝或基於Kubernetes安裝的 Rainbond 叢集(均使用預設引數安裝),預設使用的共享檔案儲存是 NFS ,以 Pod 方式執行在 Kubernetes 中,但這種方式也有一些無法避免的問題,比如:NFS 的 SVC 無法通訊時叢集無法掛載儲存則導致不能使用、伺服器關機時卡在 umount
導致不能正常關機等等。
當然還有切換共享檔案儲存的需求,在第一次安裝 Rainbond 時,大多數都使用的預設安裝,使用一段時間後想切換到外部的 NFS,或者雲上的 NAS等等。
在原生的 Kubernetes 叢集中,透過 StorageClass 建立的 PVC 是無法修改儲存後端的,需要將 PV、PVC 刪除後透過新的 StorageClass 建立新的 PVC,然後再將資料遷移,再重新掛載 PVC。當有很多個 PVC 時,需要多次重複的操作。
而 Rainbond 雖然也是透過 StorageClass 建立的 PVC,但相比原生 Kubernetes 省去了建立 PV、PVC 和重新掛載的步驟,以及重複性的操作。在 Rainbond 中只需要將底層儲存類更換,然後遷移 Rainbond 所建立的一整個目錄,最後重新在頁面中修改掛載即可完成遷移。
本文將講述如何遷移 Rainbond 預設的 NFS 儲存到外部 NFS 儲存,大致分為以下幾個步驟:
- 部署外部 NFS 儲存並對接到 K8s 上。
- 備份 NFS 儲存的資料。
- 恢復備份資料並切換 Rainbond 預設儲存至外部儲存。
注意:
- 關閉正在執行的應用,避免增量資料導致資料不一致。
- 元件掛載的儲存必須是共享儲存,其他儲存則需要單獨遷移。
部署 NFS 並對接到 K8s 上
外部 NFS 儲存可以選擇部署 NFS 雙機熱備或其他方案,這裡就不演示了,以單節點 NFS 為例。
在 Centos 上部署 NFS
- 安裝
nfs-utils
yum install -y nfs-utils
- 建立共享目錄
mkdir -p /data
- 編輯
/etc/exports
檔案,新增如下內容:
$ vim /etc/exports
/data *(rw,sync,insecure,no_subtree_check,no_root_squash)
- 配置完成後,執行以下命令啟動 NFS 服務:
systemctl enable nfs-server
systemctl start nfs-server
- 驗證 NFS 是否可用
showmount -e 172.20.251.94
在 K8s 中部署 NFS Client
下面將外部的 NFS 儲存對接到 Kubernetes 上,在 Kubernetes 中部署 NFS Client Provisioner
-
安裝 Helm 命令
-
新增 Helm Chart 倉庫
helm repo add rainbond https://openchart.goodrain.com/goodrain/rainbond
- 安裝 NFS-Client-Provisioner
helm install nfs-client-provisioner rainbond/nfs-client-provisioner \
--set nfs.server=172.20.251.94 \
--set nfs.path=/data \
--version 1.2.8
- 驗證 NFS Client 是否可用,建立 PVC 驗證。
$ vim test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
$ kubectl apply -f test-pvc.yaml
查詢 PVC 狀態為 Bound 則正常。
備份預設 NFS 的資料
檢視 rbd-system
下所有的 PVC。
kubectl get pvc -n rbd-system
PVC名稱 | 解釋 |
---|---|
data | 測試儲存是否正常預設建立的PVC(無用) |
data-nfs-provisioner-0 | NFS Pod所使用的PVC,預設路徑在宿主機的/opt/rainbond/data/nfs 下。 |
data-rbd-monitor-0 | 儲存監控資料。(可不要) |
rbd-api | 儲存 api request 請求日誌。(可不要) |
rbd-chaos-cache | 儲存構建元件的快取(可不要) |
rbd-cpt-grdata | 儲存平臺上所有元件掛載共享儲存資料,以及元件的日誌。(必須) |
rbd-db-rbd-db-0 | 儲存 MySQL 資料,預設是存在本地的,沒儲存在 NFS 中。 |
rbd-etcd-rbd-etcd-0 | 儲存 Etcd 資料,預設是存在本地的,沒儲存在 NFS 中。 |
rbd-hub | 儲存映象資料(必須) |
以上資料中對於我們要遷移的重要資料有 rbd-cpt-grdata
和 rbd-hub
,根據 VOLUME
名稱在預設的儲存目錄 /opt/rainbond/data/nfs
下查詢,例如 pvc-9ec619e3-1e20-4d7a-b744-aa04088fb6c3
。
使用 rsync 同步工具,將資料同步到新的 NFS 儲存伺服器上,根據以下命令開始同步,根據實際情況修改命令。
rsync -avP /opt/rainbond/data/nfs/pvc-9ec619e3-1e20-4d7a-b744-aa04088fb6c3 root@172.20.251.94:/data
rsync -avP /opt/rainbond/data/nfs/pvc-d0bf09ca-5543-4050-bd08-b02ebb593b4e root@172.20.251.94:/data
注意:資料同步完成後切記要校驗資料的完整性。
切換 Rainbond 儲存
更改 Rainbond 預設儲存
- 修改
rainbondcluster
CRD資源,新增storageClassName
$ kubectl edit rainbondcluster -n rbd-system
spec:
rainbondVolumeSpecRWX:
storageClassName: nfs-client #由 NFS-Client-Provisioner 建立的 sc
- 修改
rainbondvolumes
CRD資源,修改storageClassName
為nfs-client
$ kubectl edit rainbondvolumes -n rbd-system
spec:
storageClassName: nfs-client
- 刪除 Rainbond 基於預設 NFS 建立的 StorageClass
rainbondsssc
rainbondslsc
kubectl delete sc rainbondsssc rainbondslsc
- 刪除
rbd-system
名稱空間下舊的 PVC。這時候會刪除不掉,因為還有 POD 在使用該 PVC,先ctrl c
結束。
kubectl delete pvc data data-rbd-monitor-0 rbd-api rbd-chaos-cache rbd-cpt-grdata rbd-hub -n rbd-system
- 刪除 Rainbond 元件的控制器讓
rainbond-operator
控制 PVC 重新建立。
kubectl delete deploy rbd-api -n rbd-system
kubectl delete ds rbd-chaos -n rbd-system
kubectl delete sts rbd-monitor -n rbd-system
kubectl delete deploy rbd-worker -n rbd-system
kubectl delete deploy rbd-hub -n rbd-system
kubectl delete deploy rbd-resource-proxy -n rbd-system
kubectl delete sts rbd-eventlog -n rbd-system
kubectl delete ds rbd-node -n rbd-system
kubectl delete pod -l release=rainbond-operator -n rbd-system
等待所有 POD 重新建立,建立完成後 Rainbond 平臺可正常訪問,正常工作。
恢復資料
下面將前面備份的資料恢復到新建立的 PVC 中。
此時 rbd-cpt-grdata
和 rbd-hub
新建立的目錄下的資料都是自動建立,先將其刪除。
rm -rf /data/rbd-system-rbd-cpt-grdata-pvc-44167209-1006-4de5-9801-afcce996449c/*
rm -rf /data/rbd-system-rbd-hub-pvc-c326b89f-7c0e-4990-a8e2-31472799ccc8/*
再將備份的 rbd-cpt-grdata
和 rbd-hub
資料分別同步到新的目錄中,例如以下命令。
rsync -avP /data/pvc-9ec619e3-1e20-4d7a-b744-aa04088fb6c3/* /data/rbd-system-rbd-cpt-grdata-pvc-44167209-1006-4de5-9801-afcce996449c
rsync -avP /data/pvc-d0bf09ca-5543-4050-bd08-b02ebb593b4e /data/rbd-system-rbd-hub-pvc-c326b89f-7c0e-4990-a8e2-31472799ccc8
注意:資料同步完成後切記要校驗資料的完整性。
重新 Rainbond 部分元件的 POD 生效。
kubectl delete pod -l name=rbd-api -n rbd-system
kubectl delete pod -l name=rbd-chaos -n rbd-system
kubectl delete pod -l name=rbd-monitor -n rbd-system
kubectl delete pod -l name=rbd-worker -n rbd-system
kubectl delete pod -l name=rbd-hub -n rbd-system
kubectl delete pod -l name=rbd-resource-proxy -n rbd-system
kubectl delete pod -l name=rbd-eventlog -n rbd-system
kubectl delete pod -l name=rbd-node -n rbd-system
更改 Rainbond 上的元件儲存
替換底層儲存後,此時 Rainbond 上元件的儲存還未修改,此時需要進入 Rainbond 的元件中將當前儲存刪除重新新增。
掛載路徑、儲存型別保持不變,刪除當前的配置新增新的同樣配置即可。
至此儲存切換完成,後續請驗證應用的資料是否都完整。
刪除預設 NFS 儲存資源(可選)
修改 CRD 資源,將 nfs-provisioner
replicas 設定為 0
$ kubectl edit rbdcomponent nfs-provisioner -n rbd-system
spec:
replicas: 0
刪除 nfs-provisioner
控制器
kubectl delete sts nfs-provisioner -n rbd-system
刪除 nfs-provisioner 的 PV、PVC
kubectl delete pvc data-nfs-provisioner-0 -n rbd-system
kubectl delete pv nfs-provisioner
刪除宿主機上的 NFS 資料儲存目錄
rm -rf /opt/rainbond/data/nfs