Kubernetes跨StorageClass遷移,切換Rainbond預設SC

2023-10-26 21:00:30

基於主機安裝基於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 儲存,大致分為以下幾個步驟:

  1. 部署外部 NFS 儲存並對接到 K8s 上。
  2. 備份 NFS 儲存的資料。
  3. 恢復備份資料並切換 Rainbond 預設儲存至外部儲存。

注意:

  • 關閉正在執行的應用,避免增量資料導致資料不一致。
  • 元件掛載的儲存必須是共用儲存,其他儲存則需要單獨遷移。

部署 NFS 並對接到 K8s 上

外部 NFS 儲存可以選擇部署 NFS 雙機熱備或其他方案,這裡就不演示了,以單節點 NFS 為例。

在 Centos 上部署 NFS

  1. 安裝 nfs-utils
yum install -y nfs-utils
  1. 建立共用目錄
mkdir -p /data
  1. 編輯 /etc/exports 檔案,新增如下內容:
$ vim /etc/exports

/data *(rw,sync,insecure,no_subtree_check,no_root_squash)
  1. 設定完成後,執行以下命令啟動 NFS 服務:
systemctl enable nfs-server
systemctl start nfs-server
  1. 驗證 NFS 是否可用
showmount -e 172.20.251.94

在 K8s 中部署 NFS Client

下面將外部的 NFS 儲存對接到 Kubernetes 上,在 Kubernetes 中部署 NFS Client Provisioner

  1. 安裝 Helm 命令

  2. 新增 Helm Chart 倉庫

helm repo add rainbond https://openchart.goodrain.com/goodrain/rainbond
  1. 安裝 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
  1. 驗證 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-grdatarbd-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 [email protected]:/data
rsync -avP /opt/rainbond/data/nfs/pvc-d0bf09ca-5543-4050-bd08-b02ebb593b4e [email protected]:/data

注意:資料同步完成後切記要校驗資料的完整性。

切換 Rainbond 儲存

更改 Rainbond 預設儲存

  1. 修改 rainbondcluster CRD資源,新增 storageClassName
$ kubectl edit rainbondcluster -n rbd-system

spec:
  rainbondVolumeSpecRWX:
    storageClassName: nfs-client #由 NFS-Client-Provisioner 建立的 sc
  1. 修改 rainbondvolumes CRD資源,修改 storageClassNamenfs-client
$ kubectl edit rainbondvolumes -n rbd-system

spec:
  storageClassName: nfs-client
  1. 刪除 Rainbond 基於預設 NFS 建立的 StorageClass rainbondsssc rainbondslsc
kubectl delete sc rainbondsssc rainbondslsc
  1. 刪除 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
  1. 刪除 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-grdatarbd-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-grdatarbd-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