🎉

GKE StandardクラスタでAutopilotノードが利用できるようになったので見てみよう

に公開

はじめに

こんにちは。間瀬です。自身のZennアカウントでは初投稿になります。
記念すべき最初の投稿では、2025年9月末にGKEで利用可能になったStandardクラスタでAutopilotノードを利用することができる機能について紹介したいと思います。

Standardクラスタ vs Autopilotクラスタ

既にこれらの違いを理解している方は読み飛ばしていただいて問題ありません。

Standardクラスタは従来から存在するクラスタモードで、ユーザーがノードの管理を担うことに対し、Autopilotクラスタは比較的新しいクラスタモードで、ノードの管理を Google Cloud が担うフルマネージドのクラスタモードです。

Standardクラスタではノードの構成やプロビジョニング、バージョンをユーザーが柔軟に管理することができるメリットがありますが、開発・運用するためのノウハウが要求され運用負荷が高くなる傾向にあります。
Autopilotクラスタはこれらユーザーの課題に応えるものになっていて、Google Cloud のベストプラクティスに基づいたノードの構成と管理を自動化してくれることで運用負荷を削減することができます。

sd_ap_archi

また、課金体系にも違いがあり、Standardクラスタはノード(VM)単位でのCPU/メモリ/ディスクに対する課金であるのに対し、AutopilotクラスタはPod単位に対するCPU/メモリ/ディスク課金となります。
例えると、水を購入するときにバケツに対してお金を支払うか、水道料金のように水の使用量に対してお金を支払うかの違いになります。

sd_ap_cost

比較項目 Standardクラスタ Autopilotクラスタ
ノードの管理責任 ユーザー Google Cloud
課金体系 ノード(VM)単位 Pod単位
カスタマイズによる自由度 高い 低い

詳細に触れませんが、課金体系の違いと同様にSLAも異なっています。

どちらのクラスタモードが必ず良いというわけではなく、ユースケースと柔軟性やコスト最適化のしやすさといった観点から選択することになります。

個人的な経験ではAutopilotクラスタを選択することが多く、ワークロードが実行できないなどの問題や特別な制約がない限りはAutopilotクラスタを選択することを推奨しています。

「StandardクラスタでAutopilotノードを利用する」とは?

今回のアップデートでStandardとして作成されたクラスタ上で、Autopilotクラスタを利用する際のノードと同等のノードを利用できるようになりました。
同等というのは、上記で記述したようなノードの管理責任や課金体系、カスタマイズ性が同じであることを指しています。

sd_ap_node

メリット

StandardクラスタでAutopilotノードを利用できることで、以下のようなメリットが得られます。

1. ハイブリッドな運用が可能に

同一のStandardクラスタ内で、ワークロードの特性に応じて最適なノードを選択できるようになります。
例えばノードバージョンのアップデートを慎重に行う必要があったり、常時稼働する安定したワークロードは従来のノード上で管理しつつ、それら以外のワークロードはAutopilotノードで管理することでアップデートにかかる時間や運用負荷を削減しつつ、コスト削減効果も期待することができます。

2. ワークロードを容易にAutopilotノードへ移行することができる

クラスタを一度作成するとモードの移行はできないため、既にStandardクラスタを利用していてAutopilotクラスタに移行したい場合、Autopilotクラスタを新たに作成して移行する必要がありましたが、本機能によって一つのクラスタの中で既存のノードからAutopilotノードへ容易に移行することができます。

ノードプール

以降の解説の内容を理解しやすくするため、GKEのノードプールの概念について簡単に触れたいと思います。既にノードプールの概念を理解されている方は読み飛ばしていただいて問題ありません。
GKEにノードを作成・追加したい場合、ノード(例:仮想マシン1台)という単位で構成することはなく、必ずノードプールというグループのような単位で構成・管理することになります。一つのノードプール上で生成されるノードの構成は全て同じものになります。

node_pool

Autopilotノードを利用してみる

ここからはStandardクラスタでAutopilotノードプールを作成し、利用する方法を解説していきます。
というものの、利用するための手順はほとんどありません。前提条件が幾つかあるので公式ドキュメントを確認してください。

1. ワークロードをデプロイするためのマニフェストで ComputeClass "Autopilot" を指定する

今回のアップデートで、Autopilotノードを利用するための ComputeClass が追加されているのでこれをマニフェストで指定します。

