K8s PV / PVC / StorageClass 有状态应用持久化

关系

```

StorageClass → 定义存储类型

PVC → Pod 申请存储

PV → 实际存储卷

```

PVC + Deployment 示例

```yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-data-pvc

namespace: prod

spec:

accessModes: ReadWriteOnce

storageClassName: nfs-client # 改成你的 SC

resources:

requests:

storage: 20Gi


apiVersion: apps/v1

kind: Deployment

metadata:

name: mysql

namespace: prod

spec:

replicas: 1 # RWO 只能单副本

selector:

matchLabels:

app: mysql

template:

metadata:

labels:

app: mysql

spec:

containers:

  • name: mysql

image: mysql:8.0

volumeMounts:

  • name: data

mountPath: /var/lib/mysql

volumes:

  • name: data

persistentVolumeClaim:

claimName: mysql-data-pvc

```

StatefulSet(推荐有状态应用)

```yaml

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: redis

namespace: cache

spec:

serviceName: redis

replicas: 1

selector:

matchLabels:

app: redis

template:

metadata:

labels:

app: redis

spec:

containers:

  • name: redis

image: redis:7.2

command: "redis-server", "--appendonly", "yes"

volumeMounts:

  • name: data

mountPath: /data

volumeClaimTemplates:

  • metadata:

name: data

spec:

accessModes: ReadWriteOnce

storageClassName: nfs-client

resources:

requests:

storage: 5Gi

```

自动生成 `data-redis-0` PVC。

accessModes

| 模式 | 说明 |

|------|------|

| ReadWriteOnce | 单节点读写(最常用) |

| ReadWriteMany | 多节点读写(NFS 支持) |

PVC Pending 排查

```bash

kubectl describe pvc <name> -n <ns>

kubectl get storageclass

```

| Events | 处理 |

|--------|------|

| storageclass not found | SC 名称写错 |

| no persistent volumes | 检查 Provisioner / NFS |

| waiting for first consumer | 先创建使用 PVC 的 Pod |

踩坑

  1. **Deployment replicas>1 + RWO** → 多 Pod 抢一个卷,用 StatefulSet

  2. **删 PVC 数据丢** → 生产用 `reclaimPolicy: Retain`

  3. **hostPath 别上生产** → 用 NFS / 云盘

  4. **NFS 权限不足** → exports 加 `no_root_squash`,或 initContainer chown

常用命令

```bash

kubectl get pv,pvc -A

kubectl patch pvc <name> -n <ns> -p '{"spec":{"resources":{"requests":{"storage":"50Gi"}}}}' # 扩容

```

相关推荐
todoitbo7 小时前
群晖NAS部署JmalCloud:Docker安装、文件管理、博客与公网访问完整教程
运维·docker·容器
时间售卖铺7 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
云-缩影12 小时前
拆解函数计算 Serverless GPU 部署 AI 模型:Flux 生图和语音复刻怎么跑的
人工智能·云原生·serverless
是枚小菜鸡儿吖13 小时前
Home Assistant跨品牌智能家居教程:Docker部署、米家接入、vivo桥接与远程访问
docker·容器·智能家居
螺蛳粉 螺蛳粉16 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
wefg117 小时前
【Docker】镜像相关指令
运维·docker·容器
技术党18 小时前
大模型训练平台推荐问答:九章云极的DCU计费、全栈Serverless和Token交付分别适合谁
云原生·serverless
java_logo18 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
时间售卖铺18 小时前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle
n1121219 小时前
Docker 容器时区错 8 小时:3 个坑
运维·docker·容器·故障排查·服务器运维·容器时区