K8s知识(4)Kubernetes 存储 volume

Kubernetes Volume 详解(含命令 & 案例)

一、为什么需要 Volume

问题 Kubernetes 解决方案
容器重启后数据丢失 使用 Volume
同 Pod 内容器共享数据 emptyDir
Pod 访问节点文件 hostPath
多 Pod 共享持久数据 NFS / PV / PVC

⚠️ 容器文件系统是临时的,Volume 才是数据的归宿


二、emptyDir(临时存储卷)

1️⃣ 核心特性

属性 说明
生命周期 与 Pod 一致
数据持久性 ❌ 不持久
跨节点 ❌
典型用途 缓存、临时文件、容器间通信

2️⃣ YAML 示例

复制代码

yaml

yaml

复制代码
# test-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-emptydir
spec:
  containers:
  - name: container-a
    image: alpine
    command: ["/bin/sh", "-c"]
    args:
      - echo "Hello emptyDir" > /cache/hello.txt && sleep 3600
    volumeMounts:
    - name: cache-volume
      mountPath: /cache
  volumes:
  - name: cache-volume
    emptyDir: {}

3️⃣ 常用命令

复制代码

bash

bash

复制代码
kubectl apply -f test-emptydir.yaml
kubectl get pod test-emptydir
kubectl exec test-emptydir -- cat /cache/hello.txt
kubectl delete pod test-emptydir

✅ Pod 删除后,数据消失


三、hostPath(节点级存储卷)

1️⃣ 核心特性

属性 说明
生命周期 依赖节点
数据持久性 ✅(节点未重装)
安全风险 ⚠️ 高
典型用途 日志、系统配置、调试

2️⃣ YAML 示例

复制代码

yaml

yaml

复制代码
# test-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-hostpath
spec:
  containers:
  - name: container-b
    image: alpine
    command: ["/bin/sh", "-c"]
    args:
      - ls -l /host/tmp && sleep 3600
    volumeMounts:
    - name: host-tmp
      mountPath: /host/tmp
      readOnly: true
  volumes:
  - name: host-tmp
    hostPath:
      path: /tmp
      type: Directory

3️⃣ 常用命令

复制代码

bash

bash

复制代码
kubectl apply -f test-hostpath.yaml
kubectl exec test-hostpath -- ls /host/tmp

⚠️ 生产环境建议:

  • 使用 readOnly: true

  • 限制 hostPath.path

  • 配合 PodSecurityPolicy / PSA


四、NFS(共享持久存储)

1️⃣ 核心特性

属性 说明
跨节点 ✅
多 Pod 共享 ✅
持久化 ✅
访问模式 ReadWriteMany

五、NFS + PV + PVC 实战

1️⃣ 前提条件

  • NFS Server:192.168.1.100

  • 导出目录:/nfs/data

  • 节点已安装 nfs-utils


2️⃣ PersistentVolume(PV)

复制代码

yaml

yaml

复制代码
# nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /nfs/data

3️⃣ PersistentVolumeClaim(PVC)

复制代码

yaml

yaml

复制代码
# nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

4️⃣ Pod 使用 NFS PVC

复制代码

yaml

yaml

复制代码
# nfs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nfs-test-pod
spec:
  containers:
  - name: app
    image: alpine
    command: ["/bin/sh", "-c"]
    args:
      - echo "NFS Data" > /data/test.txt && sleep 3600
    volumeMounts:
    - name: nfs-storage
      mountPath: /data
  volumes:
  - name: nfs-storage
    persistentVolumeClaim:
      claimName: nfs-pvc

5️⃣ 操作命令汇总

复制代码

bash

bash

复制代码
kubectl apply -f nfs-pv.yaml
kubectl apply -f nfs-pvc.yaml
kubectl apply -f nfs-pod.yaml

kubectl get pv
kubectl get pvc
kubectl exec nfs-test-pod -- cat /data/test.txt

✅ Pod 删除后,NFS 数据仍然存在


六、三种 Volume 对比总结

类型 持久化 跨节点 多 Pod 共享 风险
emptyDir ❌ ❌ ✅(同 Pod) 低
hostPath ✅ ❌ ❌ 高
NFS ✅ ✅ ✅ 低
相关推荐
小白的码BUG之路3 小时前
K8s -- 搭建过程中经常遇到的问题
云原生·容器·kubernetes
慈云数据3 小时前
用 DSH 辅助部署一个网站监控平台:Uptime Kuma + Docker 实战
运维·docker·容器
大腾智能4 小时前
普通笔记本跑CAD,云原生和本地安装差在哪
云原生·国产cad·cad软件·云原生cad
螺蛳粉 螺蛳粉4 小时前
第 03 篇:为什么 K8s 的最小调度单元是 Pod 而不是容器:pause 容器与边车模式(底座认知 03)
docker·云原生·容器·kubernetes·etcd·运维排障·kube-apiserver
艾伦_耶格宇4 小时前
【kubernetes - 1.28版本】-9 K8S-dashbord可视化界面
云原生·容器·kubernetes
阿里云云原生19 小时前
Agent 数据飞轮平台的选型和实践
云原生
做运维的阿瑞20 小时前
云项目可观测性与成本治理:告警、日志、Dashboard 与预算标签
大数据·云原生·云计算·terraform
无人生还别怕21 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
知已难寻21 小时前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
分布式存储与RustFS1 天前
模型权重散落在每台 GPU?用 RustFS 给 vLLM 做共享权重库
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准