GKE Fleet・マルチクラスタGKE・MCSの関係まとめ

GKEを単一クラスタで使うだけなら、まずはクラスタ、Node、Pod、Service、Ingressの関係を押さえれば全体像を追えます。一方で、複数のGKEクラスタを使う構成になると、クラスタ群をどうまとめるか、クラスタ間でServiceをどう見つけるか、通信制御をどうそろえるかといった論点が増えます。その文脈で、Fleet、マルチクラスタGKE、MCS(Multi-cluster Services)、Cloud Service Meshのような言葉が出てきます。

この記事では、『GKE概要まとめ』『KubernetesのService・Ingressの関係とPodへの通信経路』を前提に、複数GKEクラスタ構成で出てくるFleet、マルチクラスタGKE、MCSの関係を整理します。

この記事でわかること
  • FleetがMCSなどの対象範囲を決める理由
  • マルチクラスタGKEとGKE regional clusterの違い
  • MCSが通常のKubernetes Serviceをどう拡張するのか
  • MCSとCloud Service Meshの役割の違い

複数クラスタ構成におけるFleet・マルチクラスタGKE・MCSの立ち位置

最初に、3つの言葉を同じ種類の機能として並べないことが大切です。Fleetは管理単位、マルチクラスタGKEは構成、MCSは同じFleetに登録されたクラスタ群で使うGKE機能です。

用語何を指すか答える問い
FleetGKEクラスタをGoogle Cloud上でまとめる管理単位どのクラスタ群を同じ管理対象として扱うか
マルチクラスタGKE複数のGKEクラスタでワークロードを運用する構成なぜクラスタを複数に分けるか
MCS同じFleetに登録されたクラスタ間でKubernetes Serviceを使えるようにするGKE機能他クラスタのServiceをどう見つけるか

関係を図にすると次のようになります。全体像では、マルチクラスタGKE、Fleet、MCSを同じ箱として並べず、構成、管理単位、機能として分けて見ます。

flowchart TB
  subgraph Multi["マルチクラスタGKE(複数のGKEクラスタで運用する構成)"]
    subgraph Fleet["Fleet(クラスタ群をまとめる管理単位)"]
      ClusterA["GKEクラスタ A"]
      ClusterB["GKEクラスタ B"]
    end
  end

  MCS["MCS(GKE機能)"]
  MCS -. "同じFleetのクラスタ間で使う" .-> Fleet

図では、複数のGKEクラスタで運用する構成をマルチクラスタGKE、そのクラスタ群をまとめる管理単位をFleetとして分けています。MCSはFleetそのものではなく、同じFleetに登録されたクラスタ間でKubernetes Serviceを見つけられるようにするGKE機能です。

FleetはGKEクラスタをまとめる管理単位

Fleetは、Google Cloud上でGKEクラスタなどのKubernetesクラスタを論理的にまとめる管理単位です。複数クラスタ専用の機能ではなく、単一のGKEクラスタでもFleetに属することがあります。

ただし、Fleetの意味が大きくなるのは複数クラスタを扱うときです。クラスタを個別に管理すると、namespace、Service、認証、通信制御、ポリシーの扱いがクラスタごとに分かれます。Fleetは、これらのクラスタをGoogle Cloud上で同じ管理対象として扱うための土台になります。

複数クラスタの設定同期やポリシー管理まで含めた運用統制は『GKEのConfig Sync・Policy Controller・Config Connectorの使い分けまとめ』で扱っています。

一方で、クラスタを同じFleetに入れるだけで、他クラスタのServiceを自動的に呼び出せるようになるわけではありません。Fleetは対象範囲をそろえる土台であり、その範囲内でServiceを見つけられるようにするにはMCSのような機能を使います。

flowchart TB
  subgraph Single["単一クラスタでもFleetは使われる"]
    subgraph FleetA["Fleet"]
      One["GKEクラスタ"]
    end
  end

  subgraph Multi["複数クラスタでFleetの意味が大きくなる"]
    subgraph FleetB["Fleet"]
      A["GKEクラスタ A"]
      B["GKEクラスタ B"]
    end
  end

Fleetを理解するときに重要なのがsamenessです。samenessは、同じ名前のnamespace、Service、identityを、Fleetを対象範囲にする機能の中で同じものとして扱う考え方です。

たとえば、複数クラスタに同じnamespace名とService名がある場合、それらを同じServiceとして扱う機能があります。MCSやCloud Service Meshは、この考え方と相性がよい一方で、名前の衝突や管理責任の混在には注意が必要です。

