Kubernetes中的存储卷配置管理方式

 更新时间:2025年12月22日 08:45:46   作者:π大星星️  
Kubernetes中Volume用于在Pod中提供共享存储,生命周期与Pod解耦,支持多种类型如emptyDir、hostPath、NFS和PersistentVolumeClaim,每种Volume类型适用于不同的场景,如临时存储、宿主机文件访问、共享数据和持久化存储,通过示例展示了如何创建和使用这些Volume

一、Volume 概述

在 Kubernetes 中,Volume 是一种可被 Pod 中的一个或多个容器访问的共享目录。Volume 与 Pod 的生命周期解耦,这意味着即使 Pod 被删除,Volume 中的数据也不会丢失。Volume 可以用于持久化数据存储、共享数据等场景。

二、Volume 的生命周期

Volume 的生命周期可以独立于 Pod 的生命周期,这取决于 Volume 的类型:

  • 非持久化 Volume(如 emptyDir):当 Pod 被删除时,emptyDir 类型的 Volume 也会被删除,其中的数据也会丢失。但是,如果 Pod 被重启(容器在同一个 Pod 内重新启动),emptyDir 中的数据会保留。
  • 持久化 Volume(如 PersistentVolumeClaim,PVC):即使 Pod 被删除,如果使用了 PVC 并且关联了 PV,那么 PV 不会被自动删除(除非设置了相应的回收策略)。因此,即使 Pod 被删除,关联的 PV 中的数据仍然存在,可以在新的 Pod 中通过 PVC 重新访问这些数据。

Volume 的生命周期不会受到容器重启的影响,这使得 Volume 成为持久化数据存储的理想选择。

三、支持的卷类型

Kubernetes 支持多种类型的 Volume,每种类型适用于不同的场景:

  1. emptyDir:在 Pod 被分配到节点时创建,只要 Pod 在该节点上运行,卷就存在。当 Pod 被从节点上删除时,emptyDir 中的数据也会被永久删除
  2. hostPath将宿主机上的文件或目录挂载到 Pod 中。适用于需要访问宿主机文件系统的场景。
  3. NFS允许将现有的 NFS 服务器上的目录挂载到 Kubernetes 中的 Pod 中。适用于需要在多个 Pod 之间共享数据的场景。
  4. PersistentVolumeClaim (PVC)用户对持久存储的请求,可以动态或静态地绑定到 PersistentVolume (PV) 上。

四、每种卷类型的使用场景和示例

4.1 emptyDir 卷

使用场景

  • 临时存储,例如缓存或会话数据。
  • 多个容器需要共享数据时。

示例

创建一个使用 emptyDir 的 Pod:

apiVersion: v1  # 指定 Kubernetes API 的版本
kind: Pod  # 定义资源类型为 Pod
metadata:  # Pod 的元数据部分
  name: test-pod  # 为这个 Pod 指定一个名称
spec:  # Pod 的具体规格和配置
  containers:  # 定义 Pod 中的容器列表
  - name: test-container  # 为容器指定一个名称
    image: busybox  # 指定容器使用的镜像为 busybox
    command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]  # 指定容器启动后执行的命令
    volumeMounts:  # 定义容器需要挂载的卷
    - name: data-volume  # 引用在 volumes 中定义的卷名称
      mountPath: /data  # 指定容器内部的挂载路径
  volumes:  # 定义 Pod 可以使用的卷列表
  - name: data-volume  # 为卷指定一个名称
    emptyDir: {}  # 使用 emptyDir 类型的卷,它将在 Pod 所在的节点上创建一个临时目录

操作步骤

保存上述 YAML 到 test-pod.yaml 文件。

应用 YAML 文件创建 Pod:

kubectl apply -f test-pod.yaml

查看 Pod 的日志,验证 emptyDir 是否工作:

kubectl logs test-pod

预期输出

Hello

4.2 hostPath 卷

使用场景

需要访问宿主机上的文件或目录,例如日志文件、配置文件等。

示例

创建一个使用 hostPath 的 Pod:

apiVersion: v1  # 指定 Kubernetes API 的版本
kind: Pod  # 定义资源类型为 Pod
metadata:  # Pod 的元数据
  name: test-pod-hostpath  # 为 Pod 指定一个名称
spec:  # Pod 的具体配置
  containers:  # 定义 Pod 中的容器列表
  - name: test-container  # 为容器指定一个名称
    image: busybox  # 指定容器使用的镜像
    command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]  # 指定容器启动后执行的命令
    volumeMounts:  # 定义容器需要挂载的卷
    - name: data-volume  # 引用在 volumes 中定义的卷名称
      mountPath: /data  # 指定容器内部的挂载入路径
  volumes:  # 定义 Pod 级别的卷
  - name: data-volume  # 为卷指定一个名称
    hostPath:  # 指定卷的类型为 hostPath
      path: /data  # 指定宿主机上的路径,容器会将此路径挂载到 mountPath 指定的位置
      type: DirectoryOrCreate  # 如果指定的路径不存在,则创建目录

操作步骤

保存上述 YAML 到 test-pod-hostpath.yaml 文件。

应用 YAML 文件创建 Pod:

kubectl apply -f test-pod-hostpath.yaml

验证宿主机上的 /data 目录,查看是否创建了 hello 文件:

kubectl exec -it test-pod-hostpath -- /bin/sh
cat /data/hello

预期输出

Hello

4.3 NFS 卷

