- GKE クラスタの構造(コントロールプレーン / ノード)と Google との責任分界を説明できる
- Autopilot と Standard の 2 モードを要件から選択し、課金モデルの違いを説明できる
- Deployment を Service / Gateway API で公開し、コンテナネイティブ負荷分散の利点を説明できる
- HPA・VPA・クラスタオートスケーラ・ノード自動プロビジョニングの 4 つのスケーリングを使い分けられる
- VPC ネイティブクラスタの IP 設計と Workload Identity Federation for GKE を構成できる
試験ガイド対応: セクション 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(ノードエージェント)とコンテナランタイムが載り、ログ収集やクラスタ内ネットワークを担うシステムコンテナも動きます。
可用性はモードと構成で変わります。2026-08 時点の SLA は、Autopilot クラスタとリージョン Standard クラスタのコントロールプレーンが 99.95%、ゾーン Standard クラスタのコントロールプレーンが 99.5%、複数ゾーンに配置された Autopilot Pod が 99.9% です。本番クラスタでゾーン構成を選ばない、という判断軸をまず覚えてください。
Autopilot と Standard — 2 つの運用モード
GKE には 2 つの運用モードがあります。Autopilot は Google がノード・スケーリング・セキュリティ設定まで管理し、ワークロードの記述に集中できるモードで、公式ドキュメントも Autopilot の利用を推奨しています。Standard はノードプール(同一構成のノードのグループ)を自分で設計・運用するモードで、マシンタイプや OS などノードレベルの細かい制御が必要な場合に選びます。
| 観点 | Autopilot | Standard |
|---|---|---|
| ノード管理 | Google が全自動(プロビジョニング・修復・更新) | ユーザーがノードプールを設計。自動修復・自動更新は GKE が提供 |
| 課金単位 | 汎用ワークロードは Pod のリソースリクエスト単位。GPU 等の特定ハードウェア利用時はノード単位 + 管理プレミアム | ノード(VM)単位。空き容量にも課金される |
| ノードのスケール | ワークロードに応じて全自動 | クラスタオートスケーラ・NAP をユーザーが設定 |
| セキュリティ既定 | 強化設定とベストプラクティスが自動適用。GKE Dataplane V2 が既定で有効 | ユーザーが選択・設定 |
| 向くケース | ほとんどの本番ワークロード(推奨) | 特殊なマシン構成・ノード単位のチューニングが必要な場合 |
料金は 2026-08 時点で、モードやトポロジによらずクラスタ管理料 $0.10/クラスタ/時(1 秒単位課金)がかかります。ただし GKE の無料枠として請求先アカウントごとに月 $74.40 のクレジットがあり、ゾーン Standard または Autopilot クラスタ 1 つ分の管理料が実質無料になります。本章のハンズオンはこの無料枠の範囲で組み立てます。
リリースチャンネルとアップグレード
GKE はコントロールプレーンを自動アップグレードします。どの速度で新バージョンを受け取るかを決めるのがリリースチャンネルです。重要なセキュリティパッチはどのチャンネルにも配布されます。
| チャンネル | 新バージョンの提供時期 | 用途 |
|---|---|---|
| Rapid | OSS の GA から 1〜2 週間 | 検証環境で新機能を先取り |
| Regular(既定) | Rapid から約 2 か月後 | 安定性と新しさのバランス。ほとんどのユーザーへの推奨 |
| Stable | Regular から 3〜4 か月後 | 安定性を最優先する本番 |
| Extended | Regular と同時期 | マイナーバージョンに最長 24 か月とどまる長期サポート |
アップグレードのタイミングはメンテナンスウィンドウと除外期間で制御できます。「マイナー / ノードのアップグレード禁止」などスコープを絞った除外はチャンネル登録済みクラスタでのみ使えます。未登録クラスタが選べるのは全アップグレードを止める除外だけで、このスコープの除外はどのクラスタでも最長 90 日です。
ワークロードの基本と公開 — 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 は役割指向の設計が特徴で、リソースが担当者ごとに分かれます。
- GatewayClass — ロードバランサの種別テンプレート。例:
gke-l7-global-external-managed(グローバル外部)、gke-l7-rilb(リージョン内部) - Gateway — どの IP / ポートで待ち受けるか。クラスタ運用者が作成
- HTTPRoute — どのパスをどの Service に流すか。アプリ開発者が作成
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 を直接登録するため、余分なホップが消えます。
コンテナネイティブ負荷分散は VPC ネイティブクラスタが前提です。条件(VPC ネイティブ、共有 VPC 不使用、GKE ネットワークポリシー不使用、HttpLoadBalancing アドオン有効)を満たすと、GKE は Service に cloud.google.com/neg アノテーションを自動付与してこの方式を既定にします。
スケーリングの階層 — HPA・VPA・クラスタオートスケーラ・NAP
GKE のスケーリングは「Pod を変える層」と「ノードを変える層」の 2 階建てで理解します。4 つの仕組みは競合するのではなく、連鎖して動きます。
押さえるべき挙動が 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/20 | GKE 管理範囲は 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 です。
有効化するとプロジェクトに PROJECT_ID.svc.id.goog という Workload Identity プールが用意され、KSA を IAM から principal:// 識別子として直接参照できるようになります。つまり「この namespace のこの KSA に、このロールを付与する」という素直な IAM 設計がそのまま書けます。Autopilot クラスタでは常に有効で、Standard では --workload-pool フラグで有効化します。
Autopilot クラスタを作り、サンプルアプリを Deployment としてデプロイし、LoadBalancer Service で外部公開します。所要 30〜40 分(クラスタ作成の待ち時間を含む)。費用: クラスタ管理料 $0.10/時は無料枠(月 $74.40)で相殺でき、小さな Pod 1 つとロードバランサで 1 時間あたり数円〜十数円程度です(2026-08 時点)。Cloud Shell での実行を想定しています(ローカルの gcloud + kubectl でも同じです)。
- 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
- サンプルアプリを 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
- 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-1 の Deployment を手動スケールし、HPA を設定して自動スケールの土台を確認します。所要 10 分。費用: 増やした Pod のリクエスト分が加算されますが、数分なら数円未満です。
- レプリカ数を 3 に増やし、Pod が増えることを確認する
kubectl scale deployment hello-server --replicas=3
kubectl get pods
3 つの Pod が Running(直後は Pending や ContainerCreating)で並びます。Autopilot では、既存ノードに載り切らない Pod が出るとノードの確保まで自動で行われるため、Pending は自然に解消されます。これが図 6-4 の連鎖です。
- 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
KSA に IAM ロールを直接付与し、鍵ファイルなしで Pod から Cloud Storage API を呼び出します。所要 15 分。費用: 空のバケットと小さな Pod を短時間使うだけなので数円程度です。Autopilot クラスタでは Workload Identity Federation for GKE が常に有効なので、クラスタ側の追加設定は不要です。
- namespace と Kubernetes サービスアカウント(KSA)を作成する
kubectl create namespace wi-demo
kubectl create serviceaccount wi-test --namespace wi-demo
- 検証用のバケットを作り、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
- 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
- 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
つまずきポイント
type: LoadBalancer の Service は裏で Cloud Load Balancing のリソースを作ります。公式チュートリアルの後片付けも「Service を削除してからクラスタを削除する」順序です。ハンズオンを中断するときも、まず kubectl delete service を実行する癖をつけてください。Off モードで推奨値を確認し、リクエストを実態に合わせるのが最初のコスト最適化です。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 はデータを世界に公開するため論外です。
まとめと次章へ
- GKE クラスタは Google 管理のコントロールプレーンと、自プロジェクトのノード(Compute Engine VM)で構成される。kubectl の相手は常に API サーバー
- モードは Autopilot が推奨。Pod のリクエスト単位課金でノード運用が不要。ノードレベルの制御が必要なときだけ Standard を選ぶ
- HTTP(S) の公開は Ingress の後継である Gateway API(GatewayClass / Gateway / HTTPRoute の役割分離)が既定。VPC ネイティブクラスタなら NEG による Pod 直達のコンテナネイティブ負荷分散が効く
- スケーリングはワークロード層(HPA / VPA)とインフラ層(クラスタオートスケーラ / NAP)の 2 階建て。判断基準はリソースリクエストであり、使用率ではない
- Pod から Google Cloud API へのアクセスは Workload Identity Federation for GKE 一択。SA キーの保存・配布を設計から消せる
次の第 7 章では Cloud Run とサーバーレスを学び、Compute Engine・GKE・Cloud Run を「どう選び分けるか」という試験最頻出のデシジョンツリーを完成させます。
参考リンク(公式ドキュメント):