Google Cloud ハンズオン教科書|2026-08 版
第 6 章 試験ガイド 2.3 試験ガイド 1.3

GKE — マネージド Kubernetes

Autopilot で始めるコンテナオーケストレーション。クラスタ設計の勘所を掴む

この章で学ぶこと

試験ガイド対応: セクション 2.3(コンピューティング システムの構成とプロビジョニング)、セクション 1.3(コンピューティング リソースの設計)

GKE の全体像 — クラスタ・モード・料金

GKE(Google Kubernetes Engine)は、オープンソースのコンテナオーケストレータ Kubernetes のマネージド実装です。第 4 章の Compute Engine が「VM を自分で並べる」世界だったのに対し、GKE では「コンテナのあるべき状態」を宣言すると、配置・復旧・スケールを Kubernetes が継続的に調整します。PCA 試験ではコンピューティング選択の主要な選択肢として、Cloud Run(第 7 章)との使い分けが繰り返し問われます。

クラスタ = コントロールプレーン + ノード

GKE クラスタは、Kubernetes API サーバー・スケジューラ・コアリソースコントローラを実行するコントロールプレーンと、コンテナが実際に動くノード(Compute Engine VM)で構成されます。コントロールプレーンは作成から削除まで Google が全面管理し、クラスタ状態の保存には etcd または Spanner ベースのストレージが使われます。ノードには kubelet(ノードエージェント)とコンテナランタイムが載り、ログ収集やクラスタ内ネットワークを担うシステムコンテナも動きます。

開発者 / kubectl Kubernetes API を呼び出す コントロールプレーン Google が管理・SLA あり API サーバー スケジューラ・コントローラ 状態 DB(etcd / Spanner) ノードプール ユーザーのプロジェクトの VM ノード(Compute Engine VM) kubelet・ランタイム・Pod ノード(自動修復・自動更新) Pod を配置 状態を報告
図 6-1 GKE クラスタの分業。コントロールプレーン(API サーバー・スケジューラ・状態 DB)は Google が運用し、コンテナは自分のプロジェクト内のノードで動く。kubectl が話す相手は常に API サーバーで、ノードに直接指示することはない。

可用性はモードと構成で変わります。2026-08 時点の SLA は、Autopilot クラスタとリージョン Standard クラスタのコントロールプレーンが 99.95%、ゾーン Standard クラスタのコントロールプレーンが 99.5%、複数ゾーンに配置された Autopilot Pod が 99.9% です。本番クラスタでゾーン構成を選ばない、という判断軸をまず覚えてください。

Autopilot と Standard — 2 つの運用モード

GKE には 2 つの運用モードがあります。Autopilot は Google がノード・スケーリング・セキュリティ設定まで管理し、ワークロードの記述に集中できるモードで、公式ドキュメントも Autopilot の利用を推奨しています。Standard はノードプール(同一構成のノードのグループ)を自分で設計・運用するモードで、マシンタイプや OS などノードレベルの細かい制御が必要な場合に選びます。

観点AutopilotStandard
ノード管理Google が全自動(プロビジョニング・修復・更新)ユーザーがノードプールを設計。自動修復・自動更新は GKE が提供
課金単位汎用ワークロードは Pod のリソースリクエスト単位。GPU 等の特定ハードウェア利用時はノード単位 + 管理プレミアムノード(VM)単位。空き容量にも課金される
ノードのスケールワークロードに応じて全自動クラスタオートスケーラ・NAP をユーザーが設定
セキュリティ既定強化設定とベストプラクティスが自動適用。GKE Dataplane V2 が既定で有効ユーザーが選択・設定
向くケースほとんどの本番ワークロード(推奨)特殊なマシン構成・ノード単位のチューニングが必要な場合
ノード構成を細かく制御したい? いいえ はい GPU など特定ハードウェアを使う? Standard モード ノードプールを自分で設計・運用 ノード(VM)単位で課金 いいえ はい Autopilot:Pod ベース課金 Pod のリクエスト分を支払う Autopilot:ノードベース課金 ハードウェア + 管理プレミアム 全モード共通でクラスタ管理料 $0.10/クラスタ/時(2026-08 時点)
図 6-2 モード選択と課金の分岐。迷ったら Autopilot が出発点で、Pod のリソースリクエスト分だけを支払う。GPU など特定ハードウェアを使う Pod はノードベース課金に切り替わる。

