Kubernetes 中的全局部署方式——StatefulSet

阅读时长 5 分钟读完

Kubernetes 提供了 StatefulSet 以解决无状态服务不能满足持久化存储、全局唯一标识符、网络标识符等方面要求的问题。StatefulSet 是一个在 Kubernetes 中创建和管理状态化应用的控制器。

StatefulSet 是什么?

在 Kubernetes 中,无状态服务可以通过 Deployment 控制器来创建和管理。Deployment 控制器为每个实例创建一个新的 Pod,并能够负责容器副本的自我修复。

但对于某些应用(如数据库、消息队列、缓存等),无状态服务无法满足它们的要求。比如,一个数据库实例需要有一个固定的 IP 地址和一个唯一的网络标识符,在节点迁移或 Pod 重新调度时能够保持连接。此时,就需要使用 StatefulSet 。

StatefulSet 的特点:

  • 每个副本有一个固定的有序名称(stable network identity)。
  • 缩放时可以保证网络标识不变。
  • 支持有状态服务的有序部署和扩展。
  • 每个 Pod 拥有唯一的网络标识符。
  • 支持有状态服务的有序滚动升级。

StatefulSet 示例代码

接下来,让我们通过一个实际的示例来掌握 StatefulSet 的使用方法。

我们假设要创建一个 MySQL 5.7 数据库集群。首先,我们需要创建一个 ConfigMap 对象来存储配置信息:

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

接下来,我们创建一个 Headless Service (没有 ClusterIP 的 Service)来为 StatefulSet 提供 DNS 解析功能:

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

然后,我们创建一个带有 PersistentVolumeClaim 的 StatefulSet:

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

这里的 StatefulSet 定义了:

  • serviceName:与上面创建的 Headless Service 关联;
  • replicas:3 个 MySQL 实例;
  • template:与普通的 Pod 模板定义一样,但这里添加了一个 volumes 字段来定义持久化存储;
  • volumeClaimTemplates:用来创建 PersistentVolumeClaim 的模板定义。

其中,每个 Pod 的名称按照如下规则命名:

  • <statefulset-name>-<ordinal>.<service-name>.<namespace>.svc.cluster.local。

这样一来,每个 Pod 会获得一个稳定的、递增的有序名称。在 Pod 缩放时,这些名称不会发生变化。

现在,我们已经成功创建了 MySQL 5.7 数据库集群,并借此了解了如何创建和使用 StatefulSet 。

结论

StatefulSet 是 Kubernetes 中管理有状态服务的一种控制器,它保证了每个副本有一个稳定的网络标识符和唯一名称,并支持有序部署和扩展。本文通过实际示例代码,让读者深入掌握了 StatefulSet 的使用方法,为使用 Kubernetes 搭建稳定、可靠的分布式应用提供了重要帮助。

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

纠错
反馈