云容器引擎服務提供cstor-csi插件,支持通過LVM方式,基于容器集群節點上的硬盤,虛擬化成一個小型存儲池,當需要特定份額的存儲時,從中劃分出對應份額的磁盤供業務容器使用。
使用LocalPV、HostPath都可以實現Pod對主機存儲空間的訪問,但均具有一定局限性,比如無法做到容量隔離、無法限制IOPS/吞吐等、無法直觀了解各節點存儲空間余量從而進行合理調度。基于此,云容器引擎提供LVM數據卷方案,以解決上述問題。
前提條件
已創建容器集群
該功能使用風險、限制較多,默認控制臺不對外開放。如需使用,請通過工單方式聯系相關人員添加功能白名單。
安裝存儲插件cstor-csi,插件配置參數localStorPlugins開啟lvm插件。如插件已安裝,可以通過“插件實例”——“cstor-csi”——“更新”,配置localStorPlugins: "lvm,localpv",實現插件配置更新。
使用限制
cstor-csi插件安裝版本要求3.4.0及以上;
如果節點池默認配置數據盤,那么新增節點的第一塊數據盤(供容器運行時和Kubelet組件使用)不支持導入為存儲池。
創建存儲池將占用磁盤設備,必要時會進行格式化操作。為避免數據丟失,請務必確認磁盤設備存在,并可用于存儲池。
存儲池配置或者修改,默認10min生效,如需調整,可以更新cstor-csi插件配置參數configEffectInterval實現。
存儲池不支持縮容和刪除;如果刪除節點上存儲池的磁盤,會導致存儲池異常。
LVM本地存儲卷,不支持數據的跨節點遷移,不適合在高可用場景中使用。
請勿自行對節點上的本地存儲資源(例如VG,PV,LV)以及插件運行需要的CRD(包括NodeStorageManager、CStorLocalStorage)進行修改或刪除;
流程概述
| 步驟 | 操作 |
|---|---|
| 1 | 確定要使用LVM數據卷的節點以及磁盤設備。推薦對指定節點新增數據盤,專用于存儲池。 |
| 2 | 創建本地存儲池。 |
| 3 | 創建本地存儲類StorageClass。 |
| 4 | 創建本地存儲類型PVC。 |
| 5 | 基于已創建PVC,創建工作負載。 |
通過控制臺使用LVM動態存儲卷
1、創建存儲池
登錄“云容器引擎管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“存儲”——“本地存儲池”,單擊左上角“創建存儲池”;
在創建對話框,配置存儲池相關參數。配置項說明如下:
| 配置項 | 說明 |
|---|---|
| 名稱 | 存儲池名稱。 |
| 存儲類型 | 這里選擇LVM。 |
| 選擇節點 | 選擇用于添加到存儲池的節點。 |
| 磁盤設備 | 選擇用于添加到存儲池的磁盤設備。 說明: 創建存儲池將占用磁盤設備,必要時會進行格式化操作。為避免數據丟失,請務必確認磁盤設備存在,并可用于存儲池。 |
參數配置完成后,點擊“確定”。創建成功后,可以在存儲池列表查看。
2、創建存儲類(StorageClass)
登錄“云容器引擎管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“存儲”——“存儲類”,單擊左上角“創建”;
在創建對話框,配置存儲類StorageClass的相關參數。配置項說明如下:
| 配置項 | 說明 |
|---|---|
| 名稱 | StorageClass的名稱。 |
| 存儲類型 | 當前支持云盤、彈性文件、對象存儲、本地存儲、并行文件,這里選擇本地存儲。 具體創建頁中展示的存儲類型由當前資源池支持情況決定。 |
| 存儲驅動 | 對應StorageClass yaml中provisioner,值為local.csi.cstor.com。 |
| 回收策略 | 回收策略,默認為Deleted。Retained(保留):用戶可以手動回收資源。當PVC對象被刪除時,PV 卷仍然存在,對應的數據卷被視為"已釋放(released)"。 Deleted(刪除):對于支持 Delete 回收策略的卷插件,刪除動作會將PV對象從 Kubernetes 中移除,同時也會從外部基礎設施中移除所關聯的存儲資產。如果對數據安全性要求高,推薦使用Retain方式,以免誤刪數據。 |
| 綁定策略 | 綁定策略,默認為Immediate。 Immediate 模式:表示一旦創建了 PVC,也就完成了卷綁定和動態供應。 對于由于拓撲限制而非集群所有節點可達的存儲后端,PV會在不知道 Pod 調度要求的情況下綁定或者制備。WaitForFirstConsumer模式: 該模式將延遲 PV的綁定和制備,直到使用該 PVC的 Pod 被創建。 PV會根據 Pod 調度約束指定的拓撲來選擇或供應。 |
| 參數 | 本地存儲類型:參數鍵為type;該場景下選擇lvm。存儲池:參數鍵為baseStor,選擇上一步創建的存儲池。 掛在類型:參數鍵為csi.storage.k8s.io/fstype,支持參數值包括ext4、xfs。 |
| 掛載選項 | 掛載參數,用戶可根據自己的情況實際定制相關參數。 |
參數配置完成后,點擊“確定”。創建成功后,可以在存儲類列表查看。
2、創建持久卷聲明(PVC)
進入主菜單“存儲”——“持久卷聲明”,單擊左上角“創建持久卷聲明”;
在創建對話框,配置持久卷聲明PVC的相關參數。配置項說明如下:
| 配置項 | 說明 |
|---|---|
| 名稱 | PVC的名稱。 |
| 存儲聲明類型 | 當前支持云盤、彈性文件、對象存儲、本地存儲、并行文件,這里選擇本地存儲。具體創建頁中展示的存儲類型由當前資源池支持情況決定。 |
| 分配模式 | 這里選擇“使用存儲類”。 |
| StorageClass名稱 | 選擇上一步創建的StorageClass。 |
| 容量 | 根據業務需求自定義容量。 |
| 卷模式 | * 文件系統(Filesystem):默認方式,該類型卷會被 Pod 掛載(Mount) 到某個目錄。 如果卷的存儲來自某塊設備而該設備目前為空,Kuberneretes 會在第一次掛載卷之前在設備上創建文件系統。* 塊設備(Block):這類卷以塊設備的方式交給 Pod 使用,其上沒有任何文件系統。 這種模式對于為 Pod 提供一種使用最快可能方式來訪問卷而言很有幫助, Pod 和卷之間不存在文件系統層。 |
| 訪問模式 | * ReadWriteOnce:卷可以被一個節點以讀寫方式掛載。 |
參數配置完成后,點擊“確定”。創建成功后,可以在持久卷聲明列表查看。
進入持久卷聲明列表頁,等待PVC狀態為“已綁定” 。此時,進入主菜單“存儲”——“持久卷“,可以看到對應的PV創建 。
如果PVC一直未綁定,可以查看進入對應PVC詳情頁查看事件,或者查看cstor-csi日志進行定位。
3、創建工作負載
登錄“云容器引擎”管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“工作負載”——“有狀態”,單擊左上角“創建SatefulSet”;
在創建對話框,數據卷欄中,選擇添加數據卷,卷類型選擇“使用已有PVC”,操作欄選擇“添加已有PVC”;
在實例內容器欄,為容器設置掛載點。選擇添加掛載點,選擇數據卷為上一步創建,根據需要配置容器路徑和權限;
所有的信息都配置完成后,單擊 “提交” 。
創建成功后,您就可以正常使用數據卷。
通過kubectl命令行使用LocalPV動態存儲卷
1、創建存儲類(StorageClass)
使用kubectl連接集群,創建示例yaml文件sc-example.yaml:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: cstor-csi-local-lvm-sc
provisioner: local.csi.cstor.com
parameters:
# 產品類型
type: lvm
# 所需掛載文件系統,當前支持ext4和xfs
csi.storage.k8s.io/fstype: xfs
# 基礎存儲
baseStor: vg2
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard執行以下命令,創建StorageClass
kubectl apply -f sc-example.yaml查看創建的StorageClass:
登錄“云容器引擎”管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“存儲”——“存儲類”,在存儲類列表查看。
2、創建持久卷聲明(PVC)
使用kubectl連接集群,創建示例yaml文件pvc-example.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cstor-pvc-local-lvm
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: cstor-csi-local-lvm-sc執行以下命令,創建PVC
kubectl apply -f pvc-example.yaml查看創建的PVC:
登錄“云容器引擎”管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“存儲”——“持久卷聲明”,在存儲類列表查看。
3、創建工作負載
使用kubectl連接集群,創建示例yaml文件sts-example.yaml:
apiVersion: "apps/v1"
kind: "StatefulSet"
metadata:
name: "lvm-sts"
namespace: "default"
spec:
podManagementPolicy: "OrderedReady"
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
name: "lvm-sts"
serviceName: ""
template:
metadata:
labels:
app: ""
ccse_app_name: ""
kubernetes.io/qos: "None"
name: "lvm-sts"
source: "CCSE"
spec:
containers:
- image: "nginx:1.23.2-alpine"
imagePullPolicy: "IfNotPresent"
name: "container1"
resources:
limits:
cpu: "100m"
memory: "128Mi"
requests:
cpu: "100m"
memory: "128Mi"
terminationMessagePath: "/dev/termination-log"
terminationMessagePolicy: "File"
volumeMounts:
- mountPath: "/tmp"
name: "volume1"
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: "volume1"
persistentVolumeClaim:
claimName: "cstor-pvc-local-lvm"
updateStrategy:
rollingUpdate:
partition: 0
type: "RollingUpdate"執行以下命令,創建StatefulSet
kubectl apply -f sts-example.yaml查看創建的有狀態負載:
登錄“云容器引擎”管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“工作負載”——“有狀態”,在存儲類列表查看。
驗證數據持久化
登錄“云容器引擎”管理控制臺;
在集群列表頁點擊進入指定集群;
進入主菜單“工作負載”——“有狀態”,進入負載詳情;
在Pod列表頁,選擇“遠程登錄”,進入到容器內執行以下命令:
1、向/tmp 目錄下寫一個文件,執行echo "Hello World" > /tmp/test.log
2、查看/tmp目錄下文件,執行ls /tmp,預期結果如下:
lost+found test.log退出pod的“遠程登錄”,對上一步中的Pod執行“銷毀重建”,等待Pod重新運行正常;
對新建Pod,繼續執行“遠程登錄”,進入到容器內查看數據。執行cat /tmp/test.log,預期結果如下:
Hello World以上步驟說明,pod刪除重建后,數據仍然存在,說明數據可持久化保存。