料金は 2026-08 時点で、モードやトポロジによらずクラスタ管理料 $0.10/クラスタ/時(1 秒単位課金)がかかります。ただし GKE の無料枠として請求先アカウントごとに月 $74.40 のクレジットがあり、ゾーン Standard または Autopilot クラスタ 1 つ分の管理料が実質無料になります。本章のハンズオンはこの無料枠の範囲で組み立てます。

リリースチャンネルとアップグレード

GKE はコントロールプレーンを自動アップグレードします。どの速度で新バージョンを受け取るかを決めるのがリリースチャンネルです。重要なセキュリティパッチはどのチャンネルにも配布されます。

チャンネル新バージョンの提供時期用途
RapidOSS の GA から 1〜2 週間検証環境で新機能を先取り
Regular(既定)Rapid から約 2 か月後安定性と新しさのバランス。ほとんどのユーザーへの推奨
StableRegular から 3〜4 か月後安定性を最優先する本番
ExtendedRegular と同時期マイナーバージョンに最長 24 か月とどまる長期サポート

アップグレードのタイミングはメンテナンスウィンドウと除外期間で制御できます。「マイナー / ノードのアップグレード禁止」などスコープを絞った除外はチャンネル登録済みクラスタでのみ使えます。未登録クラスタが選べるのは全アップグレードを止める除外だけで、このスコープの除外はどのクラスタでも最長 90 日です。

試験の視点: 「運用チームが小さい」「ノード管理の工数を掛けたくない」「それでも Kubernetes API・エコシステムが必要」という要件の組み合わせが出たら Autopilot が正解筋です。Kubernetes 自体が不要(コンテナを動かしたいだけ)なら Cloud Run、ノードのカスタム構成やノード単位のチューニングが要件に明示されていたら Standard を選びます。

ワークロードの基本と公開 — Service・Gateway API

Kubernetes ではコンテナを Pod(1 つ以上のコンテナの実行単位)として動かし、Deployment が「Pod を何個、どのイメージで」という宣言を維持します。Pod は入れ替わるたびに IP が変わるため、安定した入口として Service を置きます。Service の type: LoadBalancer を指定すると、GKE が Cloud Load Balancing のロードバランサを自動作成して外部公開します。

HTTP(S) の公開は Gateway API へ

HTTP(S) レイヤの公開には長らく Ingress が使われてきましたが、現在の GKE は後継のオープン標準 Gateway API を提供しています。Gateway API は役割指向の設計が特徴で、リソースが担当者ごとに分かれます。

Ingress ではアノテーション頼みだったヘッダーマッチングやトラフィックの重み付けが組み込み機能になり、既存の Ingress リソースは Gateway と HTTPRoute に変換できます。公式ドキュメントも時間をかけた移行を推奨しているため、新規設計は Gateway API を既定にしてください。単一クラスタ向けの GKE Gateway コントローラは既定で有効です。第 5 章の Cloud Load Balancing のプロキシ型 LB が裏側で作られる、と捉えると全体がつながります。

コンテナネイティブ負荷分散

GKE の LB でもう 1 つ重要なのがコンテナネイティブ負荷分散です。従来はインスタンスグループ(ノード)にトラフィックを分散し、ノード上の kube-proxy が設定した iptables ルールで Pod へ再転送していました。コンテナネイティブ方式では GCE_VM_IP_PORT タイプの NEG(ネットワークエンドポイントグループ)に Pod の IP を直接登録するため、余分なホップが消えます。

