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

```

相关推荐
Y3815326623 小时前
Docker Compose 服务依赖与健康检查:healthcheck 让容器按正确顺序启动
运维·docker·容器
2601_965235485 小时前
快速了解docker
docker·容器·dubbo
李昊哲小课5 小时前
Deepin 25 上安装 Docker CE 实战记录
运维·docker·容器·deepin
重生之我来学Python8 小时前
Docker套装的简介、安装、超级详细教程
linux·docker·容器·eureka·github
大大大大晴天️9 小时前
用 Helm、CRD 与 Operator 管大数据:声明式运维如何替代脚本化部署
大数据·云原生
LRL_11 小时前
深入浅出 Kubernetes 控制器:Deployment 与 StatefulSet 核心区别全景图
云原生·容器·kubernetes
起名真的太难了11 小时前
Docker 项目部署
docker·容器·eureka
MrSYJ12 小时前
Network Namespace 到底是个啥,别人再问你告诉他
docker·云原生·kubernetes
彬冷的心14 小时前
K8s 部署若依项目 + Harbor 私有仓库(双节点版)
云原生·容器·kubernetes
convee_ai14 小时前
Agent 执行为什么需要独立 Sandbox:拆解 Hullwork 的 gVisor 隔离
架构·kubernetes