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

```

相关推荐
wxchyy1 小时前
手把手教你入门云计算(二):这些技术改变了世界,你也能轻松掌握
hadoop·阿里云·docker·云原生·华为云·云计算·运维开发
名字还没想好☜2 小时前
Prometheus 告警实战:写 alerting rules、用 Alertmanager 做路由分组与抑制
运维·前端·javascript·docker·kubernetes·prometheus
qq_349447953 小时前
K8S Helm安装
云原生·容器·kubernetes
tangyal3 小时前
kubernetes(k8s)基础理论与集群部署
kubernetes·k8s·部署·node·理论·pod·集群cluster
2401_834636994 小时前
Docker 容器化技术全解:从镜像构建到容器编排的完整教案2
运维·docker·容器
Cicada1287 小时前
定时任务方案选择指南:crontab、K8s CronJob、Airflow、XXL-JOB
云原生·容器·kubernetes
秋风点枝7 小时前
第一篇:认识 Argo CD —— 从传统发布到云原生 GitOps
git·云原生·argocd
虎王物联8 小时前
Docker WASM 边缘计算:12ms 冷启动如何重塑 IoT 网关部署
物联网·docker·容器·边缘计算·wasm
猫吃了源码8 小时前
Ubuntu24系统安装部署最新版K8s(Kubernetes)1.36保姆级详细教程
云原生·容器·kubernetes
深念Y9 小时前
微服务抽取路线图:从胖单体到 ARM 集群
前端·arm开发·数据库·后端·微服务·云原生·架构