Kubernetes 存储卷及 volume mode 详解

阅读时长 7 分钟读完

前言

Kubernetes 是一个开放源码的容器编排系统,它可以自动管理容器化应用程序的部署、升级、伸缩和故障排查等任务。Kubernetes 提供了强大的存储卷(Volume)概念,使得容器能够更加灵活地操纵数据,支持不同种类的存储介质和访问方式。

本文将介绍 Kubernetes 存储卷的概念和用法,以及 Volume Mode 的详解。本文旨在深入细致地探究存储卷和 Volume Mode 的特性和用法,让读者在实践中更好地应用 Kubernetes 存储卷。

存储卷概念

Kubernetes 存储卷是 Kubernetes 中用来存储容器数据的一种抽象概念。存储卷可以被挂载到容器的文件系统中,并且能够实现相互隔离的容器之间的数据共享。Kubernetes 支持多种存储卷的类型,包括但不限于 NFS、iSCSI、AWS EBS 和 GCE Persistent Disk 等。

存储卷可以通过挂载到 Pod 上的方式来使用,Pod 中的一个容器可以同时挂载多个存储卷,具体的容器可以通过 volumeMounts 字段指定存储卷的挂载点。例如:

-- -------------------- ---- -------
----------- --
----- ---
---------
  ----- ---
-----
  -----------
  - ----- ----------
    ------ -----
    -------------
    - ----- --------------
      ---------- -----
  --------
  - ----- --------------
    ----------
      ----------- ------------
      ---------- -----
      --------- -----

这个 YAML 文件定义了一个 Pod 以及一个容器,容器使用了一个名为 storage-volume 的存储卷,并将其挂载到了 /data 目录。存储卷的类型是 azureFile,secretName 和 shareName 分别对应了一个 Azure 存储服务的密钥和共享名称。容器中可以对这个挂载点进行读写操作,存储卷会自动将数据保存到持久化的存储介质中。

Volume Mode

Volume Mode 是 Kubernetes 存储卷的一种扩展模式,它可以控制存储卷的行为和属性。Volume Mode 可以通过设置存储卷的 spec 字段来启用,具体的格式如下所示:

-- -------------------- ---- -------
----------- --
----- ----------------
---------
  ----- ------
-----
  ---------
    -------- ----
  ----------- ----------
  ------------
    - -------------
  ----
    ----- ---------
    ------- ----------------------

在上面的 YAML 文件中,volumeMode 字段的值为 Filesystem,表示这个存储卷采用了文件系统的方式进行存储,它将具有创建、挂载、卸载文件系统的能力。

Kubernetes 支持以下两种 Volume Mode 的存储卷:

  • Filesystem:表示存储卷采用文件系统的方式进行存储。
  • Block:表示存储卷采用块设备的方式进行存储。

下面我们将分别介绍这两种 Volume Mode 的存储卷的特性和用法。

Filesystem 存储卷

Filesystem 存储卷是一种基于文件系统的存储卷,它是 Kubernetes 默认的存储卷模式。Filesystem 存储卷可以被挂载到容器的文件系统中,并且可以实现容器之间的数据共享,也可以被持久化地存储在存储介质中。

Filesystem 存储卷的实现依赖于操作系统内核的文件系统支持,特别是在 Linux 系统中的 VFS 层(Virtual File System)实现。Filesystem 存储卷的文件系统类型通常是 ext3、ext4、NTFS、FAT32 等。

Filesystem 存储卷的使用方式和普通存储卷一样,只不过需要在 spec.volumeMode 字段中指定为 Filesystem:

-- -------------------- ---- -------
----------- --
----- ----------------
---------
  ----- ------
-----
  ---------
    -------- ----
  ----------- ----------
  ------------
    - -------------
  ----
    ----- ---------
    ------- ----------------------

Filesystem 存储卷的优点:

  • 支持文件系统操作:Filesystem 存储卷利用了操作系统的内核和 VFS 层实现了文件系统操作的能力,支持 POSIX 标准的文件操作,具有较高的可移植性和可靠性。
  • 支持文件共享:Filesystem 存储卷可以被多个容器同时挂载到他们的文件系统中,实现容器之间的硬盘依赖关系解耦,达到较好的资源隔离效果。

Block 存储卷

Block 存储卷是一种基于块设备的存储卷,它是 Kubernetes 从 1.13 版本开始支持的存储卷模式。Block 存储卷在性能和数据完整性上相对于 Filesystem 存储卷更具优势,特别是在 IOPS 密集型、低延迟的场景下可以发挥更好的作用。

Block 存储卷的实现依赖于 Linux 内核中的块设备驱动和 I/O 核心,具有文件系统无关的优点。Block 存储卷通常需要独占一个 PV,并且需要挂载到有 XFS、EXT4、NTFS 或 FAT32 文件系统的机器上进行读写操作。

Block 存储卷的使用方式和普通存储卷一样,只不过需要在 spec.volumeMode 字段中指定为 Block:

-- -------------------- ---- -------
----------- --
----- ----------------
---------
  ----- -----
-----
  ---------
    -------- ---
  ----------- -----
  ------------
    ---------------- ---------

上面的 YAML 文件定义了一个具有 2GB 大小的 Block 存储卷,将挂载到 /dev/xvdf 路径。Block 存储卷可以被挂载到具有块设备驱动的容器中,并且拥有更好的性能和更少的延迟,适用于 IOPS 密集和低延迟的场景。

Block 存储卷的优点:

  • 性能更好:Block 存储卷采用裸设备的形式,无需进行文件系统格式化和挂载,具有更快的启动速度、更高的 IOPS 和更低的延迟。
  • 数据完整性更好:Block 存储卷采用块设备驱动和 I/O 核心的方式进行访问,更加高效、稳定和安全,避免了文件系统的数据损坏风险。

示例代码

下面是一个使用 Volume Mode 存储卷的示例代码:

-- -------------------- ---- -------
----------- --
----- ----------------
---------
  ----- -----
-----
  ---------
    -------- ---
  ----------- -----
  ------------
    ---------------- ---------
---
----------- --
----- ---
---------
  ----- ---
-----
  -----------
  - ----- ---------
    ------ -------
    -------- -----------
    ----- ------ --- ------------ ------------- ----- ------------
    --------------
    - ----- ----
      ----------- ---------
  --------
  - ----- ----
    ----------------------
      ---------- --------

本示例定义了一个名为 my-pv 的 Block 存储卷,并使用了一个具有挂载到 /dev/xvdf 的容器。容器使用 dd 命令往 /data/test 文件中写入了 1GB 的数据,并将其存储到 my-pv 的块设备中。

通过这个示例可以看到,使用 Volume Mode 存储卷能够带来更好的性能和更少的延迟,同时避免了文件系统层的数据损坏风险。

总结

本文详细介绍了 Kubernetes 存储卷和 Volume Mode 的概念和用法,希望对读者在实践中更充分地发挥存储卷的能力有所帮助。存储卷是 Kubernetes 运维中的一个重要概念,具有很高的灵活性和扩展性,可用于支持多种不同场景下的数据存储需求。在实践中,需要按照特定场景来选择存储卷的类型和 Volume Mode,以达到更好的性能、可靠性和安全性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c9799d5ad90b6d04171952

纠错
反馈