mcpField
G
gke-reliability

gke-reliability

github.com/googleクラウド・DevOps21.6k6.7k 回インストール今日更新
リポジトリ

gke-reliability について

GKE クラスターとワークロードの信頼性設定を扱うリファレンススキルです。リージョン分散、PDB、ヘルスプローブ、グレースフルシャットダウン、トポロジー分散を説明し、本番環境の可用性設計を支援します。

主な機能

  1. 01リージョンクラスターとノード配置の確認
  2. 02Pod の可用性を守る PDB の設定
  3. 03Liveness・Readiness・Startup プローブの案内
  4. 04トポロジー制約によるワークロード分散
  5. 05レプリカ数とグレースフルシャットダウンの計画

活用シーン

  1. 01本番クラスターの高可用性設定の確認
  2. 02ノード更新時のサービス停止の抑制
  3. 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/API2単一ポッドまたはノードの
: : : 障害に耐える :
重要なサービス3ゾーン分散により、ゾーン障害に
: : : 耐える :
ステートフル(データベース)3(レプリケーションあり)アプリケーションレベルのクォーラム
バッチ/ジョブ1性質上、一時的なもの

ベストプラクティスと本番環境のガイドライン

  1. 本番環境ではリージョンクラスターを使用する:ゾーン障害に備えて、必ずリージョンクラスターを使用してください。
  2. すべてのワークロードに PDB を設定する:レプリカが 2 つ以上ある本番ワークロードには、任意の中断から保護するために PodDisruptionBudget(PDB)が必要です。
  3. タイムアウトを明示したプローブ:本番環境のすべてのコンテナには、liveness プローブと readiness プローブの両方を定義する必要があります。すべてのプローブで、initialDelaySeconds、periodSeconds、timeoutSeconds を必ず明示的に定義してください。アプリケーションが 1 秒を超えるタイムアウトを必要とする場合は、Kubernetes のデフォルトの 1 秒に頼らないでください。ただし、接続がハングしないよう、必ず厳格な上限を設定してください。
  4. ゾーン間の分散:トポロジー分散制約を使用して、障害ドメイン(ゾーンとノード)間で Pod を分散してください。
  5. 正常なシャットダウン:SIGTERM を処理し、適切な terminationGracePeriodSeconds を設定するとともに、ロードバランサーの登録解除を可能にする preStop スリープフックを設定してください。
  6. メンテナンスウィンドウ:アップグレードはトラフィックの少ない時間帯にスケジュールしてください(gke-upgrades スキルを参照)。

コメント