使用场景

  • 需要在多个 Pod 之间共享数据。
  • 数据需要持久化存储。

示例

假设您已经有一个 NFS 服务器,其路径为 /nfsdata

创建一个使用 NFS 的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-nfs
spec:
  containers:
  - name: test-container
    image: busybox
    command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]
    volumeMounts:
    - name: data-volume
      mountPath: /data
  volumes:
  - name: data-volume
    nfs:
      server: <NFS_SERVER_IP>  # NFS 服务器 IP 地址
      path: /nfsdata          # NFS 服务器路径

操作步骤

  • 替换 <NFS_SERVER_IP> 为实际的 NFS 服务器 IP 地址。
  • 保存上述 YAML 到 test-pod-nfs.yaml 文件。
  • 应用 YAML 文件创建 Pod:
kubectl apply -f test-pod-nfs.yaml

验证 NFS 服务器上的 /nfsdata 目录,查看是否创建了 hello 文件:

kubectl exec -it test-pod-nfs -- /bin/sh
cat /data/hello

预期输出

Hello

4.4 PersistentVolumeClaim (PVC)

使用场景

  • 需要持久化存储数据。
  • 数据需要在多个 Pod 之间共享。

示例

首先,创建一个 PersistentVolume (PV):

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /nfsdata
    server: <NFS_SERVER_IP>

操作步骤

  • 替换 <NFS_SERVER_IP> 为实际的 NFS 服务器 IP 地址。
  • 保存上述 YAML 到 pv-nfs.yaml 文件。
  • 应用 YAML 文件创建 PV:
kubectl apply -f pv-nfs.yaml

接下来,创建一个 PersistentVolumeClaim (PVC):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs
spec:
  storageClassName: nfs
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

操作步骤

  • 保存上述 YAML 到 pvc-nfs.yaml 文件。
  • 应用 YAML 文件创建 PVC:
kubectl apply -f vc-nfs.yaml

最后,创建一个使用 PVC 的 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-pvc
spec:
  containers:
  - name: test-container
    image: busybox
    command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]
    volumeMounts:
    - name: data-volume
      mountPath: /data
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: pvc-nfs

操作步骤

  • 保存上述 YAML 到 test-pod-pvc.yaml 文件。
  • 应用 YAML 文件创建 Pod:
kubectl apply -f test-pod-pvc.yaml
  • 验证 NFS 服务器上的 /nfsdata 目录,查看是否创建了 hello 文件:
kubectl exec -it test-pod-pvc -- /bin/sh
cat /data/hello

预期输出

Hello

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 新版k8s拉取镜像失败问题解决办法

    新版k8s拉取镜像失败问题解决办法

    随着Kubernetes 1.23版本的发布,Docker作为默认容器运行时被弃用,转而默认采用Containerd,这一改变意味着用户在使用Kubernetes时,将不再通过Docker来拉取镜像,文中jiang,需要的朋友可以参考下
    2024-10-10
  • k8s如何给node添加标签(最新推荐)

    k8s如何给node添加标签(最新推荐)

    k8s集群如果由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进行资源对象的相关选择与匹配,这篇文章主要介绍了k8s如何给node添加标签,需要的朋友可以参考下
    2023-02-02
  • k8s pod如何使用sriov

    k8s pod如何使用sriov

    这篇文章主要介绍了k8s pod如何使用sriov问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • k8s中对gkv的理解TypeData详解

    k8s中对gkv的理解TypeData详解

    Kubernetes资源通过GKV(Group、Version、Kind)标识,用于分类、版本管理和资源识别,在YAML配置中,apiVersion和kind字段分别体现GKV,是K8s资源操作的基础,通过GKV,Kubernetes可以正确解析和执行资源配置,并确保版本兼容性
    2025-11-11
  • K8s搭建Jenkins的详细教程(附源代码)

    K8s搭建Jenkins的详细教程(附源代码)

    Jenkins 是一个开源的自动化服务器,主要用于持续集成和持续交付,这篇文章主要来和大家介绍一下如何在K8s中搭建Jenkins,有需要的可以了解下
    2025-03-03
  • K8s PV和PVC持久化存储详解

    K8s PV和PVC持久化存储详解

    Kubernetes PV由管理员创建,支持多种存储类型,提供生命周期管理,PVC请求PV资源,需匹配大小、存储类和访问模式,并在同一命名空间,回收策略包括Retain、Delete和Recycle,生产环境建议使用NAS而非NFS
    2025-08-08
  • kubernetes k8s入门定义一个Pod

    kubernetes k8s入门定义一个Pod

    这篇文章主要为大家介绍了k8s入门定义一个Pod以及破底的定义内容详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多计步,早日升职加薪
    2022-03-03
  • 在AWS-EC2中安装Minikube集群的详细过程

    在AWS-EC2中安装Minikube集群的详细过程

    这篇文章主要介绍了在AWS-EC2中安装Minikube集群,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 云原生Kubernetes初始化容器Init使用教程

    云原生Kubernetes初始化容器Init使用教程

    这篇文章主要为大家介绍了云原生Kubernetes初始化容器Init使用教程,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步早日升职加薪
    2022-03-03
  • Kubernetes中使用临时容器进行故障排查的方法

    Kubernetes中使用临时容器进行故障排查的方法

    在使用Kubernetes时,用户常常会遇到一些错误和迷惑,下面这篇文章主要给大家介绍了关于Kubernetes中使用临时容器进行故障排查的相关资料,需要的朋友可以参考下
    2022-03-03

最新评论