使用LocalPV静态存储卷,即:使用kubernetes原生本地存储能力,将本地存储设备,例如磁盘、分区或者目录挂载至Pod中。通过手动在控制台创建PV,创建PVC时使用已有PV的方式,实现容器内挂载本地存储。
该模式下需要用户自建PV资源,一定程度上增加操作和管理复杂性,一般推荐使用动态创建存储的方式。
使用限制
- 本地存储卷取决于底层节点的可用性,如果节点变得不健康,那么存储卷也将变得不可被 Pod 访问,影响Pod运行。
- 请勿对本地存储卷或者上层目录自行执行删除操作,否则带来数据丢失风险。
- 使用LocalPV静态存储卷支持节点调度,但不支持自动创建目录,使用前需保证指定节点配置目录已存在。
通过控制台使用LocalPV静态存储卷
1、创建持久卷(PV)
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“存储”——“持久卷”,单击左上角“创建持久卷”;
配置项 |
说明 |
---|---|
名称 | PV的名称 |
持久卷类型 | 这里选择通用。 |
容量 | 根据业务需求自定义容量 |
访问模式 | ReadWriteOnce:卷可以被一个节点以读写方式挂载 |
回收策略 | 当PVC释放时如何处理该数据卷。回收策略包括:Retained(保留):用户可以手动回收资源。当PVC对象被删除时,PV 卷仍然存在,对应的数据卷被视为"已释放(released)"。 Deleted(删除):对于支持 Delete 回收策略的卷插件,删除动作会将PV对象从 Kubernetes 中移除,同时也会从外部基础设施中移除所关联的存储资产。 |
参数 |
类型:包括NFS、Local,这里选择Local;方式:包括指定节点、指定节点标签,可以根据业务需求选择; LocalPV的目录:要求指定节点或者指定标签节点中目录存在,否则会出现挂载失败; |
卷模式 |
文件系统(Filesystem):默认方式,该类型卷会被 Pod 挂载(Mount) 到某个目录。 如果卷的存储来自某块设备而该设备目前为空,Kuberneretes 会在第一次挂载卷之前在设备上创建文件系统。 块设备(Block): 以将 local 卷作为原始块设备暴露出来。 |
挂载选项 | 挂载参数,用户可根据自己的情况实际定制相关参数。 |
说明静态导入场景下,回收策略均默认Retain,cstor-csi不会删除数据。
- 参数配置完成后,点击“确定”。创建成功后,可以在持久卷列表查看,此时PV状态为“可用”。
2、创建持久卷声明(PVC)
- 进入主菜单“存储”——“持久卷声明”,单击左上角“创建持久卷声明”;
- 在创建对话框,配置持久卷声明PVC的相关参数。配置项说明如下:
配置项 |
说明 |
---|---|
名称 | PVC的名称 |
存储声明类型 | 这里选择通用。 |
分配模式 | 这里选择“已有存储卷” |
持久卷名称 | 选择上一步创建的PV名称 |
- 参数配置完成后,点击“确定”。创建成功后,可以在持久卷声明列表查看。
- 进入持久卷声明列表页,等待PVC状态为“已绑定” 。
3、创建工作负载
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“工作负载”——“有状态”,单击左上角“创建SatefulSet”;
- 在创建对话框,数据卷栏中,选择添加数据卷,卷类型选择“使用已有PVC”,操作栏选择“添加已有PVC”;
- 在实例内容器栏,为容器设置挂载点。选择添加挂载点,选择数据卷为上一步创建,根据需要配置容器路径和权限;
- 所有的信息都配置完成后,单击 “提交” 。
创建成功后,您就可以正常使用数据卷。
通过kubectl命令行使用云盘静态存储卷
1、创建持久卷(PV)
使用kubectl连接集群,创建示例yaml文件pv-example.yaml:
apiVersion: "v1"
kind: "PersistentVolume"
metadata:
name: "local-pv-k8s"
spec:
accessModes:
- "ReadWriteOnce"
capacity:
storage: "1Gi"
local:
path: "/zy1"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: "kubernetes.io/hostname"
operator: "In"
values:
- "ccseagent-29999e7689"
persistentVolumeReclaimPolicy: "Retain"
volumeMode: "Filesystem"
执行以下命令,创建PV
kubectl apply -f pv-example.yaml
查看创建的PV:
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单“存储”——“持久卷”,在持久卷列表查看。
2、创建持久卷声明(PVC)
使用kubectl连接集群,创建示例yaml文件pvc-example.yaml:
apiVersion: "v1"
kind: "PersistentVolumeClaim"
metadata:
name: "local-pvc-k8s"
namespace: "default"
spec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "1Gi"
volumeMode: "Filesystem"
volumeName: "local-pv-k8s"
执行以下命令,创建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: "/tmp"
name: "volume1"
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
schedulerName: "default-scheduler"
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: "volume1"
persistentVolumeClaim:
claimName: "local-pvc-k8s"
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所在节点,进入PV配置使用目录,可以看到容器内文件:
- 退出pod的“远程登录”,对上一步中的Pod执行“销毁重建”,等待Pod重新运行正常;
- 对新建Pod,继续执行“远程登录”,进入到容器内查看数据。执行cat /tmp/test.log,预期结果如下:
Hello World
- 以上步骤说明,pod删除重建后,数据仍然存在,说明数据可持久化保存。