従来方式(インスタンスグループ経由) 外部 ALB ノード VM iptables Pod(別ノード) ① ノードへ ② iptables が転送 ホップが増えレイテンシ増 コンテナネイティブ(NEG) 外部 ALB Pod エンドポイント Pod IP へ直達 NEG が Pod IP を LB に直接登録 ノードの iptables を経由しない 前提: VPC ネイティブクラスタ
図 6-3 2 つの負荷分散経路の違い。左は LB がまずノードに配り、iptables が改めて Pod へ転送する二重ホップ。右は NEG に登録された Pod IP へ LB が直接届けるため、レイテンシが減り Pod 単位のヘルスチェックも可能になる。

コンテナネイティブ負荷分散は VPC ネイティブクラスタが前提です。条件(VPC ネイティブ、共有 VPC 不使用、GKE ネットワークポリシー不使用、HttpLoadBalancing アドオン有効)を満たすと、GKE は Service に cloud.google.com/neg アノテーションを自動付与してこの方式を既定にします。

スケーリングの階層 — HPA・VPA・クラスタオートスケーラ・NAP

GKE のスケーリングは「Pod を変える層」と「ノードを変える層」の 2 階建てで理解します。4 つの仕組みは競合するのではなく、連鎖して動きます。

ワークロード層(Pod の形と数を変える) HPA(水平 Pod 自動スケーリング) Pod の数を増減 CPU・メモリ・カスタム・外部指標 VPA(垂直 Pod 自動スケーリング) リソース要求値を推奨・調整 CPU/メモリでは HPA と併用不可 インフラ層(ノードの数を変える) クラスタオートスケーラ 既存ノードプール内でノード増減 リソースリクエスト量で判断 ノード自動プロビジョニング(NAP) 要件に合う新しいプールを作成 Standard 専用(Autopilot は自動) Pending Pod が発生 適合プール無し
図 6-4 スケーリングの連鎖。HPA が Pod を増やし、載る場所がなくなると Pending Pod がクラスタオートスケーラを起動してノードを追加する。既存プールのどれにも収まらない要求なら NAP が新しいノードプールごと作る。

押さえるべき挙動が 2 つあります。第一に、クラスタオートスケーラは実際の使用率ではなく Pod のリソースリクエストを基準に判断します。リクエストが過大だと、CPU が遊んでいてもノードは減りません。第二に、HPA と VPA を CPU / メモリ指標で同じワークロードに併用してはいけません(両立させたい場合は多次元 Pod 自動スケーリングを使います)。VPA には推奨値の提示だけを行う Off モードがあるので、まず推奨値を見てリクエストを手動調整するのが安全な入口です。

Autopilot ではインフラ層の 2 つを意識する必要がありません。ノードのプロビジョニングもノードプール管理も GKE が自動で行うため、ユーザーが設計するのはワークロード層(HPA / VPA とリソースリクエスト)だけです。

GKE のネットワークと ID — VPC ネイティブと Workload Identity

VPC ネイティブクラスタの IP 設計

現在の GKE クラスタは既定で VPC ネイティブクラスタです。第 3 章で学んだ VPC のエイリアス IP 範囲を使い、Pod の IP を VPC 内でネイティブにルーティングします。カスタム静的ルートのクォータを消費せず、Pod IP 宛のファイアウォールルールが書け、NEG(=コンテナネイティブ負荷分散)も VPC ネイティブでのみ動きます。IP は 3 系統を計画します。

対象割り当て元設計メモ
ノードサブネットのプライマリ IPv4 範囲作成後に縮小できない。ノード数上限はプレフィックス長で決まる(例: 900 ノードなら最低 /22)
Podサブネットのセカンダリ範囲Standard は既定でノードごとに /24(256 アドレス、最大 110 Pod)を確保。Autopilot は Pod 密度に応じて GKE が自動調整。「最大ノード数 × 256」で枯渇を先読みする
Serviceセカンダリ範囲、または GKE 管理範囲 34.118.224.0/20GKE 管理範囲は Autopilot 1.27 以降 / Standard 1.29 以降の既定

Workload Identity Federation for GKE

