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:
- 启用
StatefulHA
插件。 - 安装 HighAvailabilityApplication 资源。
- 安装 StatefulSet。
- 检查 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
。
- 创建新集群:按照 gcloud CLI 说明创建 Standard 集群并添加以下标志:
启用插件后,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 示例:
将以下清单保存到名为
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 的超时时间。
创建资源。
HighAvailabilityApplication
资源用于识别具有匹配命名空间和名称的 StatefulSet。kubectl apply -f stateful-ha-example-resource.yaml
安装 StatefulSet
安装 StatefulSet。例如,您可以使用 Helm(Cloud 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