OpenShift OKD 实验手册:持久化存储实战 (MySQL 案例)
1. 实验目标
- 理解 Kubernetes/OpenShift 中的持久化存储模型:PV (Persistent Volume) 与 PVC (Persistent Volume Claim)。
- 掌握如何在 OpenShift 中配置存储并将其挂载到有状态应用 (MySQL)。
- 进阶目标:安装 LVM Storage Operator,实现存储的动态按需分配。
2. 背景知识
- 静态存储:管理员手动创建 PV,开发者创建 PVC 绑定。繁琐,不灵活。
- 动态存储:开发者只需创建 PVC,StorageClass (SC) 会通过 Operator 自动在后端磁盘上创建 PV。
- LVM Storage (LVMS):利用节点上未使用的磁盘空间(或分区)通过 LVM 技术虚拟化出多个卷,是 SNO 环境动态存储的首选。
3. 核心概念深度解析 (餐厅模型类比)
为了理解这三者的关系,我们可以想象一个餐厅的运行流程:
3.1 PersistentVolume (PV) —— “一盘做好的菜”
- 定义:PV 是集群中的真实存储资源。它由管理员手动创建(静态)或由 StorageClass 自动创建(动态)。
- 特点:
- 它是集群级别的资源,不属于任何特定的命名空间。
- 它有具体的物理属性(如:大小为 10Gi,存储在 /mnt/data 下)。
- 它的生命周期独立于 Pod。Pod 删了,PV 里的数据依然可以保留。
3.2 PersistentVolumeClaim (PVC) —— “点菜单”
- 定义:PVC 是用户或应用对存储的请求/声明。
- 特点:
- 它是项目(Namespace)级别的资源。
- 它不关心底层物理硬盘在哪,它只说:“我需要一个 5GB 的空间,且支持读写(ReadWriteOnce)”。
- 系统会自动寻找满足要求的 PV 并与之“绑定 (Bound)”。
3.3 StorageClass (SC) —— “自动做菜机/菜单模板”
- 定义:SC 定义了创建存储的方法。它让系统具备了“动态分配”的能力。
- 特点:
- 它是一个工厂。当它看到一份 PVC(订单)时,它会根据预设的参数(如:VMware 磁盘类型、加密方式),自动去后端存储拉起一块硬盘,并自动生成对应的 PV。
- 有了 SC,管理员不再需要手动预创建 PV。
4. 三者的关系图
协作流程总结:
- 静态模式:管理员手动建 PV -> 用户发 PVC -> 系统匹配绑定。
- 动态模式:管理员配置 SC -> 用户发 PVC -> SC 自动生产 PV 并绑定。
5. 资源创建的先后顺序
根据存储分配模式的不同,创建顺序有本质区别:
5.1 动态存储模式 (推荐/自动化)
这种模式下,PV 是“按需生产”的。
- StorageClass (SC):管理员预先配置好存储类(工厂)。
- PersistentVolumeClaim (PVC):开发人员提交存储申请(订单)。
- PersistentVolume (PV):系统自动生成。SC 监测到 PVC 后,自动在后端创建 PV 并完成绑定。
- 顺序:SC →\rightarrow→ PVC →\rightarrow→ PV (自动)
5.2 静态存储模式 (手动/传统)
这种模式下,PV 是“现货供应”的。
- PersistentVolume (PV):管理员手动划定物理空间,并定义 PV 对象(入库)。
- PersistentVolumeClaim (PVC):开发人员提交存储申请。
- 绑定:系统寻找库房中满足 PVC 条件的现有 PV 进行绑定。
- 顺序:PV →\rightarrow→ PVC
避坑指南:
- 在动态模式下,永远不要手动创建 PV,否则 SC 可能无法接管该卷。
- 在静态模式下,如果你先创建了 PVC 而没有对应的 PV,PVC 会一直处于
Pending(等待)状态。
6. 实操指南:如何编写并运行 YAML 配置
在 OpenShift 中,所有的资源(PV, PVC, Deployment 等)都通过 YAML 文件定义。
6.1 配置文件放哪里?
你可以直接在 132 节点 (SNO 节点) 上创建这些文件。因为该节点已经配置好了 oc 命令工具。
6.2 如何创建文件?
推荐使用 cat 命令快速创建文件(直接复制粘贴以下代码到终端即可):
# 示例:创建 PV 配置文件
cat <<EOF > mysql-pv-static.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-manual
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/data/mysql
storageClassName: manual
EOF
6.3 如何使配置生效?
使用 oc apply 命令将文件内容递交给集群 API:
# 执行此命令后,集群会按照 YAML 描述创建资源
oc apply -f mysql-pv-static.yaml
6.4 如何检查生效状态?
# 查看资源列表及其状态
oc get pv
oc get pvc
7. 第一阶段:基础实践 (手动 PV)
如果您还没有未分配的磁盘,可以使用此方法快速开始。
步骤 1:在节点准备目录
ssh core@192.168.179.132
sudo mkdir -p /mnt/data/mysql
sudo chmod 777 /mnt/data/mysql
sudo chcon -Rt svirt_sandbox_file_t /mnt/data/mysql
步骤 2:创建静态 PV 和 PVC
请依次复制并运行以下两段代码,系统会自动创建 YAML 文件并立即使其生效。
1. 创建并应用 PV (持久化卷)
cat <<EOF > mysql-pv-static.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-manual
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /mnt/data/mysql
storageClassName: manual
EOF
oc apply -f mysql-pv-static.yaml
2. 创建并应用 PVC (持久化卷声明)
cat <<EOF > mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
EOF
oc apply -f mysql-pvc.yaml
# 验证状态 (期望结果: Bound)
oc get pv,pvc
8. 第二阶段:进阶实践 (动态存储 - LVM Storage)
这是本实验的核心! 我们将让集群具备“自动生产磁盘”的能力。
步骤 1:安装 LVM Storage Operator
请执行以下代码安装 Operator:
cat <<EOF > lvm-operator-sub.yaml
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: lvms-operator
namespace: openshift-storage
spec:
channel: stable-4.21
installPlanApproval: Automatic
name: lvms-operator
source: redhat-operators
sourceNamespace: openshift-marketplace
EOF
oc apply -f lvm-operator-sub.yaml
步骤 2:创建 LVM 集群配置 (LVMCluster)
cat <<EOF > lvm-cluster.yaml
apiVersion: lvm.topolvm.io/v1alpha1
kind: LVMCluster
metadata:
name: lvmcluster
namespace: openshift-storage
spec:
storage:
deviceClasses:
- name: vg1
thinPoolConfig:
name: thin-pool-1
overprovisionRatio: 10
EOF
oc apply -f lvm-cluster.yaml
# 等待 StorageClass 生成
watch oc get sc
步骤 3:使用动态存储部署 MySQL
cat <<EOF > mysql-pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc-dynamic
spec:
storageClassName: lvms-vg1
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
EOF
oc apply -f mysql-pvc-dynamic.yaml
# 验证 PV 是否已自动创建
oc get pvc mysql-pvc-dynamic
5. 验证数据持久性 (通用步骤)
- 写入数据:
oc exec -it $(oc get pods -l app=mysql -o name) -- mysql -u root -ppassword123 lab_db -e "CREATE TABLE test (id INT); INSERT INTO test VALUES (100);" - 强制销毁 Pod:
oc delete pod -l app=mysql - 验证恢复:
等待新 Pod Ready 后执行:oc exec -it $(oc get pods -l app=mysql -o name) -- mysql -u root -ppassword123 lab_db -e "SELECT * FROM test;"
1万+

被折叠的 条评论
为什么被折叠?