Pod の中のアプリが Cloud Storage や Pub/Sub を呼ぶとき、認証はどうすべきでしょうか。サービスアカウントキーを Secret に置く方式は漏えいリスクと鍵管理の負担が大きく、ノードのサービスアカウントに権限を持たせる方式は全 Pod が同じ権限を共有してしまいます。第 2 章で触れた「キーを作らない」原則を GKE で実現するのが Workload Identity Federation for GKE です。

Workload Identity プール: PROJECT_ID.svc.id.goog(プロジェクトごとに自動作成) Pod(アプリ) Kubernetes SA で実行 Google Cloud API IAM が principal を評価 GKE メタデータサーバー メタデータ要求を横取り Security Token Service トークンを発行 ① 認証情報を要求 ② KSA の JWT を交換 ③ 連合アクセストークンを返す ④ トークン付きで API を呼び出す SA キーの作成・配布・ローテーションが不要になる
図 6-5 Workload Identity Federation for GKE のトークン交換。ノードで動く GKE メタデータサーバーが Pod からの認証情報要求を横取りし、Kubernetes サービスアカウント(KSA)の JWT を STS で Google Cloud のトークンに交換して Pod へ返す。鍵ファイルはどこにも存在しない。

有効化するとプロジェクトに PROJECT_ID.svc.id.goog という Workload Identity プールが用意され、KSA を IAM から principal:// 識別子として直接参照できるようになります。つまり「この namespace のこの KSA に、このロールを付与する」という素直な IAM 設計がそのまま書けます。Autopilot クラスタでは常に有効で、Standard では --workload-pool フラグで有効化します。

試験の視点: 「GKE 上のアプリから Google Cloud API に安全にアクセスする」問題では、サービスアカウントキーをマウント / 環境変数化する選択肢は常に誤りです。Workload Identity Federation for GKE を含む選択肢を最優先で検討してください。ノード SA に広い権限を与える選択肢も最小権限違反で除外です。
ハンズオン 6-1|Autopilot クラスタを作成してアプリをデプロイ・公開する

Autopilot クラスタを作り、サンプルアプリを Deployment としてデプロイし、LoadBalancer Service で外部公開します。所要 30〜40 分(クラスタ作成の待ち時間を含む)。費用: クラスタ管理料 $0.10/時は無料枠(月 $74.40)で相殺でき、小さな Pod 1 つとロードバランサで 1 時間あたり数円〜十数円程度です(2026-08 時点)。Cloud Shell での実行を想定しています(ローカルの gcloud + kubectl でも同じです)。

  1. API を有効化し、東京リージョンに Autopilot クラスタを作成して認証情報を取得する(作成には 5〜10 分程度かかる)
gcloud services enable container.googleapis.com

gcloud container clusters create-auto hello-cluster \
    --location=asia-northeast1

gcloud container clusters get-credentials hello-cluster \
    --location=asia-northeast1
  1. サンプルアプリを Deployment として作成し、LoadBalancer Service で公開する
kubectl create deployment hello-server \
    --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

kubectl expose deployment hello-server \
    --type LoadBalancer \
    --port 80 \
    --target-port 8080
  1. Pod と Service の状態を確認する。EXTERNAL-IP は最初 pending と表示され、数分で外部 IP が割り当てられる
kubectl get pods
kubectl get service hello-server

EXTERNAL-IP が表示されたら、ブラウザまたは curl で http://EXTERNAL_IP にアクセスし、サンプルアプリの応答が返れば成功です。Autopilot なのでノードのことは一度も考えていない点に注目してください。

後片付け: Service を削除してロードバランサへの課金を止めます。クラスタと Deployment はハンズオン 6-2 で使うため残します(ここで終える場合は 6-3 末尾のクラスタ削除コマンドまで実行してください)。

kubectl delete service hello-server
ハンズオン 6-2|Deployment のスケールと HPA を操作する

ハンズオン 6-1 の Deployment を手動スケールし、HPA を設定して自動スケールの土台を確認します。所要 10 分。費用: 増やした Pod のリクエスト分が加算されますが、数分なら数円未満です。

  1. レプリカ数を 3 に増やし、Pod が増えることを確認する
kubectl scale deployment hello-server --replicas=3
kubectl get pods

