使用LocalPV动态存储卷时,无需预先手动创建PV,只需在创建PVC时指定本地存储类(StorageClass),存储插件cstor-csi即会自动以子目录形式创建对应的PV资源。
此模式为推荐方案,您可专注于工作负载的存储需求,无需提前手动创建和配置存储资源,从而降低底层基础设施的复杂度。
前提条件
已创建容器集群
已在插件市场安装存储插件cstor-csi,且插件正常运行。(建议使用>=4.0的CSI版本)
使用限制
cstor-csi插件安装版本要求3.4.0及以上;
本地存储卷取决于底层节点的可用性,如果节点变得不健康,那么存储卷也将变得不可被 Pod 访问,影响Pod运行;
如果需要指定节点使用本地存储卷,可以通过以下两种方式:
1、创建持久卷声明PVC时,通过设置节点亲和来指定本地存储使用节点;
2、StorageClass创建时指定绑定策略WaitForFirstConsumer模式,创建工作负载指定节点亲和或者NodeSelector,通过pod调度决定存储使用节点。
通过控制台使用LocalPV动态存储卷
1、创建存储类(StorageClass)
登录“云容器引擎管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“存储类”,单击左上角“创建”;
在创建对话框,配置存储类StorageClass的相关参数。配置项说明如下:
| 配置项 | 说明 |
|---|---|
| 名称 | StorageClass的名称。 |
| 存储类型 | 前支持云盘、弹性文件、对象存储、并行文件、海量文件和本地存储,这里选择本地存储。 具体创建页中展示的存储类型由当前资源池支持情况决定。 |
| 存储驱动 | 采用默认CSI驱动。 |
| 回收策略 | 回收策略,默认为Deleted。
如果对数据安全性要求高,推荐使用Retain方式,以免误删数据 |
| 绑定策略 | 绑定策略,默认为Immediate。
|
| 支持扩容 | 开关默认打开,也建议打开。 如果开关关闭,则使用该存储类的pvc无法扩容。 |
| 参数 |
|
| 挂载选项 | 挂载参数,用户可根据自己的情况实际定制相关参数。比如设置挂载参数为:discard:表示在挂载文件系统时指定 discard 参数,文件系统中删除文件后会自动触发 discard 操作,通知块设备释放掉未使用的 Block 。 |
参数配置完成后,点击“确定”。创建成功后,可以在存储类列表查看。
2、创建持久卷声明(PVC)
进入主菜单“存储”——“持久卷声明”,单击左上角“创建持久卷声明”;
在创建对话框,配置持久卷声明PVC的相关参数。配置项说明如下:
| 配置项 | 说明 |
|---|---|
| 名称 | PVC的名称 |
| 存储声明类型 | 前支持云盘、弹性文件、对象存储、并行文件、海量文件和本地存储,这里选择本地存储。 |
| 分配模式 | 这里选择“使用存储类”。 |
| StorageClass名称 | 选择上一步创建的StorageClass。 |
| 容量 | 根据业务需求自定义容量。 |
| 卷模式 |
|
| 访问模式 |
|
| 高级选项 | 节点:可以根据需要手动选择PVC对应存储的节点。该操作即在PVC上打上注解如下:topology.kubernetes.io/zone: {节点名} |
参数配置完成后,点击“确定”。创建成功后,可以在持久卷声明列表查看。
进入持久卷声明列表页,等待PVC状态为“已绑定” 。此时,进入主菜单“存储”——“持久卷“,可以看到对应的PV创建 。
PV创建完成后,可以登录指定节点,进入StorageClass配置挂载目录,可以看到以PV名称命名的子目录。
如果PVC一直未绑定,可以查看进入对应PVC详情页查看事件,或者查看cstor-csi日志进行定位。
3、创建工作负载
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“工作负载”——“有状态”,单击左上角“创建SatefulSet”;
在创建对话框,数据存储栏中,选择添加存储卷,卷类型选择“已有存储卷申明(PVC)”,操作栏选择“选择已有存储申明”;根据自己需要设置挂载路径、子路径和权限,
参数说明:
挂载路径:存储挂载到容器后,容器内部显示的路径地址。不建议使用类似于/usr或者/tmp类似的已有的容器目录路径,可能会造成目录相互遮蔽。
子路径:需要挂载的存储源地址的子目录
权限:读写/只读
示例:将PVC“local”对应存储的subpath指向的子目录(subpath为空表示使用根目录)挂载到容器里的/test路径上。
所有的信息都配置完成后,单击“提交”,创建成功后,您可以正常使用数据卷。
通过kubectl命令行使用LocalPV动态存储卷
1、创建存储类(StorageClass)
使用kubectl连接集群,创建示例yaml文件sc-example.yaml:
apiVersion: "storage.k8s.io/v1"
kind: "StorageClass"
metadata:
name: "test-localpv"
allowVolumeExpansion: true
parameters:
# 基础存储路径
baseStor: "/mnt"
type: "localpv"
provisioner: "local.csi.cstor.com"
reclaimPolicy: "Delete"
volumeBindingMode: "Immediate"执行以下命令,创建StorageClass
kubectl apply -f sc-example.yaml查看创建的StorageClass:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“存储类”,在存储类列表查看。
2、创建持久卷声明(PVC)
使用kubectl连接集群,创建示例yaml文件pvc-example.yaml:
apiVersion: "v1" kind: "PersistentVolumeClaim" metadata: name: "localpv-pvc" namespace: "default" spec: accessModes: - "ReadWriteOnce" resources: requests: storage: "1Gi" storageClassName: "test-localpv" volumeMode: "Filesystem"执行以下命令,创建PVC
kubectl apply -f pvc-example.yaml查看创建的PVC:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”——“持久卷声明”,在列表查看。
3、创建工作负载
使用kubectl连接集群,创建示例yaml文件sts-example.yaml:
apiVersion: "apps/v1"
kind: "StatefulSet"
metadata:
name: "localpv-sts"
namespace: "default"
spec:
podManagementPolicy: "OrderedReady"
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
name: "localpv-sts"
serviceName: ""
template:
metadata:
labels:
app: ""
ccse_app_name: ""
kubernetes.io/qos: "None"
name: "localpv-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: "/ccetmp"
name: "volume1"
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: "volume1"
persistentVolumeClaim:
claimName: "localpv-pvc"
updateStrategy:
rollingUpdate:
partition: 0
type: "RollingUpdate"执行以下命令,创建StatefulSet
kubectl apply -f sts-example.yaml查看创建的有状态负载:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“工作负载”——“有状态”,在列表查看。
验证数据持久化
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“工作负载”——“有状态”,进入负载详情;
在Pod列表页,选择“远程登录”,进入到容器内执行以下命令:
向/ccetmp 目录下写一个文件,执行echo "Hello World" > /ccetmp/test.log
查看/ccetmp目录下文件,执行ls /ccetmp,预期结果如下:
lost+found test.log登录pod所在节点,进入StorageClass配置挂载目录下以PV名称命名的子目录,可以看到容器内文件:
退出pod的“远程登录”,对上一步中的Pod执行“销毁重建”,等待Pod重新运行正常;
对新建Pod,继续执行“远程登录”,进入到容器内查看数据。执行cat /tmp/test.log,预期结果如下:
Hello World以上步骤说明,pod删除重建后,数据仍然存在,说明数据可持久化保存。