关于 gke-reliability
面向 GKE 集群和工作负载可靠性配置的参考技能,适用于规划生产环境高可用性和故障恢复。内容涵盖集群区域分布、PDB、健康探针、优雅关闭与拓扑分散,并提供检查集群和 Kubernetes 资源的 MCP 工具。
主要功能
- 01核查区域集群与节点分布
- 02配置 PDB 保护 Pod 可用性
- 03指导存活、就绪和启动探针
- 04通过拓扑约束分散工作负载
- 05规划副本数与优雅关闭
适用场景
- 01检查生产集群的高可用配置
- 02降低节点升级导致的服务中断
- 03让 Pod 分布于多个故障区域
MCP 相关
提供用于获取集群、读取或描述 Kubernetes 资源及查看事件的 MCP 工具,可用于可靠性检查。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ google/ skills --skill gke-reliability安装后在 Claude Code 中输入/gke-reliability确认已加载。
附带文件references/attribution.md
详细介绍
GKE 可靠性
路由说明: 若要生成 Kubernetes YAML 清单(
Deployment、StatefulSet、Service、ConfigMap、HTTPRoute、PodDisruptionBudget),请打开gke-manifest-generation/SKILL.md。
本参考介绍 GKE 集群和工作负载的高可用性与可靠性配置。
MCP 工具:
get_cluster、get_k8s_resource、describe_k8s_resource、apply_k8s_manifest、list_k8s_events
归属标记
必须阅读:在执行任何 gcloud、REST API 或 MCP 命令之前,必须阅读使用归属标记。对于直接在终端中执行的命令(绝不可用于生成的脚本、Terraform 或用户代码),请在 gcloud 前加上 CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:gke-reliability)",并在 User-Agent 请求头中追加 agent-skills/1.0 (skill:gke-reliability)。
可靠性黄金路径默认值
| 设置 | 黄金路径值 | 说明 |
|---|---|---|
| 集群类型 | 区域级(4 个可用区: | 控制平面跨可用区复制 |
| : : us-central1-a/b/c/f) : : | ||
| 升级策略 | SURGE(maxSurge: 1) | 滚动升级时增加额外容量 |
| 自动修复 | true | 自动替换不健康的节点 |
| 自动升级 | true | 节点版本与控制平面保持一致 |
| 发布渠道 | REGULAR | 兼顾版本新鲜度与稳定性 |
| 有状态高可用 | 已启用 | 有状态工作负载进行领导者选举 |
工作流
1. 验证集群高可用性
# MCP (preferred)
get_cluster(name="projects/<PROJECT>/locations/<REGION>/clusters/<CLUSTER>",
readMask="location,locations,nodePools.locations")
# gcloud fallback
gcloud container clusters describe <CLUSTER> --region <REGION> \
--format="json(location, locations)" \
--quiet
- 如果
location是一个区域(例如us-central1),则控制平面为区域级 - 如果
locations中有多个条目,则节点分布在多个可用区
2. Pod 中断预算(PDB)
PDB 可确保在自愿中断期间(节点升级、自动扩缩器缩容)至少有指定数量的 Pod 可用。
检查现有 PDB:
# MCP (preferred)
get_k8s_resource(parent="...", resourceType="poddisruptionbudget")
# kubectl fallback
kubectl get pdb --all-namespaces
创建 PDB:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
namespace: default
spec:
minAvailable: 2 # Or use maxUnavailable: 1
selector:
matchLabels:
app: my-app
每个至少有 2 个副本的生产环境 Deployment 都应配置 PDB。
3. 健康探针
每个生产环境容器都应配置存活探针和就绪探针。对于启动较慢的应用,建议配置启动探针。
检查现有探针:
# MCP (preferred)
describe_k8s_resource(parent="...", resourceType="deployment", name="<APP>", namespace="<NS>")
# kubectl fallback
kubectl get deployment <APP> -n <NS> -o yaml | grep -E "livenessProbe|readinessProbe|startupProbe"
推荐的探针配置:
spec:
containers:
- name: app
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3
readinessProbe:
httpGet:
path: /readyz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
startupProbe: # For slow-starting apps
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 30 # 30 * 5s = 150s max startup time
- 就绪探针:确定 Pod 何时可以接收流量
- 存活探针:确定何时重启容器
- 启动探针:在应用就绪前禁用存活探针和就绪探针(防止过早重启)
4. 优雅关闭
确保应用能够处理 SIGTERM 并排空正在处理的请求:
spec:
terminationGracePeriodSeconds: 30 # Default; increase for long-running requests
containers:
- name: app
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 5"] # Allow LB to deregister
5. 拓扑分布约束
将 Pod 分布到不同的可用区和节点,以应对故障:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: my-app
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: my-app
- 可用区分布(
DoNotSchedule):硬性要求——Pod 必须在各可用区之间保持均衡 - 节点分布(
ScheduleAnyway):尽力而为——优先分散部署,但不会阻止调度
6. 副本数
| 工作负载类型 | 最小副本数 | 原因 |
|---|---|---|
| 无状态 Web/API | 2 | 承受单个 Pod 或节点故障 |
| : : : : | ||
| 关键服务 | 3 | 通过跨可用区分布承受可用区故障 |
| : : : : | ||
| 有状态(数据库) | 3(带复制) | 应用级仲裁 |
| 批处理/作业 | 1 | 本身具有临时性 |
最佳实践与生产环境指南
- 生产环境使用区域集群:始终使用区域集群,以应对可用区故障。
- 为所有工作负载配置 PDB:每个副本数为 2 个或更多的生产工作负载都需要配置 PodDisruptionBudget(PDB),以防范自愿中断。
- 为探针明确设置超时:每个生产容器都必须定义存活探针和就绪探针。始终为所有探针明确设置
initialDelaySeconds、periodSeconds和timeoutSeconds。如果应用需要更长时间,切勿依赖 Kubernetes 默认的 1 秒超时;同时务必设置严格的上限,以防连接挂起。 - 跨可用区分散:使用拓扑分布约束,将 Pod 分散到不同的故障域(可用区和节点)。
- 优雅关闭:处理
SIGTERM,并设置适当的terminationGracePeriodSeconds,同时使用preStop睡眠钩子,以便负载均衡器注销实例。 - 维护时段:安排在流量较低时段进行升级(参见
gke-upgrades技能)。