デフォルトでは、autopilot と autopilot-spot の2つの ComputeClass が利用できます。
後者については Autopilotノードでスポットインスタンスを利用することができます。ワークロードの停止が許容できる開発環境やジョブで活用することでコストを削減することができます。

以下はマニフェストのサンプルになります。今回はComputeClassとしてautopilotを指定しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-http-server
  labels:
    app: sample-http-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-http-server
  template:
    metadata:
      labels:
        app: sample-http-server
    spec:
      nodeSelector:
        # AutopilotノードプールのComputeClassを指定 autopilot or autopilot-spot
        cloud.google.com/compute-class: autopilot
      containers:
      - name: sample-http-server
        image: asia-northeast1-docker.pkg.dev/my-project/apps/sample-http-server
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "50m"
            memory: "52Mi"

2. デプロイ

kubectl apply -f k8s-deployment-autopilot.yaml ← 上記yamlファイル名

上記デプロイ前のGKEクラスタノードは以下の通りでした。

gke-cluster-standard-default-pool-ce8cf66f-fts9       Ready                      <none>   73m   v1.34.1-gke.2037001
gke-cluster-standard-default-pool-ce8cf66f-klkb       Ready                      <none>   73m   v1.34.1-gke.2037001

デプロイコマンドの実行後にノードを確認すると、以下の通りAutopilotノードが追加されていることが分かります。

NAME                                                  STATUS                     ROLES    AGE   VERSION
gk3-cluster-standard-nap-e2-standard--101c5267-btb6   Ready                      <none>   32m   v1.34.1-gke.2037001 ← Autopilotノード
gke-cluster-standard-default-pool-ce8cf66f-fts9       Ready                      <none>   73m   v1.34.1-gke.2037001 ← Standardノード
gke-cluster-standard-default-pool-ce8cf66f-klkb       Ready                      <none>   73m   v1.34.1-gke.2037001 ← Standardノード

デプロイ後のワークロードの状態は以下の通りです。最も右の列より、Autopilotノード上で実行されていることが分かります。

NAME                                 READY   STATUS    RESTARTS   AGE   IP          NODE
sample-http-server-9b5b5b757-k7zg8   1/1     Running   0          13s   10.84.2.8   gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-9b5b5b757-k95tz   1/1     Running   0          14s   10.84.2.6   gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-9b5b5b757-v7hpn   1/1     Running   0          14s   10.84.2.7   gk3-cluster-standard-nap-e2-standard--101c5267-btb6

参考までにですが、Autopilotノードはコンソールからは視認できないようになっています。
この挙動はAutopilotクラスタを利用している場合と同様です。

autopilot_node_console

ComputeClass

解説の中でいきなり出てきたComputeClassについて簡単に触れたいと思います。

既にノードプールの概念について説明しましたが、ComputeClassは複数のノードプールを利用する優先度や条件及び、構成を定義して管理できるようになります。
例えば、ワークロードの特性に合わせてComputeClassを作成しておくことで、最適なノードを使うことができたり、優先して使いたいノードが確保できなくても代替ノードを使うことができるようになります。

今回のAutopilotノードの追加にあわせて、自身で定義するカスタムComputeClassでもAutopilotノードを利用することができるようになっています。

StandardクラスタのノードからAutopilotノードへワークロードを移行してみる

次に既にStandardクラスタを利用している状況でAutopilotノードへワークロードを移行できるか試してみたいと思います。(そりゃできるだろうけど)

事前準備

まずはAutopilotを利用しないワークロードをデプロイしておきます。

NAME                                            READY   STATUS    NODE
sample-http-server-migration-57794964f7-44f4w   1/1     Running  gke-cluster-standard-default-pool-ce8cf66f-klkb
sample-http-server-migration-57794964f7-h6p7k   1/1     Running  gke-cluster-standard-default-pool-ce8cf66f-fts9
sample-http-server-migration-57794964f7-lrjnt   1/1     Running  gke-cluster-standard-default-pool-ce8cf66f-fts9

上記で紹介した解説と同様にこれらワークロードを管理するマニフェストにて、ComputeClassを指定して反映します。

# 省略
    spec:
      nodeSelector:
        cloud.google.com/compute-class: autopilot
# 省略
kubectl apply -f k8s-deployment.yaml