3 つの Pod が Running(直後は Pending や ContainerCreating)で並びます。Autopilot では、既存ノードに載り切らない Pod が出るとノードの確保まで自動で行われるため、Pending は自然に解消されます。これが図 6-4 の連鎖です。

  1. HPA を設定し、CPU 使用率 60% を目標に 1〜5 レプリカで自動調整させる
kubectl autoscale deployment hello-server \
    --cpu-percent=60 --min=1 --max=5
kubectl get hpa

TARGETS 列に現在値 / 目標値(例: cpu: 1%/60%)が表示されます。負荷がなければ HPA は徐々にレプリカを最小値まで戻します。

後片付け: HPA と Deployment を削除します(クラスタは 6-3 で使います)。

kubectl delete hpa hello-server
kubectl delete deployment hello-server
ハンズオン 6-3|Workload Identity Federation で Pod から Cloud Storage にアクセスする

KSA に IAM ロールを直接付与し、鍵ファイルなしで Pod から Cloud Storage API を呼び出します。所要 15 分。費用: 空のバケットと小さな Pod を短時間使うだけなので数円程度です。Autopilot クラスタでは Workload Identity Federation for GKE が常に有効なので、クラスタ側の追加設定は不要です。

  1. namespace と Kubernetes サービスアカウント(KSA)を作成する
kubectl create namespace wi-demo
kubectl create serviceaccount wi-test --namespace wi-demo
  1. 検証用のバケットを作り、KSA を指す principal 識別子に閲覧ロールを付与する。PROJECT_ID と PROJECT_NUMBER はコマンドで取得して変数に入れる
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" \
    --format="value(projectNumber)")

gcloud storage buckets create gs://$PROJECT_ID-wi-demo \
    --location=asia-northeast1

gcloud projects add-iam-policy-binding projects/$PROJECT_ID \
    --role=roles/storage.objectViewer \
    --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/wi-demo/sa/wi-test \
    --condition=None
  1. KSA で動くテスト Pod を作成する。次の内容を test-pod.yaml として保存する(Standard クラスタの場合のみ、公式手順どおり iam.gke.io/gke-metadata-server-enabled: "true" の nodeSelector を追加する)
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: wi-demo
spec:
  serviceAccountName: wi-test
  containers:
  - name: test-pod
    image: google/cloud-sdk:slim
    command: ["sleep","infinity"]
    resources:
      requests:
        cpu: 500m
        memory: 512Mi
        ephemeral-storage: 10Mi
  1. Pod を起動してシェルに入り、Cloud Storage API を呼ぶ。BUCKET_NAME は手順 2 で作ったバケット名(PROJECT_ID-wi-demo の実名)に置き換える
kubectl apply -f test-pod.yaml
kubectl exec -it pods/test-pod --namespace=wi-demo -- /bin/bash

# ここから Pod 内で実行
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o"

空のバケットなら {"kind": "storage#objects"} が返ります。鍵ファイルを一切作らずに、Pod が自分の KSA の身元で Google Cloud API を呼べました。exit で Pod から抜けてください。

後片付け: namespace・IAM バインディング・バケット・クラスタをすべて削除し、最後にクラスタが消えたことを確認します。

kubectl delete namespace wi-demo

gcloud projects remove-iam-policy-binding projects/$PROJECT_ID \
    --role=roles/storage.objectViewer \
    --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/wi-demo/sa/wi-test \
    --condition=None

gcloud storage buckets delete gs://$PROJECT_ID-wi-demo

gcloud container clusters delete hello-cluster \
    --location=asia-northeast1 --quiet

gcloud container clusters list

つまずきポイント

