GKE概要まとめ

GKE(Google Kubernetes Engine)は「GCP版のKubernetes」と紹介されることが多いですが、そう聞くと別物の何かに見えてしまいます。実際のGKEは素のKubernetesそのもので、違いはKubernetesを動かすための面倒な作業をGCPがどこまで肩代わりしてくれるか、という点にあります。

この記事は、『KubernetesのService・Ingressの関係とPodへの通信経路』までで押さえたKubernetesの構成を前提に、GKEで何がマネージドになるのかを地図として整理します。個々の機能を詳しく詰め込むのではなく、GKE文脈で出てくる用語の位置づけを掴むのが狙いです。

この記事でわかること
  • GKEがKubernetesのどこをマネージドにするのか
  • StandardとAutopilot、Node Poolの位置づけ
  • HPA・VPA・Cluster Autoscalerの違い
  • GCP連携とロケーション設計の位置づけ

GKEはKubernetesのどこをマネージドにするのか

Kubernetesを自前で運用するには、『Kubernetesの概要・全体像まとめ』で見たControl Planeを自分で構築・維持し、Nodeとなるマシンも自分で用意し、バージョンアップやセキュリティパッチも自分で当て続ける必要があります。これはそれ自体が大きな運用負担です。

GKEは、このKubernetesの運用作業をGCPが肩代わりするマネージドサービスです。中身は素のKubernetesのままで、次のような部分が自動化されます。

  • Control Planeの構築・冗長化・バージョン管理
  • Nodeの用意やアップグレード
  • GCPの他サービス(ネットワーク・監視・認証)との連携

利用者はKubernetesのリソース(DeploymentやServiceなど)を宣言することに集中でき、その土台の面倒を見る部分をGKEに任せられます。

GKE StandardとAutopilotの違い

GKEには、Nodeをどこまで自分で管理するかで2つの運用モードがあります。

flowchart TB
  subgraph Standard["Standard cluster"]
    Deploy["Deployment"]
    CP["Control Plane"]
    subgraph UserArea["利用者が設定する場所"]
      subgraph Node["Node"]
        Pod["Pod"]
      end
    end
    Deploy -->|"宣言を渡す"| CP
    CP -->|"Podを配置・監視"| Pod
  end
flowchart TB
  subgraph Autopilot["Autopilot cluster"]
    Deploy["Deployment"]
    CP["Control Plane"]
    subgraph Managed["GKEが管理する場所"]
      subgraph Node["Node"]
        Pod["Pod"]
      end
    end
    Deploy -->|"宣言を渡す"| CP
    CP -->|"Podを配置・監視"| Pod
  end
  • Standard
    • Nodeを自分で管理するモード。Nodeの数・マシンタイプ・Node Poolの構成を自分で決める。細かく制御したい場合に向く
  • Autopilot
    • Nodeの管理をGKEに任せるモード。Podを動かすのに必要なリソースはGKEが自動で用意し、利用者はNodeを意識しない。運用をできるだけ任せたい場合に向く

どちらも中身はKubernetesで、動かすワークロード(DeploymentやPod)の書き方は基本的に同じです。違いは「Nodeという土台を自分で握るか、任せるか」です。まず任せて始めたいならAutopilot、Nodeレベルの制御が必要ならStandard、という選び方になります。

StandardではNode Poolでノードをまとめて管理する

Node Poolは、StandardでNodeをどう用意するかを決める設定単位です。Kubernetesの概要図で出てきたCluster・Control Plane・Node・Podの関係が変わるわけではなく、GKEでNodeをまとめて作成・更新・増減するための管理単位がNode Poolです。

前提として、Podはアプリケーションが実際に動く最小単位です。DeploymentやReplicaSetは、このPodを何個動かすかを維持します。

一方で、NodeはPodを動かすためのマシンです。NodeにはCPUやメモリの容量があるため、Podを増やしたくても、載せるNodeに空きがなければ動かせません。

ここで出てくるのがNode Poolです。Node Poolは、Nodeを用途や設定ごとにまとめて用意するための単位です。

Node Poolがない図として見ると、Clusterの中にNodeがそのまま並びます。

flowchart TB
  subgraph Cluster["Cluster"]
    CP["Control Plane"]
    subgraph Node1["Node"]
      Pod1["Pod"]
      Pod2["Pod"]
    end
    subgraph Node2["Node"]
      Pod3["Pod"]
      Pod4["Pod"]
    end
    CP -->|"配置・監視"| Node1
    CP -->|"配置・監視"| Node2
  end

