首页 / Kubernetes (k8s) 入门教程 / 卷 Volume 基础

Kubernetes (k8s) 入门教程

卷 Volume 基础

本教程共 65 篇 · 第 34 篇 · 更新于 2026-08-14 · 约 9 分钟阅读

KubernetesVolumeemptyDirhostPathConfigMapSecret

本节目标:理解容器里为什么需要卷,认识 emptyDir、hostPath、configMap、secret 四种基础卷,知道每种卷的数据活多久、适合干什么、有哪些坑。

容器里的文件系统是临时的。Pod 一重启,容器里写的东西全没了。两个容器想共享点文件,也没法直接互通。Kubernetes 用”卷(Volume)“解决这个问题。

卷是 Pod 级别的存储。它挂载到 Pod 里的容器,生命周期跟 Pod 绑定,但跟容器本身不完全一样。这点很关键,下面会反复提到。

34-1 为什么需要卷

先记住一个比喻:容器像一次性纸杯,用完就扔;卷像托盘,杯子换了这个托盘还在(部分类型)。Pod 里的多个容器可以挂同一个卷,从而共享数据。

在 Pod 的 YAML 里,卷分两处声明:spec.volumes 定义”有哪些卷”,spec.containers[].volumeMounts 定义”容器把卷挂到哪个路径”。

apiVersion: v1
kind: Pod
metadata:
  name: vol-demo
spec:
  containers:
  - name: writer
    image: busybox
    command: ["sh", "-c", "echo hello > /data/msg; sleep 3600"]
    volumeMounts:
    - name: shared
      mountPath: "/data"
  volumes:
  - name: shared
    emptyDir: {}

34-2 emptyDir 临时卷

emptyDir 最简单。Pod 被调度到节点时,这个卷才创建,初始是空的。Pod 在该节点运行期间,容器读写它都正常。

它的生命周期跟着 Pod 走:Pod 被删,里面的数据也没了。容器崩溃重启不会删 Pod,所以数据还在。

volumes:
- name: cache
  emptyDir: {}
Tip

emptyDir 适合做临时缓存、程序运行中间产物、同 Pod 多容器共享。不适合存任何你想长期保留的东西。它默认用节点磁盘,也可以设 medium: Memory 改用内存,速度更快但算进内存限额。

34-3 hostPath 节点路径卷

hostPath 直接把节点上的真实目录或文件挂进 Pod。比如挂 /var/log 让容器读节点日志。

volumes:
- name: hostlogs
  hostPath:
    path: "/var/log"
    type: Directory

这个卷的生命周期跟节点绑定,不跟 Pod。Pod 删了,节点上的文件还在。

Warning

hostPath 会绕过 Kubernetes 的调度隔离,把 Pod 跟某台具体机器绑死,还有权限风险。生产里尽量少用,监控、日志采集这类 DaemonSet 场景才常见。普通应用别随便挂节点路径。

34-4 configMap 卷

把 ConfigMap 当卷挂进来,每个键变成一个文件。配置更新后,文件内容会被 kubelet 自动同步(用 subPath 挂载时例外)。

volumes:
- name: config
  configMap:
    name: game-demo
containers:
- name: app
  image: nginx
  volumeMounts:
  - name: config
    mountPath: "/etc/game"
    readOnly: true

这种方式比环境变量好:能自动更新,能挂整段配置。配置类数据优先用卷,而不是环境变量。

34-5 secret 卷

secret 卷跟 configMap 卷几乎一样,只是数据源换成 Secret。每个键也是一个文件,内容默认是 Base64 解码后的明文。

volumes:
- name: secret-vol
  secret:
    secretName: db-secret
containers:
- name: app
  image: myapp
  volumeMounts:
  - name: secret-vol
    readOnly: true
    mountPath: "/etc/secret"

前面章节提过:Secret 挂成卷后,kubelet 把它放在节点的 tmpfs 内存里,不会写进持久磁盘,Pod 删了副本就清掉。这比放环境变量里更安全一点。

Note

configMap 和 secret 卷都不支持用 subPath 接收更新。要热更新,挂整个目录,别只挂单个文件。

34-6 四种卷怎么选

简单一句话总结:

  • 要临时共享、不在乎持久,用 emptyDir
  • 要读节点本地的文件(如日志),用 hostPath,但慎用。
  • 要注入不敏感配置,用 configMap 卷。
  • 要注入密码令牌,用 secret 卷。

后面几章会讲更持久的存储:PV、PVC、StorageClass。它们才是真正” Pod 删了数据还在”的方案。