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"}}}}' # 扩容

```

相关推荐
AAA@峥2 小时前
K8s 资源混乱怎么办?Namespace 隔离 + 上下文切换实战
容器·贪心算法·kubernetes
重庆小透明2 小时前
深入探寻微服务【第一篇微服务的坏】
微服务·云原生·架构
Zhu7587 小时前
在k8s集群部署MySQL单实例,支持多个主流发行版
android·mysql·kubernetes
张文君10 小时前
docker使用代理拉取镜像
运维·docker·容器
2401_8346369911 小时前
保姆级 Kubernetes 部署教程|从原理到三节点集群落地
云原生·容器·kubernetes
陌路2011 小时前
Docker教程从入门到精通(0基础)
运维·docker·容器
初级炼丹师(爱说实话版)12 小时前
Ubuntu24.04 Docker+vLLM+qianwen2.5-coder-32B部署文档
docker·容器·vllm
2301_7807896612 小时前
DDoS 攻击溯源:DNS 水印标记 + 区块链存证的双保险
运维·服务器·网络·云原生·ddos
ᥬ 小月亮18 小时前
SonarQube使用教程(Docker安装)
运维·docker·容器