使用 Stateful HA Operator 提高有状态应用的可用性


Stateful High Availability (HA) Operator 使您可以使用 GKE 与区域级 Persistent Disk 永久性磁盘的内置集成来自动执行 StatefulSet Pod 故障切换并控制其速度。在故障切换期间,Operator 会自动检测节点故障、将卷与故障节点分离,并确保将卷安全地挂接到故障切换节点。

为何使用 Stateful HA Operator

用于实现高可用性的一个常用有状态架构使用区域级 Persistent Disk 永久性磁盘作为存储层。这些磁盘可在同一区域中的两个可用区之间同步复制数据。在节点或可用区网络故障期间,此架构可让您的工作负载将副本故障切换(通过强制挂接)到其他可用区中另一个节点上的存储空间。

Stateful HA Operator 可让您进行以下优化:

  • 缩短单副本应用的恢复时间:如果您只使用一个副本,则可以使用 Stateful HA Operator 并在预配应用时将可用区级存储替换为区域级存储,以提高节点故障时的数据耐用性和可用性。
  • 降低跨可用区网络费用:对于高吞吐量应用,跨多个可用区复制数据会产生高昂的费用。您可以使用 Stateful HA Operator 在单个可用区中运行应用,同时维护到符合应用服务等级协议 (SLA) 的备用可用区的故障切换路径。

限制

GKE 采用单副本 Stateful HA Operator 架构,通过区域级 Persistent Disk 永久性磁盘将数据保存在两个可用区中,但数据只有在应用副本健康时才可访问。在故障切换期间,当副本被重新安排到健康的新节点时,应用将暂时不可用。如果您的应用具有非常低的恢复时间目标 (RTO),我们建议您使用多副本方法。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

要求

  • 您的集群控制平面和节点必须运行 GKE 1.28 版或更高版本。
  • 使用 Stateful HA Operator 时,它会自动将关联的 StatefulSet 配置为使用区域级 Persistent Disk 永久性磁盘。但是,您需要负责确保 Pod 配置为使用这些磁盘,并且能够在与底层存储关联的所有可用区中运行。
  • 确保您的应用在区域级 Persistent Disk 永久性磁盘支持的机器类型上运行,包括 E2、N1、N2、N2D。
  • 确保已启用 Compute Engine Persistent Disk CSI 驱动程序。Persistent Disk CSI 驱动程序在新的 Autopilot 和 Standard 集群上默认启用,并且在使用 Autopilot 时无法停用或修改。如果您需要在集群中手动添加 Persistent Disk CSI 驱动程序,请参阅在现有集群上启用 Persistent Disk CSI 驱动程序
  • 如果您使用的是自定义 StorageClass,请使用 pd.csi.storage.gke.io 预配工具和以下参数配置 Persistent Disk CSI 驱动程序:
    • availability-class: regional-hard-failover
    • replication-type: regional-pd

设置和使用 Stateful HA Operator

请按照以下步骤为有状态工作负载设置 Stateful HA Operator:

  1. 启用 StatefulHA 插件。
  2. 安装 HighAvailabilityApplication 资源
  3. 安装 StatefulSet。
  4. 检查 HighAvailabilityApplication 资源。

启用 StatefulHA 插件

如需使用 Stateful HA Operator,您必须在集群上启用 StatefulHA 插件。

  • Autopilot 集群:GKE 会在创建集群时自动启用 StatefulHA 插件。如果要为现有工作负载使用 Stateful HA Operator,请在新的 Autopilot 集群上重新部署工作负载。

  • Standard 集群

    • 创建新集群:按照 gcloud CLI 说明创建 Standard 集群并添加以下标志:--add-on=StatefulHA
    • 现有 Standard 集群:按照 gcloud CLI 说明更新 Standard 集群的设置,并使用以下标志启用插件:--update-addons=StatefulHA=ENABLED

启用插件后,GKE 会自动为您安装名为 standard-rwo-regional 的 StorageClass。

安装 HighAvailabilityApplication 资源

HighAvailabilityApplication 是一种 Kubernetes 资源,可简化 StatefulSet 设置并提高 GKE 上的 Pod 可用性。Stateful HA Operator 会协调 GKE 上的 HighAvailabilityApplication 资源。

HighAvailabilityApplication 规范中,您必须将 HighAvailabilityApplication.spec.resourceSelection.resourceKind 设置为 StatefulSet

如需了解如何配置 HighAvailability 资源,请参阅 HighAvailabilityApplication 参考文档

查看以下 PostgreSQL 示例:

  1. 将以下清单保存到名为 stateful-ha-example-resource.yaml 的文件中:

    kind: HighAvailabilityApplication
    apiVersion: ha.gke.io/v1
    metadata:
      name: APP_NAME
      namespace: APP_NAMESPACE
    spec:
      resourceSelection:
        resourceKind: StatefulSet
      policy:
        storageSettings:
          requireRegionalStorage: true
        failoverSettings:
          forceDeleteStrategy: AfterNodeUnreachable
          afterNodeUnreachable:
            afterNodeUnreachableSeconds: 20
    

    替换以下内容:

    • APP_NAME:您的集群中要保护的应用的名称。此名称必须由 HighAvailabilityApplication 和 StatefulSet 共享。
    • APP_NAMESPACE:应用命名空间。此命名空间必须由被保护的 HighAvailabilityApplication 和 StatefulSet 共享。

    在此示例中:

    • HighAvailabilityApplication.spec.policy.storageSettings.requireRegionalSettings 设置为 true。这会强制执行 Regional Storage。
    • HighAvailabilityApplication.spec.policy.failoverSettings 设置为 AfterNodeUnreachable。这决定了节点故障时如何触发强制删除。
    • HighAvailabilityApplication.spec.policy.failoverSettings.afterNodeUnreachable 设置为 20。这是运行 Pod 的节点被标记为无法访问后强制删除 Pod 的超时时间。
  2. 创建资源。HighAvailabilityApplication 资源用于识别具有匹配命名空间和名称的 StatefulSet。

    kubectl apply -f stateful-ha-example-resource.yaml
    

安装 StatefulSet

安装 StatefulSet。例如,您可以使用 HelmCloud Shell 预装了 Helm)安装 PostgreSQL StatefulSet:

helm install postgresql oci://registry-1.docker.io/bitnamicharts/postgresql \
  --namespace=APP_NAMESPACE \
  --set fullnameOverride=APP_NAME

HighAvailabilityApplication 资源会自动将 StatefulSet 的 StorageClass 修改为 standard-rwo-regional,即使用区域级 Persistent Disk 永久性磁盘。

检查 HighAvailabilityApplication 资源

运行以下命令以验证示例应用已启用自动故障切换:

kubectl describe highavailabilityapplication APP_NAME

您应该会看到类似如下所示的输出:

Status:
Conditions:
  Last Transition Time:  2023-08-09T23:59:52Z
  Message:               Application is protected
  Observed Generation:   1
  Reason:                ApplicationProtected
  Status:                True
  Type:                  Protected