flowchart TB
  subgraph Fleet["Fleet"]
    subgraph ClusterA["GKEクラスタ A"]
      NamespaceA["namespace: app"]
      ServiceA["Service: backend"]
      NamespaceA --> ServiceA
    end

    subgraph ClusterB["GKEクラスタ B"]
      NamespaceB["namespace: app"]
      ServiceB["Service: backend"]
      NamespaceB --> ServiceB
    end
  end

  ServiceA -. "同じnamespace名とService名" .- ServiceB

この図では、クラスタAとクラスタBに同じ namespace: appService: backend があります。backend は例としてのService名です。MCSやCloud Service Meshのような機能では、このような名前のそろい方を前提に、クラスタをまたいだServiceの発見や通信制御を扱います。

つまりFleetは、「クラスタを増やすための機能」ではなく、複数クラスタを同じ管理文脈に置くための単位です。

マルチクラスタGKEは複数のGKEクラスタで運用する構成

マルチクラスタGKEは、複数のGKEクラスタを使ってワークロードを運用する構成です。GKEとは別のサービス名というより、GKEを複数クラスタで使う設計パターンとして捉えると分かりやすくなります。

ここで大事なのは、クラスタが複数あるかどうかです。regionやzoneの数だけで判断するのではなく、GKEクラスタそのものが複数あるかを見ます。

まず、GKEクラスタ構成をクラスタ数で分けると次のようになります。

分類クラスタ数具体例主な目的
単一クラスタ1つGKE regional cluster1つのregion内のzone障害に備える
マルチクラスタGKE複数複数region GKEregion障害に備える

マルチクラスタGKEの代表例は、regionごとにGKEクラスタを作る複数region GKEです。たとえば、東京regionと大阪regionにそれぞれGKEクラスタを置く構成は、クラスタが複数あるためマルチクラスタGKEです。

一方で、GKE regional clusterは名前にregionalと付くため複数regionの構成に見えやすいですが、実際には1つのGKEクラスタを1つのregion内の複数zoneに分散する構成です。クラスタ数は1つなので、マルチクラスタGKEではありません。

Compute側の可用性設計は『Compute可用性設計: GCPのRegional MIG・GKE regional cluster・複数region backendで考える』で扱っています。

マルチクラスタGKEにする理由は、上記の可用性も含めて複数あります。

  • region障害に備えたい(可用性)
  • 本番、検証、開発の環境を分けたい(環境分離)
  • チームや事業領域ごとに運用責任を分けたい(運用分離)
  • セキュリティ境界や変更影響の範囲を分けたい(セキュリティ)
  • 既存クラスタから新しいクラスタへ段階的に移行したい(移行)

クラスタを複数にすると、アプリをどこに配置するかだけでなく、クラスタ間でServiceをどう見つけるか、クラスタ間通信をどう制御するか、複数クラスタをどう同じ管理単位で扱うかが問題になります。そこでFleet、MCS、Cloud Service Meshのような機能が関係します。

MCSはServiceをクラスタ間で発見する仕組み

MCSは、同じFleetに登録された複数GKEクラスタ間でKubernetes Serviceを発見し、呼び出せるようにするGKEの機能です。

MCSを使うには、対象のGKEクラスタが同じFleetに登録されている必要があります。FleetはMCSの対象範囲を決める単位です。ただし、FleetだけでServiceのクラスタ間呼び出しができるわけではありません。MCSが、そのFleet内のクラスタ間でServiceExportやServiceImportを構成します。

MCSの目的は、クラスタを分けたまま、他クラスタのKubernetes Serviceを安定した名前で呼び出せるようにすることです。たとえば、クラスタBのfrontend Podから、クラスタAのbackend Serviceを呼び出したい場面を考えます。

通常のKubernetes Serviceは、同じクラスタ内のPod群への安定した宛先です。これは、同じクラスタ内でfrontend Podがbackend Serviceを呼び出すようなアプリ間通信でも使われます。呼び出し元のPodは、相手PodのIPを直接知らなくてもService名でアクセスできます。ただし、通常のServiceの範囲は基本的に同じクラスタ内です。そのため、クラスタBのfrontend Podから見ると、クラスタAのbackend Serviceはそのままでは見つけられません。

MCSは、この「通常のServiceは同じクラスタ内で閉じる」という範囲を、同じFleetに登録されたクラスタ間へ広げます。

通常のServiceとMCSの関係は次の通りです。ServiceはKubernetesリソースそのものですが、MCSはServiceを複数クラスタから使えるようにするGKE機能です。

仕組み何を表すか何をするか
Kubernetes ServicePod群への安定した宛先を作るKubernetesリソース同じクラスタ内のPod群へ振り分ける
MCSServiceを複数クラスタから使えるようにするGKE機能ServiceExportやServiceImportを構成し、他クラスタからServiceを見つけられるようにする

