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
相关推荐
qq_452396232 小时前
第四篇:《Pod:K8s 中最小的部署单元》
云原生·容器·kubernetes
_codemonster2 小时前
K8s / K3s 通用 Kubectl 命令大全(表格版)
linux·docker·kubernetes
虎妞05002 小时前
云原生 AI 推理部署:Kubernetes 实战指南
云原生·kubernetes·容器化·kubeflow·ai部署
java_cj2 小时前
10分钟部署K8s集群:kubeadm极简安装指南
云原生·容器·架构·kubernetes
牛奶咖啡132 小时前
CI/CD——通过Jenkins插件实现与K8s集成并部署应用到k8s集群的实践保姆级教程
ci/cd·kubernetes·jenkins·jenkins安装k8s插件·jenkins对k8s配置凭据·jenkins配置pod模板·编写流水线脚本部署应用到k8s
Zhu7582 小时前
Docker环境部署Apache Hadoop3.1定制版
运维·docker·容器
Akamai中国2 小时前
Akamai 块存储:低延迟、高可靠的云原生持久存储方案
云原生
张忠琳11 小时前
【client-go v0.36.1】(store Part 3)Store 超深度分析 — 集成模式、完整数据流、不变量、与 DeltaFIFO 协作
云原生·kubernetes·informer·store·client-go