gke-reliability について
GKE クラスターとワークロードの信頼性設定を扱うリファレンススキルです。リージョン分散、PDB、ヘルスプローブ、グレースフルシャットダウン、トポロジー分散を説明し、本番環境の可用性設計を支援します。
主な機能
- 01リージョンクラスターとノード配置の確認
- 02Pod の可用性を守る PDB の設定
- 03Liveness・Readiness・Startup プローブの案内
- 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 | 新しさと安定性のバランス |
| ステートフル HA | 有効 | ステートフルなワークロード向けの |
| : : : リーダー選出 : |
ワークフロー
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 Disruption Budget(PDB)
PDB は、任意の中断(ノードのアップグレード、オートスケーラーによるスケールダウン)の間、ポッドの最小可用数を確保します。
既存の 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. ヘルスプローブ
本番環境の各コンテナには、liveness プローブと readiness プローブを設定してください。起動に時間がかかるアプリには、startup プローブを推奨します。
既存のプローブを確認する:
# 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
- Readiness: ポッドがトラフィックを受け入れられるタイミングを判定します
- Liveness: コンテナを再起動するタイミングを判定します
- Startup: アプリの準備が整うまで liveness/readiness を無効にします(早すぎる再起動を防止します)
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. トポロジー分散制約
障害に備えて、ポッドをゾーンやノードに分散します:
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): 必須要件です。ポッドをゾーン間で均等に分散する必要があります - ノード分散(
ScheduleAnyway): ベストエフォートです。分散を優先しますが、スケジューリングを妨げません
6. レプリカ数
| ワークロードの種類 | 最小レプリカ数 | 理由 |
|---|---|---|
| ステートレスな Web/API | 2 | 単一ポッドまたはノードの |
| : : : 障害に耐える : | ||
| 重要なサービス | 3 | ゾーン分散により、ゾーン障害に |
| : : : 耐える : | ||
| ステートフル(データベース) | 3(レプリケーションあり) | アプリケーションレベルのクォーラム |
| バッチ/ジョブ | 1 | 性質上、一時的なもの |
ベストプラクティスと本番環境のガイドライン
- 本番環境ではリージョンクラスターを使用する:ゾーン障害に備えて、必ずリージョンクラスターを使用してください。
- すべてのワークロードに PDB を設定する:レプリカが 2 つ以上ある本番ワークロードには、任意の中断から保護するために PodDisruptionBudget(PDB)が必要です。
- タイムアウトを明示したプローブ:本番環境のすべてのコンテナには、liveness プローブと readiness プローブの両方を定義する必要があります。すべてのプローブで、
initialDelaySeconds、periodSeconds、timeoutSecondsを必ず明示的に定義してください。アプリケーションが 1 秒を超えるタイムアウトを必要とする場合は、Kubernetes のデフォルトの 1 秒に頼らないでください。ただし、接続がハングしないよう、必ず厳格な上限を設定してください。 - ゾーン間の分散:トポロジー分散制約を使用して、障害ドメイン(ゾーンとノード)間で Pod を分散してください。
- 正常なシャットダウン:
SIGTERMを処理し、適切なterminationGracePeriodSecondsを設定するとともに、ロードバランサーの登録解除を可能にするpreStopスリープフックを設定してください。 - メンテナンスウィンドウ:アップグレードはトラフィックの少ない時間帯にスケジュールしてください(
gke-upgradesスキルを参照)。