Node Poolを加えると、Nodeそのものの位置づけは変わりません。Clusterの中にあるNodeを「通常処理用」「GPU処理用」のようなまとまりで扱えるようになります。

flowchart TB
  subgraph Cluster["GKE Cluster"]
    CP["Control Plane"]
    subgraph PoolA["Node Pool(通常処理用)"]
      subgraph NodeA1["Node"]
        PodA1["Pod"]
        PodA2["Pod"]
      end
      subgraph NodeA2["Node"]
        PodA3["Pod"]
        PodA4["Pod"]
      end
    end
    subgraph PoolB["Node Pool(GPU処理用)"]
      subgraph NodeB1["Node"]
        PodB1["Pod"]
        PodB2["Pod"]
      end
    end
    CP -->|"配置・監視"| NodeA1
    CP -->|"配置・監視"| NodeA2
    CP -->|"配置・監視"| NodeB1
  end

用途に応じて複数のNode Poolを持たせることもできます。たとえば、一般的な処理用のNode Poolと、GPUが必要な処理用のNode Poolを分ける、といった構成です。Podの数はDeploymentやReplicaSetが管理しますが、そのPodを載せるNodeの種類・台数・更新設定はNode Poolでまとめて管理します。

Node Poolを用意するメリットは、Nodeを1台ずつ個別に扱わず、用途ごとのまとまりで運用できることです。

  • 用途別にNodeを分けられる
    • 通常処理用、GPU処理用、メモリ多めの処理用のように、Podを載せる土台を分けられる
  • スケール範囲を分けられる
    • 通常処理用は2〜10台、GPU処理用は0〜2台のように、Node Poolごとに増減の範囲を変えられる
  • 更新や入れ替えの単位を分けられる
    • すべてのNodeを同じ扱いにせず、用途ごとのNode Pool単位で更新計画を考えられる

3種類のオートスケール

GKE(Kubernetes)のオートスケールは3種類あり、それぞれ増やす対象が違います。ここが混ざりやすいので、何を増やすのかで区別します。

flowchart LR
  subgraph Before["Before"]
    B1["Pod"]
    B2["Pod"]
  end
  subgraph After["After"]
    A1["Pod"]
    A2["Pod"]
    A3["Pod"]
    A4["Pod"]
  end
  Before -->|"HPA\nPod数を増やす"| After
flowchart LR
  subgraph Before["Before"]
    BPod["Pod\nCPU: 500m\nMemory: 512Mi"]
  end
  subgraph After["After"]
    APod["Pod\nCPU: 1\nMemory: 1Gi"]
  end
  Before -->|"VPA\nPod 1個あたりを大きくする"| After
flowchart LR
  subgraph Before["Before"]
    subgraph BNode1["Node"]
      BPod1["Pod"]
    end
    subgraph BNode2["Node"]
      BPod2["Pod"]
    end
  end
  subgraph After["After"]
    subgraph ANode1["Node"]
      APod1["Pod"]
    end
    subgraph ANode2["Node"]
      APod2["Pod"]
    end
    subgraph ANode3["Node"]
      APod3["Pod"]
    end
  end
  Before -->|"Cluster Autoscaler\nNodeを増やす"| After
仕組み増やす対象効くケース
HPA(Horizontal Pod Autoscaler)Podの数負荷が増えたので、同じPodを増やして捌きたい
VPA(Vertical Pod Autoscaler)Pod1個あたりのリソースPodに割り当てるCPU・メモリが足りない/余っている
Cluster AutoscalerNodeの数Podを増やしたいが、載せるNodeの空きが足りない

3つは競合するものではなく、層が違います。HPAがPodを増やそうとしても載せるNodeが足りなければ、Cluster AutoscalerがNodeを増やす、というように組み合わせて働きます。「Podを増やす(HPA)」「Podを太らせる(VPA)」「Nodeを増やす(Cluster Autoscaler)」と対象で覚えると混ざりません。

参考: GCP連携と可用性設計

ここからは、GKEそのものの基本構造から少し広げて、GCP上でGKEを使うときに出てくる連携機能とロケーション設計を整理します。GKEの中心はKubernetesのマネージド運用ですが、実運用では認証・監視・可用性もあわせて考える必要があります。

Workload IdentityでGoogle APIに認証する

