一项常见的监管要求是,公司必须能够证明其灾难恢复 (DR) 能力。对于在云中运行的应用,此要求包括当一个可用区中托管的服务器在一段时间内不可用时服务的可靠性和可用性。本文档适用于希望了解如何在使用 Google Kubernetes Engine (GKE) Standard 区域级集群时模拟可用区故障切换的管理员、架构师、运维人员以及备份和灾难恢复 (DR) 管理员。
GKE 区域级集群在用户选择的区域中创建,并在位于所选区域内多个可用区的虚拟机上运行控制平面。GKE Autopilot 集群始终为区域级集群,而 GKE Standard 集群可以是区域级集群或可用区级集群。本教程使用 GKE Standard 区域级集群。集群节点通过负载均衡器与控制平面通信,这意味着节点位置和控制平面虚拟机位置并非始终匹配。在 Google Cloud 控制台中,使用区域级集群时,您无法停用特定可用区。如需了解详情,请参阅 GKE 集群架构。
本教程提供了三种不同的方法来模拟可用区故障。您可以模拟可用区故障,并使用自己的合规性所需的任何方法验证正确的应用响应。
本文档中的方法也适用于可用区级集群,包括单可用区和多可用区集群。这些方法仅会影响目标可用区中的节点,GKE 控制平面不受影响。
目标
- 使用默认配置创建区域级 GKE Standard 集群。
- 将示例微服务应用部署到区域级集群。
- 使用以下三种方法之一模拟可用区服务中断:
- 减少区域级集群中节点池的可用区。
- 使用单可用区节点池。
- 封锁并排空目标故障可用区的节点。
- 验证微服务可用性。
费用
本教程使用 Google Cloud 的以下收费组件:
- Compute Engine
- GKE Standard 模式集群
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine API, Compute Engine APIs:
gcloud services enable container.googleapis.com
compute.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine API, Compute Engine APIs:
gcloud services enable container.googleapis.com
compute.googleapis.com
创建区域级标准集群
在模拟可用区故障之前,先创建一个具有多可用区节点池的区域级集群。集群的控制平面和节点将在指定区域的多个可用区中复制。
使用 Google Cloud CLI 创建集群:
使用默认配置创建新的 GKE Standard 集群:
gcloud container clusters create CLUSTER_NAME \ --region REGION \ --num-nodes 2
替换以下参数:
CLUSTER_NAME
:您的集群的名称。REGION
:集群的区域,例如us-central1
。
GKE 创建集群并验证一切是否正常运行需要几分钟时间。系统会在您指定区域的每个可用区中创建两个节点。
检查在上一步中创建的每个节点的可用区:
kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
输出类似于以下示例:
NAME ZONE INT_IP regional-cluster-1-default-pool-node1 asia-southeast1-c 10.128.0.37 regional-cluster-1-default-pool-node2 asia-southeast1-c 10.128.0.36 regional-cluster-1-default-pool-node3 asia-southeast1-b 10.128.0.38 regional-cluster-1-default-pool-node4 asia-southeast1-b 10.128.0.33 regional-cluster-1-default-pool-node5 asia-southeast1-a 10.128.0.35 regional-cluster-1-default-pool-node6 asia-southeast1-a 10.128.0.34
连接到该集群:
gcloud container clusters get-credentials CLUSTER_NAME \ --region REGION
部署微服务示例应用
如需查看本文档中模拟故障切换的影响,请将基于微服务的示例应用部署到您的集群。在本文档中,您将使用 Cymbal Bank 示例应用:
在 Shell 中,克隆以下 GitHub 代码库并切换到该目录:
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git cd bank-of-anthos/
将 Cymbal Bank 示例应用部署到您在上一部分中创建的 GKE 集群:
kubectl apply -f ./extras/jwt/jwt-secret.yaml kubectl apply -f ./kubernetes-manifests
等待 Pod 准备就绪:
kubectl get pods
几分钟后,您应该会看到处于
Running
状态的 Pod:NAME READY STATUS RESTARTS AGE accounts-db-0 1/1 Running 0 16s balancereader-7dc7d9ff57-sstm5 0/1 Running 0 15s contacts-7ddc76d94-rr28x 0/1 Running 0 14s frontend-747b84bff4-2mtlv 0/1 Running 0 13s ledger-db-0 1/1 Running 0 13s ledgerwriter-f6cc7889d-9qjfg 0/1 Running 0 13s loadgenerator-57d4cb57cc-zqvqb 1/1 Running 0 13s transactionhistory-5dd7c7fd77-lwkv8 0/1 Running 0 12s userservice-cd5ddb4bb-wwhml 0/1 Running 0 12s
当所有 Pod 都处于
Running
状态时,获取前端服务的外部 IP 地址:kubectl get service frontend | awk '{print $4}'
在网络浏览器窗口中,打开
kubectl get service
命令输出中显示的 IP 地址以访问 Cymbal Bank 实例。系统会自动填充默认凭据,因此您可以登录该应用并浏览一些示例交易和余额。除了确认 Cymbal Bank 成功运行之外,您无需执行任何具体操作。所有服务都可能需要一两分钟才能正确启动,让您能够登录。等待所有 Pod 处于
Running
状态,您可以成功登录 Cymbal Bank 网站,然后再继续下一部分并模拟可用区故障。
模拟可用区故障
在本部分中,您将模拟其中一个可用区的故障。您可以通过以下三种不同的方式模拟此类故障切换。您只需选择一种方法。使用您自己的合规性目的所需的任一方法,模拟可用区故障并验证正确的应用响应。
减少节点池可用区
默认情况下,区域级集群的节点池包含分布在其所在区域的所有可用区中的节点。在下图中,Cloud Load Balancing 将流量分配到跨三个可用区的节点池。每个可用区都有两个节点,您的 Pod 可以在这些可用区中的任意节点中运行。
在本部分中,您将模拟可用区故障,方法是将节点池更新为仅在两个可用区(共三个可用区)中运行。此方法通过将 Pod 和流量正确地重新分配到其他可用区,验证您的应用可以应对可用区丢失的情况。
如需将节点池更新为仅在特定可用区运行并模拟故障,请完成以下步骤:
检查区域级集群和服务的可用性:
kubectl get po -o wide \ kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
结果类似于以下示例输出:
NAME READY STATUS RESTARTS AGE IP NODE accounts-db-0 1/1 Running 0 6m30s 10.28.1.5 regional-cluster-1-default-pool-node3 balancereader-7dc7d9ff57-shwg5 1/1 Running 0 6m30s 10.28.5.6 regional-cluster-1-default-pool-node1 contacts-7ddc76d94-qv4x5 1/1 Running 0 6m29s 10.28.4.6 regional-cluster-1-default-pool-node2 frontend-747b84bff4-xvjxq 1/1 Running 0 6m29s 10.28.3.6 regional-cluster-1-default-pool-node6 ledger-db-0 1/1 Running 0 6m29s 10.28.5.7 regional-cluster-1-default-pool-node1 ledgerwriter-f6cc7889d-mttmb 1/1 Running 0 6m29s 10.28.1.6 regional-cluster-1-default-pool-node3 loadgenerator-57d4cb57cc-7fvrc 1/1 Running 0 6m29s 10.28.4.7 regional-cluster-1-default-pool-node2 transactionhistory-5dd7c7fd77-cmc2w 1/1 Running 0 6m29s 10.28.3.7 regional-cluster-1-default-pool-node6 userservice-cd5ddb4bb-zfr2g 1/1 Running 0 6m28s 10.28.5.8 regional-cluster-1-default-pool-node1 NAME ZONE INT_IP regional-cluster-1-default-pool-node5 asia-southeast1-c 10.148.0.6 regional-cluster-1-default-pool-node6 asia-southeast1-c 10.148.0.7 regional-cluster-1-default-pool-node2 asia-southeast1-a 10.148.0.8 regional-cluster-1-default-pool-node1 asia-southeast1-a 10.148.0.9 regional-cluster-1-default-pool-node3 asia-southeast1-b 10.148.0.5 regional-cluster-1-default-pool-node4 asia-southeast1-b 10.148.0.4
在此示例中,所有 Cymbal Bank 工作负载都部署在所有可用区中。如需模拟故障,请停用部署前端服务的其中一个可用区,例如
asia-southeast1-c
。模拟可用区服务中断。更新现有节点池 (
default-pool
),使其仅指定三个可用区中的两个可用区:gcloud container node-pools update default-pool \ --cluster=CLUSTER_NAME \ --node-locations=ZONE_A, ZONE_B \ --region=REGION
将
ZONE_A, ZONE_B
替换为您希望节点池继续运行的两个可用区。更新节点池后,验证微服务可用性:
kubectl get po -o wide kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
输出内容应如下例所示:
NAME ZONE INT_IP regional-cluster-1-default-pool-node2 asia-southeast1-a 10.148.0.8 regional-cluster-1-default-pool-node1 asia-southeast1-a 10.148.0.9 regional-cluster-1-default-pool-node3 asia-southeast1-b 10.148.0.5 regional-cluster-1-default-pool-node4 asia-southeast1-b 10.148.0.4 NAME READY STATUS RESTARTS AGE IP NODE accounts-db-0 1/1 Running 0 28m 10.28.1.5 regional-cluster-1-default-pool-node3 balancereader-7dc7d9ff57-shwg5 1/1 Running 0 28m 10.28.5.6 regional-cluster-1-default-pool-node1 contacts-7ddc76d94-qv4x5 1/1 Running 0 28m 10.28.4.6 regional-cluster-1-default-pool-node2 frontend-747b84bff4-mdnkd 1/1 Running 0 9m21s 10.28.1.7 regional-cluster-1-default-pool-node3 ledger-db-0 1/1 Running 0 28m 10.28.5.7 regional-cluster-1-default-pool-node1 ledgerwriter-f6cc7889d-mttmb 1/1 Running 0 28m 10.28.1.6 regional-cluster-1-default-pool-node3 loadgenerator-57d4cb57cc-7fvrc 1/1 Running 0 28m 10.28.4.7 regional-cluster-1-default-pool-node2 transactionhistory-5dd7c7fd77-w2vqs 1/1 Running 0 9m20s 10.28.4.8 regional-cluster-1-default-pool-node2 userservice-cd5ddb4bb-zfr2g 1/1 Running 0 28m 10.28.5.8 regional-cluster-1-default-pool-node1
在此示例输出中,
asia-southeast1-c
不再使用。您使用浏览器通过网址http://EXTERNAL_IP
访问的前端服务仍然可以访问。即使其中一个可用区不再可用,用户仍然可以执行存款和付款操作。
使用单可用区节点池
在本部分中,您将通过删除两个节点池来模拟可用区故障。此方法通过将 Pod 和流量正确地重新分配到其他可用区中的节点池,验证您的应用可以响应节点池丢失的情况。如需模拟区域级集群上的可用区故障,请扩展之前创建的基本集群,并在多个节点池中运行 Cymbal Bank 应用。与第一个更新节点池中的活跃可用区的示例相比,这种模拟可用区中断的方法更能反映实际的可用区故障,因为一个集群中存在多个节点池的情况更常见:
您在此部分中构建的用于模拟单可用区节点池故障的集群包含以下组件:
默认节点池(通常在创建区域级 GKE Standard 集群时创建),即多区域节点池 (
default-pool
)。这个带有单个
default-pool
的集群就是您之前在本文档中创建的集群。也为 Cymbal Bank 示例应用运行服务的其他节点池(
zonal-node-pool-1
和zonal-node-pool-2
)。
图中的虚线表示在您模拟 default-pool
和 zonal-node-pool-1
中的故障后,流量如何仅为 zonal-node-pool-2
服务。
如需创建其他节点池并模拟故障,请完成以下步骤:
检查区域级集群的可用性:
gcloud container node-pools list \ --cluster=CLUSTER_NAME \ --region REGION kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
结果类似于以下示例输出:
NAME: default-pool MACHINE_TYPE: e2-medium DISK_SIZE_GB: 100 NODE_VERSION: 1.27.8-gke.1067004 NAME ZONE. INT_IP regional-cluster-1-default-pool-node5-pzmc asia-southeast1-c 10.148.0.6 regional-cluster-1-default-pool-node6-qf1l asia-southeast1-c 10.148.0.7 regional-cluster-1-default-pool-node2-dlk2 asia-southeast1-a 10.148.0.8 regional-cluster-1-default-pool-node1-pkfd asia-southeast1-a 10.148.0.9 regional-cluster-1-default-pool-node3-6b6n asia-southeast1-b 10.148.0.5 regional-cluster-1-default-pool-node4-h0lc asia-southeast1-b 10.148.0.4
在此示例输出中,所有 Cymbal Bank Pod 都部署在同一集群下的所有可用区中,并在现有
default-pool
中运行。创建两个新的单可用区节点池:
gcloud beta container node-pools create zonal-node-pool-1 \ --cluster CLUSTER_NAME \ --region REGION \ --num-nodes 4 \ --node-locations ZONE_A gcloud beta container node-pools create zonal-node-pool-2 \ --cluster CLUSTER_NAME \ --region REGION \ --num-nodes 4 \ --node-locations ZONE_B
将
ZONE_A
和ZONE_B
替换为您希望在其中运行新的单可用区节点池的两个可用区。如需模拟可用区故障,请删除
default-pool
区域级节点池和一个新的单可用区节点池:gcloud container node-pools delete default-pool \ --cluster=CLUSTER_NAME \ --region=REGION gcloud container node-pools delete zonal-node-pool-1 \ --cluster=CLUSTER_NAME \ --region=REGION
在
node-pool
删除过程中,系统会关闭工作负载并将其重新安排到其他可用节点池。发生这种情况时,Service 和 Deployment 将不可用。此行为意味着,您需要为灾难恢复报告或文档指定停机时间。验证微服务的持续可用性:
kubectl get po -o wide \ kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
输出应类似于以下示例:
NAME ZONE INT_IP regional-cluster-1-node-pool3-node1 asia-southeast1-b 10.148.0.8 regional-cluster-1-node-pool3-node2 asia-southeast1-b 10.148.0.9 regional-cluster-1-node-pool3-node3 asia-southeast1-b 10.148.0.5 regional-cluster-1-node-pool3-node4 asia-southeast1-b 10.148.0.4 NAME READY STATUS RESTARTS AGE IP NODE accounts-db-0 1/1 Running 0 28m 10.28.1.5 regional-cluster-1-zonal-node-pool-2-node3 balancereader-7dc7d9ff57-shwg5 1/1 Running 0 28m 10.28.5.6 regional-cluster-1-zonal-node-pool-2-node1 contacts-7ddc76d94-qv4x5 1/1 Running 0 28m 10.28.4.6 regional-cluster-1-zonal-node-pool-2-node2 frontend-747b84bff4-mdnkd 1/1 Running 0 9m21s 10.28.1.7 regional-cluster-1-zonal-node-pool-2-node3 ledger-db-0 1/1 Running 0 28m 10.28.5.7 regional-cluster-1-zonal-node-pool-2-node4 ledgerwriter-f6cc7889d-mttmb 1/1 Running 0 28m 10.28.1.6 regional-cluster-1-zonal-node-pool-2-node3 loadgenerator-57d4cb57cc-7fvrc 1/1 Running 0 28m 10.28.4.7 regional-cluster-1-zonal-node-pool-2-node2 transactionhistory-5dd7c7fd77-w2vqs 1/1 Running 0 9m20s 10.28.4.8 regional-cluster-1-zonal-node-pool-2-node2 userservice-cd5ddb4bb-zfr2g 1/1 Running 0 28m 10.28.5.8 regional-cluster-1-zonal-node-pool-2-node1
在此示例输出中,由于
default-pool
和zonal-node-pool-1
不复存在,因此所有 Service 都在zonal-node-pool-2
中运行。
封锁并排空可用区中的节点
在本部分中,您将封锁并排空集群中的特定节点。您可以封锁并排空单个可用区中的所有节点,从而模拟在该可用区的这些节点上运行的 Pod 丢失的情况:
在此图中,您将封锁并排空第一个可用区中的节点。其他两个可用区中的节点继续运行。此方法通过将 Pod 和流量正确地重新分布到在其他可用区运行的节点之间,验证您的应用可以响应一个可用区中所有节点丢失的情况。
如需封锁并排空其中一个可用区中的节点(模拟故障),请完成以下步骤:
检查区域级集群和 Service 的可用性。查看目标故障可用区的节点名称。您希望指定运行前端 Pod 的可用区:
kubectl get pods -o wide
输出内容应如下例所示:
NAME READY STATUS RESTARTS AGE IP NODE accounts-db-0 1/1 Running 0 4m7s 10.96.4.4 regional-cluster-1-default-pool-node2 balancereader-7dc7d9ff57-lv4z7 1/1 Running 0 4m7s 10.96.1.5 regional-cluster-1-default-pool-node1 contacts-7ddc76d94-wxvg5 1/1 Running 0 4m7s 10.96.6.11 regional-cluster-1-default-pool-node3 frontend-747b84bff4-gvktl 1/1 Running 0 4m7s 10.96.1.4 regional-cluster-1-default-pool-node1 ledger-db-0 1/1 Running 0 4m7s 10.96.4.5 regional-cluster-1-default-pool-node2 ledger-db-1 1/1 Running 0 3m50s 10.96.0.13 regional-cluster-1-default-pool-node5 ledgerwriter-f6cc7889d-4hqbm 1/1 Running 0 4m6s 10.96.0.12 regional-cluster-1-default-pool-node5 loadgenerator-57d4cb57cc-fmq52 1/1 Running 0 4m6s 10.96.4.6 regional-cluster-1-default-pool-node2 transactionhistory-5dd7c7fd77-72zpx 1/1 Running 0 4m6s 10.96.6.12 regional-cluster-1-default-pool-node3 userservice-cd5ddb4bb-b7862 1/1 Running 0 4m6s 10.96.1.6 regional-cluster-1-default-pool-node1
将上一个输出中列出的 Pod 与节点的可用区关联:
kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
输出内容应如下例所示:
NAME ZONE INT_IP regional-cluster-1-default-pool-node1 asia-southeast1-b 10.148.0.41 regional-cluster-1-default-pool-node2 asia-southeast1-b 10.148.0.42 regional-cluster-1-default-pool-node3 asia-southeast1-a 10.148.0.37 regional-cluster-1-default-pool-node4 asia-southeast1-a 10.148.0.38 regional-cluster-1-default-pool-node5 asia-southeast1-c 10.148.0.40 regional-cluster-1-default-pool-node6 asia-southeast1-c 10.148.0.39
在上面的示例输出中,前端 Pod 位于可用区
asia-southeast1-b
的regional-cluster-1-default-pool-node1
中。在下一步中,您将跟踪可用区
asia-southeast1-b
中的所有节点,在此示例中,输出为regional-cluster-1-default-pool-node1
和regional-cluster-1-default-pool-node2
封锁并排空其中一个可用区中的目标节点。在此示例中,这是
asia-southeast1-b
中的两个节点:kubectl drain regional-cluster-1-default-pool-node1 \ --delete-emptydir-data --ignore-daemonsets kubectl drain regional-cluster-1-default-pool-node2 \ --delete-emptydir-data --ignore-daemonsets
此命令会将节点标记为无法安排,并模拟节点故障。Kubernetes 会将 Pod 重新调度到正常运行可用区中的其他节点。
查看之前在故障可用区的节点上运行的新前端 Pod 和其他示例 Cymbal Bank Pod 现在重新安排的位置:
kubectl get po -o wide kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
输出内容应如下例所示:
NAME READY STATUS RESTARTS AGE IP NODE accounts-db-0 1/1 Running 0 4m7s 10.96.4.4 regional-cluster-1-default-pool-node4 balancereader-7dc7d9ff57-lv4z7 1/1 Running 0 4m7s 10.96.1.5 regional-cluster-1-default-pool-node6 contacts-7ddc76d94-wxvg5 1/1 Running 0 4m7s 10.96.6.11 regional-cluster-1-default-pool-node3 frontend-747b84bff4-gvktl 1/1 Running 0 4m7s 10.96.1.4 regional-cluster-1-default-pool-node3 ledger-db-0 1/1 Running 0 4m7s 10.96.4.5 regional-cluster-1-default-pool-node6 ledger-db-1 1/1 Running 0 3m50s 10.96.0.13 regional-cluster-1-default-pool-node5 ledgerwriter-f6cc7889d-4hqbm 1/1 Running 0 4m6s 10.96.0.12 regional-cluster-1-default-pool-node5 loadgenerator-57d4cb57cc-fmq52 1/1 Running 0 4m6s 10.96.4.6 regional-cluster-1-default-pool-node4 transactionhistory-5dd7c7fd77-72zpx 1/1 Running 0 4m6s 10.96.6.12 regional-cluster-1-default-pool-node3 userservice-cd5ddb4bb-b7862 1/1 Running 0 4m6s 10.96.1.6 regional-cluster-1-default-pool-node3 NAME ZONE INT_IP regional-cluster-1-default-pool-node3 asia-southeast1-a 10.148.0.37 regional-cluster-1-default-pool-node4 asia-southeast1-a 10.148.0.38 regional-cluster-1-default-pool-node5 asia-southeast1-c 10.148.0.40 regional-cluster-1-default-pool-node6 asia-southeast1-c 10.148.0.39
在此示例输出中,没有示例 Cymbal Bank Pod 在封锁节点上运行,所有 Pod 现在仅在其他两个可用区运行。
节点上的 Pod 中断预算 (PDB) 可能会阻止节点排空。在封锁和排空操作之前评估 PDB 政策。如需详细了解 PDB 及其与管理中断的关系,请参阅如何确保 GKE 集群的可靠性和正常运行时间。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请执行以下操作。
删除项目
若要避免产生费用,最简单的方法是删除您为本教程创建的项目。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 了解如何模拟可用区级托管式实例组 (MIG) 在一个可用区发生服务中断的情况。
- 了解 Google Cloud 上的灾难恢复。
- 跨多个可用区设置高可用性 PostgreSQL。
- Pod 中断预算注意事项。
- 了解可用区与区域永久性磁盘。
- 了解如何在 GKE 中运行高可用性数据库。
- 详细了解 Google Cloud 上的灾难恢复最佳做法。
- 了解 Backup for GKE。