目录
[一、先搞懂 4 个核心概念(必须先看)](#一、先搞懂 4 个核心概念(必须先看))
[1. 安装 iSCSI 客户端(三节点都要执行)](#1. 安装 iSCSI 客户端(三节点都要执行))
[2. 添加 OpenEBS Helm 仓库](#2. 添加 OpenEBS Helm 仓库)
[3. 创建命名空间](#3. 创建命名空间)
[4. 安装 OpenEBS(核心存储服务)](#4. 安装 OpenEBS(核心存储服务))
[5. 查看 OpenEBS 运行状态](#5. 查看 OpenEBS 运行状态)
[6. 查看存储类 SC](#6. 查看存储类 SC)
[三、逐字段解析:你写的 StorageClass YAML](#三、逐字段解析:你写的 StorageClass YAML)
[完整 YAML(自定义存储类)](#完整 YAML(自定义存储类))
[四、最重要:PV / PVC / SC 后面到底哪里用?](#四、最重要:PV / PVC / SC 后面到底哪里用?)
[1. MySQL 部署会用(最核心)](#1. MySQL 部署会用(最核心))
[2. Ollama 大模型部署会用](#2. Ollama 大模型部署会用)
[3. 所有需要持久化的服务都会用](#3. 所有需要持久化的服务都会用)
[五、极简总结(背会就能懂 PV 全套)](#五、极简总结(背会就能懂 PV 全套))
前言
我在部署 K8s 项目时,对 PV、PVC、StorageClass、OpenEBS 完全分不清:每个命令是干嘛的?每个 YAML 字段啥意思?配置完后面哪里用?
一、先搞懂 4 个核心概念(必须先看)
- PV (PersistentVolume):真实的存储空间(相当于 "硬盘")
- PVC (PersistentVolumeClaim):Pod 申请使用存储的 "申请单"
- StorageClass (SC):存储 "模板 / 分类",自动创建 PV
- OpenEBS:K8s 存储服务,负责把节点本地目录变成 K8s 可用存储
二、逐行解析:你执行的每一条命令
1. 安装 iSCSI 客户端(三节点都要执行)
sudo dnf install -y iscsi-initiator-utils
- 作用:安装 K8s 存储必备依赖工具
- 服务功能:让节点能挂载远程 / 本地块存储
- 文件类型:系统依赖安装
- 后续用途:OpenEBS 运行依赖,不装后面 PVC 无法挂载
2. 添加 OpenEBS Helm 仓库
helm repo add openebs https://openebs.github.io/charts
helm repo update
- 作用:让 Helm 能下载 OpenEBS 存储安装包
- 服务功能:Helm 应用仓库配置
- 文件类型:仓库配置
- 后续用途:安装 OpenEBS 必须先加仓库
3. 创建命名空间
kubectl create namespace openebs
- 作用:给 OpenEBS 单独创建运行空间
- 服务功能:K8s 资源隔离
- 文件类型:命名空间
- 后续用途:所有 OpenEBS 组件都跑在这个 ns 里
4. 安装 OpenEBS(核心存储服务)
helm install openebs openebs/openebs \
--namespace openebs \
--set localprovisioner.enabled=true \
--set jiva.enabled=false \
--set cstor.enabled=false \
--set nfs-provisioner.enabled=false \
--set zfs-localpv.enabled=false \
--set lvm-localpv.enabled=false
- 作用:安装轻量 OpenEBS 本地存储服务
- 服务功能 :
localprovisioner:本地目录存储服务(核心)- 其他全部关闭:节省资源、避免报错
- 文件类型:Helm 部署服务
- 后续用途 :
- 为 MySQL 提供持久化存储
- 为 Ollama 提供模型文件存储
- 所有需要持久化的 Pod 都靠它
5. 查看 OpenEBS 运行状态
kubectl get pod -n openebs -w
- 作用:实时看存储服务是否启动成功
- 服务功能:状态检查
- 文件类型:检查命令
- 后续用途:确保 SC 正常,否则 PVC 无法绑定
6. 查看存储类 SC
kubectl get sc
- 作用:查看自动生成的存储模板
- 服务功能:查看 SC 资源
- 文件类型:查询命令
- 后续用途 :确认
openebs-hostpath存在,才能创建 PVC
三、逐字段解析:你写的 StorageClass YAML
完整 YAML(自定义存储类)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-hostpath-retain
annotations:
openebs.io/cas-type: "local-hostpath"
cas.openebs.io/config: |
- name: StorageType
value: "hostpath"
- name: BasePath
value: "/var/openebs/local/"
provisioner: openebs.io/local
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
逐字段解释(超清晰)
表格
| 字段 | 作用 | 文件类型 | 后续用途 |
|---|---|---|---|
kind: StorageClass |
定义存储类 | K8s 存储策略 | 用于自动创建 PV |
name: openebs-hostpath-retain |
存储类名称 | 策略名称 | PVC 里指定使用这个 SC |
openebs.io/cas-type: local-hostpath |
使用 OpenEBS 本地目录存储 | 存储类型配置 | 告诉 OpenEBS 使用本地路径 |
BasePath: /var/openebs/local/ |
数据存在节点该目录下 | 存储路径配置 | PV 实际数据位置 |
provisioner: openebs.io/local |
OpenEBS 存储驱动 | 驱动配置 | K8s 用它创建 PV |
reclaimPolicy: Retain |
PVC 删除后数据保留 | 回收策略 | 生产必备,防止数据丢失 |
volumeBindingMode: WaitForFirstConsumer |
等 Pod 调度后再绑定 PV | 绑定策略 | 本地存储必须加,否则调度失败 |
四、最重要:PV / PVC / SC 后面到底哪里用?
1. MySQL 部署会用(最核心)
MySQL 的 YAML 里会写:
yaml
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
然后 PVC 里会指定:
storageClassName: openebs-hostpath 或 openebs-hostpath-retain
- 作用:让 MySQL 使用 OpenEBS 存储
- 结果:MySQL 重启数据不丢失
2. Ollama 大模型部署会用
Ollama 存储模型文件必须用 PVC + OpenEBS
- 不配置:重启容器,模型重新下载,非常慢
3. 所有需要持久化的服务都会用
包括:
- 数据库
- 缓存
- AI 模型
- 日志存储
五、极简总结(背会就能懂 PV 全套)
- OpenEBS = 存储服务
- StorageClass(SC) = 存储模板
- PV = 真实硬盘空间
- PVC = Pod 申请存储
- 你刚才配置的所有内容 = 为后面 MySQL、Ollama 提供持久化存储
一句话:不配置这块,Pod 重启数据全丢,项目跑不起来!