运维部署
配置 GKE 工作负载高可用与可靠性时:用区域集群、PDB…
在 GKE 生产环境中配置工作负载可靠性、可用区和节点故障容忍、PDB 与健康探针时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
配置 GKE 工作负载高可用与可靠性时:特定
解决思路
- 将集群类型配置为 Regional(示例 4 zones: us-central1-a/b/c/f),使控制平面跨 zones 复制。
- 将升级策略配置为 SURGE(maxSurge: 1),以滚动升级并保留额外容量。
- 启用 auto-repair=true,自动替换不健康节点。
- 启用 auto-upgrade=true,使节点跟随控制平面版本。
- 将 release channel 设置为 REGULAR,平衡新特性和稳定性。
- 启用 Stateful HA,为有状态工作负载启用 leader election。
- 验证集群高可用:优先用 MCP `get_cluster(name="projects/<PROJECT>/locations/<REGION>/clusters/<CLUSTER>", readMask="location,locations,nodePools.locations")`。
- 验证集群高可用回退:运行 `gcloud container clusters describe <CLUSTER> --region <REGION> --format="json(location, locations)" --quiet`。
- 根据集群描述判断:如果 `location` 是区域(如 `us-central1`),控制平面是 regional;如果 `locations` 有多个条目,则节点跨多个 zone。
- 检查现有 PDB:优先用 MCP `get_k8s_resource(parent="...", resourceType="poddisruptionbudget")`。
- 检查现有 PDB 回退:运行 `kubectl get pdb --all-namespaces`。
- 创建 PDB:应用 `apiVersion: policy/v1`、`kind: PodDisruptionBudget`,设置 `metadata.name`、`metadata.namespace`、`spec.minAvailable: 2`(或 `maxUnavailable: 1`),并用 `spec.selector.matchLabels` 选择应用(如 `app: my-app`)。
- 对每个副本数 2+ 的生产 Deployment 配置 PDB,以在节点升级、autoscaler 缩容等自愿中断期间保证最小 Pod 可用性。
- 检查现有探针:优先用 MCP `describe_k8s_resource(parent="...", resourceType="deployment", name="<APP>", namespace="<NS>")`。
- 检查现有探针回退:运行 `kubectl get deployment <APP> -n <NS> -o yaml | grep -E "livenessProbe|readinessProbe|startupProbe"`。
- 为每个生产容器配置 liveness 和 readiness 探针;慢启动应用配置 startupProbe。
- 配置 livenessProbe:`httpGet.path: /healthz`、`httpGet.port: 8080`、`initialDelaySeconds: 15`、`periodSeconds: 10`、`timeoutSeconds: 2`、`failureThreshold: 3`。
- 配置 readinessProbe:`httpGet.path: /readyz`、`httpGet.port: 8080`、`initialDelaySeconds: 5`、`periodSeconds: 5`、`timeoutSeconds: 2`、`failureThreshold: 3`。
- 配置 startupProbe:`httpGet.path: /healthz`、`httpGet.port: 8080`、`initialDelaySeconds: 10`、`periodSeconds: 5`、`timeoutSeconds: 2`、`failureThreshold: 30`(30 * 5s = 150s 最大启动时间)。
- 将 readiness 用于判断 Pod 何时可接收流量;将 liveness 用于判断何时重启容器;将 startup 用于在应用就绪前禁用 liveness/readiness,防止过早重启。
- 配置优雅关闭:设置 `terminationGracePeriodSeconds: 30`(长运行请求可增加),并在容器 `lifecycle.preStop.exec.command` 中使用 `["/bin/sh", "-c", "sleep 5"]` 以允许负载均衡器注销。
- 确保应用处理 `SIGTERM` 并排空 in-flight 请求。
- 配置 zone 拓扑分布约束:设置 `topologySpreadConstraints` 的第一个约束 `maxSkew: 1`、`topologyKey: topology.kubernetes.io/zone`、`whenUnsatisfiable: DoNotSchedule`、`labelSelector.matchLabels: app: my-app`,硬性要求 Pod 跨 zone 平衡。
- 添加 node 拓扑分布约束:设置第二个约束 `maxSkew: 1`、`topologyKey: kubernetes.io/hostname`、`whenUnsatisfiable: ScheduleAnyway`、`labelSelector.matchLabels: app: my-app`,尽力优先分布但不阻塞调度。
- 设置无状态 web/API 最少 2 个副本,以承受单个 Pod/节点故障。
- 设置关键服务最少 3 个副本,以配合 zone 分布承受 zone 故障。
- 设置有状态(数据库)最少 3 个副本并启用复制,以实现应用级 quorum。
- 设置批处理/jobs 为 1 个副本,因为其本质是临时的。
- 生产环境始终使用 regional clusters 以承受 zone 故障。
- 对每个副本数 2+ 的生产工作负载都使用 PDB,防止自愿中断。
- 为所有生产容器定义 liveness 和 readiness 探针,并始终显式定义 `initialDelaySeconds`、`periodSeconds`、`timeoutSeconds`;如果应用需要超过 Kubernetes 默认 1 秒超时,不要依赖默认值,但要设置严格上限防止挂起连接。
- 使用 topology spread constraints 将 Pod 分布在故障域(zones 和 nodes)。
- 处理 `SIGTERM`,设置合适的 `terminationGracePeriodSeconds`,并使用 `preStop` sleep hook 允许负载均衡器注销。
- 将升级安排在低流量时段的维护窗口(参见 `gke-upgrades` skill)。
适用边界 · 注意事项
- 不要用于灾难恢复设置或完整集群备份;这些应使用 gke-backup-dr。
- 不适用于非 GKE Kubernetes 集群,或没有 GKE 工具、账号和相应权限的环境。