MCSの正式名称であるMulti-cluster ServicesのServicesは、単一クラスタの説明で出てきたKubernetes Serviceを土台にしています。ただし、MCSはServiceそのものではありません。Serviceをクラスタ間で見つけられるようにする制御面の機能です。

この目的を実現するために、MCSではServiceExportServiceImportを使います。

  • ServiceExport
    • 他クラスタから呼び出せるようにしたいServiceと同じnamespace・名前で作るリソース
  • ServiceImport
    • MCSによって他クラスタ側に作られる、importされたServiceを表すリソース

たとえば、クラスタAのbackend ServiceをクラスタBから呼び出せるようにする場合は次のようになります。これは役割の例であり、クラスタAだけが特別な種類のクラスタという意味ではありません。

flowchart TB
  subgraph Fleet["同じFleet"]
    subgraph ClusterA["GKEクラスタ A"]
      Service["backend Service"]
      Export["ServiceExport"]
      Export -.-> Service
    end

    subgraph ClusterB["GKEクラスタ B"]
      Import["ServiceImport"]
      Dns["backend.app.svc.clusterset.local"]
    end

    MCS["MCS"]
    Export -.-> MCS
    MCS -.-> Import
    MCS -.-> Dns
  end

この図では、クラスタAでbackend Serviceに対応するServiceExportを作っています。MCSはそれをもとに、クラスタB側にServiceImportとDNS名を用意します。これにより、クラスタBのfrontend Podは、クラスタA側のbackend Serviceを安定した名前で見つけられるようになります。

ここで扱っているのは、外部ユーザーからのIngressアクセスではなく、クラスタB内のfrontend PodがクラスタA側のbackend Serviceを呼び出す通信です。アクセスの向きは次のようになります。

flowchart TB
  subgraph ClusterB["GKEクラスタ B"]
    Client["frontend Pod"]
    Dns["backend.app.svc.clusterset.local"]
  end

  subgraph ClusterA["GKEクラスタ A"]
    Pods["backend Pod群"]
  end

  Client --> Dns
  Dns --> Pods

MCS自体やServiceImportにリクエストがまず届くわけではありません。ServiceImportは、importされたServiceを表すリソースです。MCSは制御面の機能として、exportされたServiceごとにCloud DNSのゾーンやレコードを構成します。また、クラスタ間でPodが通信できるようにFirewall rulesを構成し、エンドポイントとヘルス状態の管理にTraffic Director control planeを使います。

MCSにはいくつか前提があります。たとえば、ServiceをexportできるのはGoogle Cloud上のVPC-native GKEクラスタです。VPC-native GKEクラスタとは、PodやServiceのIPアドレスをVPCネットワークと統合して扱うGKEのネットワーク方式です。また、クラスタ間の接続は同じVPCネットワーク、VPC Network Peering、Shared VPCなど、通信できるネットワーク構成に依存します。

MCSの中心は、他クラスタのKubernetes Serviceをどう見つけるかです。MCSは、アプリケーション間通信の暗号化、リトライ、タイムアウト、トラフィック分割まで一括で解決する仕組みではありません。

MCSとCloud Service Meshは役割が違う

MCSとCloud Service Meshは、どちらも複数クラスタ構成で出てくるため混ざりやすいですが、扱う問題が違います。

仕組み主な役割扱う問題
MCSServiceをクラスタ間で発見・呼び出し可能にする他クラスタのServiceをどう見つけるか
Cloud Service Meshアプリケーション間通信を制御する暗号化、リトライ、タイムアウト、トラフィック分割、可観測性をどうそろえるか

MCSは、Kubernetes Serviceの考え方をクラスタ間に広げる機能です。Cloud Service Meshは、Serviceへ届くかどうかだけでなく、アプリケーション間通信そのものを制御する層です。

複数クラスタをCloud Service Meshの対象にする構成は、Cloud Service Meshのドキュメントではmulti-cluster meshと呼ばれます。この話は『Service Meshで解決するマイクロサービス間通信の課題』で扱っています。

まとめ

  • Fleetは、GKEクラスタをGoogle Cloud上でまとめる管理単位
  • Fleetは複数クラスタ専用ではないが、MCSやCloud Service Meshなどの対象範囲を決める土台になる
  • マルチクラスタGKEは、複数のGKEクラスタでワークロードを運用する構成
  • GKE regional clusterは1つのクラスタなので、マルチクラスタGKEではない
  • 複数region GKEは、マルチクラスタGKEの代表例
  • MCSは、同じFleetに登録された複数GKEクラスタ間でServiceを発見・呼び出し可能にする仕組み
  • MCSはKubernetes Serviceをクラスタ間で見つける話で、Cloud Service Meshはアプリケーション間通信の制御の話

参考

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