LoadBalancer Service の消し忘れで課金が続く: type: LoadBalancer の Service は裏で Cloud Load Balancing のリソースを作ります。公式チュートリアルの後片付けも「Service を削除してからクラスタを削除する」順序です。ハンズオンを中断するときも、まず kubectl delete service を実行する癖をつけてください。
使用率は低いのにノードが減らない / コストが下がらない: クラスタオートスケーラも Autopilot の課金も、実際の使用率ではなくリソースリクエストを基準にします。リクエストが過大なままだと CPU が遊んでいても支払いは減りません。VPA の Off モードで推奨値を確認し、リクエストを実態に合わせるのが最初のコスト最適化です。
Pod 用 IP 範囲の枯渇: VPC ネイティブの Standard クラスタは既定でノードごとに /24(256 個)の Pod IP を確保するため、セカンダリ範囲が狭いとノードを増やせなくなります。しかもサブネットのプライマリ範囲は後から縮小できません。クラスタ作成前に「最大ノード数 × 256」で Pod 範囲を見積もってください。オンプレミスや他 VPC と接続する予定があるなら、第 12 章の CIDR 重複問題も先に確認します。
kubectl が「connection refused」になる: クラスタを作った直後やシェルを開き直した後は、kubeconfig に認証情報が入っていないことがあります。gcloud container clusters get-credentials を location 付きで実行し直してください。対象クラスタの取り違え(別リージョン・別プロジェクト)もこのコマンドで解消できます。

理解度チェック

Q1. Autopilot モードと Standard モードの、管理範囲と課金単位の違いは?

Autopilot は Google がノードの管理(プロビジョニング・修復・更新・スケール)まで担い、課金は汎用ワークロードなら Pod のリソースリクエスト単位です。Standard はノードプールをユーザーが設計・運用し、課金はノード(VM)単位で空き容量にも発生します。どちらもクラスタ管理料 $0.10/時(2026-08 時点)は共通です。

Q2. クラスタオートスケーラは何を基準にノードの増減を判断する?

Pod のリソースリクエストです(実際の使用率ではありません)。スケジュールできない Pending Pod が出るとノードを追加し、リクエスト合計が少なく他ノードへ Pod を移せるノードは削除候補になります。リクエストの過大設定がそのままコスト増になる、という理解が重要です。

Q3. VPC ネイティブクラスタで、ノード・Pod・Service の IP はそれぞれどこから割り当てられる?

ノードはサブネットのプライマリ IPv4 範囲、Pod はサブネットのセカンダリ範囲(Standard の既定でノードあたり /24)、Service はセカンダリ範囲または GKE 管理範囲(34.118.224.0/20)です。Pod IP が VPC 内でネイティブにルーティングできることが、NEG によるコンテナネイティブ負荷分散の前提になります。

Q4.(試験形式)開発チームは Kubernetes マニフェストで管理された社内アプリ群を Google Cloud へ移行したい。インフラ専任者はおらず、ノードの選定やアップグレード運用に工数を割けない。どれを選ぶべきか?
A. GKE Standard + ノード自動プロビジョニング B. GKE Autopilot C. Cloud Run D. Compute Engine の MIG

B。Kubernetes マニフェスト資産があるため Kubernetes API が必要で、かつノード運用を持ちたくないので Autopilot が最適です。A はプール作成こそ自動化されますが、ノードレベルの設計・運用責任は残ります。C はコンテナ実行には適しますが Kubernetes マニフェストをそのまま使えず移植作業が発生します。D はコンテナオーケストレーションを自作することになり要件に逆行します。

Q5.(試験形式)GKE 上のアプリケーションが Cloud Storage のオブジェクトを読む必要がある。セキュリティのベストプラクティスに沿う方法は?
A. サービスアカウントキーを Secret に保存して Pod にマウント B. ノードのサービスアカウントに storage.objectViewer を付与 C. Workload Identity Federation for GKE で KSA に IAM ロールを付与 D. バケットを公開して匿名アクセスさせる

C。鍵ファイルを作らず、ワークロード単位の最小権限を実現できます。A は鍵の漏えい・ローテーションのリスクをアプリ側が抱え込みます。B はノード上の全 Pod が同じ権限を共有し最小権限に反します。D はデータを世界に公開するため論外です。

まとめと次章へ

次の第 7 章では Cloud Run とサーバーレスを学び、Compute Engine・GKE・Cloud Run を「どう選び分けるか」という試験最頻出のデシジョンツリーを完成させます。

参考リンク(公式ドキュメント):