反映結果のワークロードの遷移は以下のようになりました。
Deploymentのルール(今回は1台ずつ移行)に従ってワークロードがAutopilotノードへ順次移行されていることが分かります。

NAME                                            READY   STATUS    RESTARTS   AGE     IP           NODE                                           
sample-http-server-migration-57794964f7-44f4w   1/1     Running   0          8m30s   10.84.0.14   gke-cluster-standard-default-pool-ce8cf66f-klkb
sample-http-server-migration-57794964f7-h6p7k   1/1     Running   0          8m30s   10.84.1.10   gke-cluster-standard-default-pool-ce8cf66f-fts9
sample-http-server-migration-57794964f7-lrjnt   1/1     Running   0          8m30s   10.84.1.11   gke-cluster-standard-default-pool-ce8cf66f-fts9

# 一台目の移行
sample-http-server-migration-9cc7cff5-hg648     0/1     Pending   0          10s     <none>       <none>
sample-http-server-migration-9cc7cff5-hg648     0/1     ContainerCreating   0          2m49s   <none>       gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-migration-9cc7cff5-hg648     1/1     Running             0          3m1s    10.84.2.2    gk3-cluster-standard-nap-e2-standard--101c5267-btb6
# 古い一台目の削除
sample-http-server-migration-57794964f7-h6p7k   1/1     Terminating         0          11m     10.84.1.10   gke-cluster-standard-default-pool-ce8cf66f-fts9

# 二台目の移行
sample-http-server-migration-9cc7cff5-slw2d     0/1     Pending             0          0s      <none>       <none>
sample-http-server-migration-9cc7cff5-slw2d     0/1     ContainerCreating   0          0s      <none>       gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-migration-9cc7cff5-slw2d     1/1     Running             0          5s      10.84.2.4    gk3-cluster-standard-nap-e2-standard--101c5267-btb6
# 古い二台目の削除
sample-http-server-migration-57794964f7-lrjnt   1/1     Terminating         0          11m     10.84.1.11   gke-cluster-standard-default-pool-ce8cf66f-fts9

# 三台目の移行
sample-http-server-migration-9cc7cff5-f5ddv     0/1     Pending             0          0s      <none>       <none>
sample-http-server-migration-9cc7cff5-f5ddv     0/1     ContainerCreating   0          0s      <none>       gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-migration-9cc7cff5-f5ddv     1/1     Running             0          4s      10.84.2.5    gk3-cluster-standard-nap-e2-standard--101c5267-btb6
# 古い三台目の削除
sample-http-server-migration-57794964f7-44f4w   1/1     Terminating         0          11m     10.84.0.14   gke-cluster-standard-default-pool-ce8cf66f-klkb

移行完了後のワークロードの状態は以下の通りです。全てのワークロードがAutopilotノード上に配置されています。

NAME                                          READY   STATUS    RESTARTS   AGE     IP          NODE 
sample-http-server-migration-9cc7cff5-f5ddv   1/1     Running   0          4m23s   10.84.2.5   gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-migration-9cc7cff5-hg648   1/1     Running   0          7m30s   10.84.2.2   gk3-cluster-standard-nap-e2-standard--101c5267-btb6
sample-http-server-migration-9cc7cff5-slw2d   1/1     Running   0          4m28s   10.84.2.4   gk3-cluster-standard-nap-e2-standard--101c5267-btb6

さいごに

今回はStandardクラスタでAutopilotノードを利用する方法を紹介しました。
利用方法としては簡単ですが、利用条件は現時点でリリースチャンネルをrapidとして設定している必要があるため、すぐに本番環境に適用することは難しいかもしれません。今後regularやstableといったリリースチャンネルにも追加されることを待ちましょう。

昨今、GKEクラスタを複数台利用するマルチクラスタ構成も主流だと思いますが、クラスタ間の連携を実現しようとするとやや複雑な構成が必要になるので、今回のような1台のクラスタ内で一部のユースケースを完結できる機能は便利だと思います。
また、特にAutopilot使いたいけど、既にStandardクラスタ使ってしまっていて移行がしんどいというユーザーの方は多いのではないでしょうか。そのような方は今回紹介した機能が活用できるので移行を検討してみてはいかがでしょうか。

今回の記事は以上になります。ありがとうございました。

参考リンク

Discussion