Kubernetes 中实现数据持久化的方式 —— 详解 StatefulSet 和 PersistentVolumeClaim

阅读时长 5 分钟读完

前言

作为一名前端开发人员,在实现数据持久化这个问题上可能不太熟悉。但是,在 Kubernetes 集群应用程序开发中,数据持久化是必须考虑的。执行一次应用程序更新,可能导致容器被重新启动,这通常会造成数据丢失。因此,Kubernetes 提供了两种机制来解决这个问题:StatefulSet 和 PersistentVolumeClaim。

StatefulSet

Kubernetes StatefulSet 管理有状态 Pod 的部署和伸缩,其和 Deployments 有相似的 API 和交互方式。StatefulSet 保证了每一个 Pod 的唯一标识符和状态的稳定性。换句话说,更新或者替换一个 Pod 的时候,必须按照顺序更新或替换它。

常见的使用场景比如:有多个数据库,每个数据库需要保证有不一样的 hostname 和 stable storage(固定存储)。StatefulSet 可以保证不同的 Pod 拥有不同的 hostname,并且可以请求 Kubernetes API 来绑定不同的 PersistentVolumeClaim。

理解 StatefulSet

为了更好的理解 StatefulSet,我们需要先了解一下 Deployment 的概念。

Deployment 管理一组相同的 Pod,实现了无状态应用程序的水平扩展。Pod 中的应用程序实例数量由 Deployment 控制,但是 Pod 中的应用程序实例数量可以根据需要随时增加或减少,而不需要任何手动配置。

与 Deployment 不同,StatefulSet 管理一个有状态的 Pod 集合。StatefulSet 知道 Pod 的唯一标识符,并且可以确保在重新部署的时候可以持久化并恢复 Pod 中的数据。

StatefulSet 中的 Volume

StatefulSet 通过 Volume 来实现数据持久化。由于每个 Pod 在实例中具有唯一的名称,StatefulSet 可以为每个 Pod 管理一个独立的 Volume。

在 YAML 文件中定义一个 StatefulSet 时,可以分别为每个 Pod 定义 Volume。对于需要持久化的数据,可以在一个单独的(PersistentVolumeClaim)PVC 中定义,该 PVC 在创建 Pod 时挂载到 Pod 所需的路径中。

下面是一个 YAML 文件示例,其中定义了一个名为 nginx 的 StatefulSet,并将 PersistentVolumeClaim 挂载到 /data 目录:

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

上面的 YAML 配置将 nginx 的最新版本作为容器的映像,并将 PersistentVolumeClaim 挂载到 /data 目录。

注意:在示例 YAML 文件中,PVC 名称必须与 volumeMounts 中 Volume 的名字相同。

PersistentVolumeClaim

前面我们提到了 PersistentVolumeClaim,它是通过在 Pod 中声明需要的存储的 Kubernetes 资源对象。该资源对象通过一种特定的方法(例如 NFS 或 iSCSI)提供用数据存储服务。

理解 PersistentVolumeClaim

在 Kubernetes 中,PersistentVolumeClaim 是用于请求可用存储资源的对象。PersistentVolumeClaim 常常使用存储类来获取最终应该使用哪种存储提供程序的信息。

PersistentVolumeClaim 的挂载使用的是 Pod 中定义的 VolumeMounts。这些 VolumeMounts 定义了 Volume 应该被挂载到 Pod 中的哪个路径上。

注意:如果创建 PersistentVolumeClaim 对象时未指定 storageClassName 属性,则默认使用 default 存储类。

定义 PersistentVolumeClaim

下面是一个存储了 Redis 数据的 PVC 的 YAML 文件示例:

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

该 YAML 文件定义了一个名为 redis-data-pvc 的 PersistentVolumeClaim,并指定了存储容量为 10G。该资源还定义了其访问模式为 ReadWriteOnce。这表示只能从一个节点同时挂载并读取和写入此 PVC。 最后,最终使用的存储类是 standard。

总结

在 Kubernetes 集群中,数据持久化是非常重要的一项功能。本文详细介绍了 Kubernetes 中实现数据持久化的两种方式:StatefulSet 和 PersistentVolumeClaim,并给出了相应的示例代码,希望读者能够掌握相关的知识,对 Kubernetes 应用程序开发有所帮助。

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

纠错
反馈