Kubernetes上のアプリが、Cloud StorageやPub/SubといったGCPのサービスを呼ぶには、GCPに対する認証が必要です。素朴にやると、サービスアカウントの鍵ファイルをPodに配ることになりますが、鍵ファイルは漏洩リスクがあり、管理も面倒です。

Workload Identityは、この鍵ファイルの配布をなくす仕組みです。KubernetesのサービスアカウントとGCPのサービスアカウントを対応づけ、Podは鍵ファイルを持たずにGCPのAPIを呼べます。鍵の発行・配布・ローテーションといった運用が不要になり、漏洩リスクも下げられるのが利点です。

GCP全体での認証・権限管理の位置づけは『GCPセキュリティ設計の全体像: 入口・権限・秘密情報・鍵・データ境界で考える』で扱っています。

Cloud Logging/Monitoring連携

GKEは、GCPの監視サービスと標準で連携します。

  • Cloud Logging
    • Pod(コンテナ)の標準出力などのログが集約される
  • Cloud Monitoring
    • NodeやPodのCPU・メモリ使用量などのメトリクスが収集される

自前でログ収集や監視の基盤を組まなくても、クラスタの状態やアプリのログをGCP上で確認できます。前述のHPAが参照する負荷の指標も、この監視の仕組みとつながっています。

可用性を高めるロケーション設計

GKEのClusterは、Control PlaneやNodeをどのロケーションに配置するかで可用性が変わります。1つのゾーンに寄せるzonal clusterに対し、複数ゾーンにまたがるregional clusterにすると、ゾーン障害に強くなります。

flowchart LR
  subgraph Zonal["zonal cluster"]
    ZCP["Control Plane"]
    subgraph ZZones["zones"]
      direction TB
      subgraph ZoneA["zone-a"]
        ZA1["Node"]
        ZA2["Node"]
      end
      subgraph ZoneB["zone-b(Nodeなし)"]
        ZBBlank[" "]
      end
      subgraph ZoneC["zone-c(Nodeなし)"]
        ZCBlank[" "]
      end
    end
    ZCP --> ZA1
    ZCP --> ZA2
  end
  style ZBBlank fill:transparent,stroke:transparent,color:transparent
  style ZCBlank fill:transparent,stroke:transparent,color:transparent
flowchart LR
  subgraph Regional["regional cluster"]
    RCP["Regional Control Plane"]
    subgraph RZones["zones"]
      direction TB
      subgraph RZoneA["zone-a"]
        RA1["Node"]
      end
      subgraph RZoneB["zone-b"]
        RB1["Node"]
      end
      subgraph RZoneC["zone-c"]
        RC1["Node"]
      end
    end
    RCP --> RA1
    RCP --> RB1
    RCP --> RC1
  end

zonal clusterは構成が単純ですが、Nodeが1つのゾーンに寄ります。regional clusterは複数ゾーンにNodeを分散できるため、1つのゾーンに障害が起きても別ゾーンのNodeで処理を続けやすくなります。

このロケーションと可用性の考え方は、GKEに限らずGCPのCompute全体で共通するため、『Compute可用性設計: GCPのRegional MIG・GKE regional cluster・複数region backendで考える』で扱っています。

ここで扱っているregional clusterは、1つのGKE Clusterを複数ゾーンにまたがって配置する話です。複数regionにGKE Clusterを分ける構成とは別の論点です。regional clusterと複数regionのGKE Cluster構成の違いは『GKE Fleet・マルチクラスタGKE・MCSの関係まとめ』で扱っています。

まとめ

GKEは素のKubernetesをGCP上で運用しやすくするマネージドサービスです。要点は以下です。

  • GKEはControl Plane・Node・GCP連携の運用を肩代わりする。中身はKubernetesそのもの
  • StandardはNodeを自分で管理し、AutopilotはNode管理をGKEに任せる
  • StandardではNode Poolを使い、Nodeの種類・台数・更新設定をプール単位で管理する
  • オートスケールは、HPA(Pod数)・VPA(Podのリソース)・Cluster Autoscaler(Node数)の3種類で対象が違う
  • Workload IdentityやCloud Logging/Monitoringは、GCP上でGKEを使うときの連携機能として押さえる
  • zonal clusterとregional clusterでは、Nodeをどのゾーンに置くかによって可用性の考え方が変わる

参考

タグ: GCP, マイクロサービス, システム設計