Google Cloud におけるService Meshの勉強に躓いた件

# 初めに
業務においてService Meshの構築に関わることとなったが、Service Meshとかよくわからん、という状態なので、情報を集約・整理をしてみる。

## Service Mesh とは
サービスメッシュとは、マイクロサービスアーキテクチャなどのサービス間通信が複雑になるシステムにおいて、サービス間の通信を管理・監視することで、トラフィック制御や可観測性の向上などを可能にするアーキテクチャである。
各サービス間の通信をアプリ側で制御するのではなく、間にインフラ側の制御を挟むことで通信の管理・監視を可能にしており、この「サービス」間でインフラ制御を挟むことで「メッシュ」のように分けていることから、サービスメッシュとなっている。（と思っている。）

## Google Cloud が提供する（していた）Service Meshの種類
### 1.Anthos Service Mesh (In Cluster)
GKE クラスタ上で Istio のコントロールプレーンの構成要素である istiod が動作する構成となっている。ユーザー側でistiod のアップグレードやスケール設定、モニタリングなど運用/管理する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/7e8dabbb-68a4-f4e9-0d7d-ff4a7c3bb48c.png)

※写真引用元。参考サイト。
[Anthos Service Meshについて](https://cloud.google.com/service-mesh/docs/overview?hl=ja#control_plane)
[フルマネージドに進化した「Anthos Service Mesh」で運用を楽に！](https://medium.com/google-cloud-jp/%E3%83%95%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89%E3%81%AB%E9%80%B2%E5%8C%96%E3%81%97%E3%81%9F-anthos-service-mesh-%E3%81%A7%E9%81%8B%E7%94%A8%E3%82%92%E6%A5%BD%E3%81%AB-ac062c92dc3b)

### 2.Anthos Service Mesh (Managed Control Plane)
istiod を Google が管理することでマネージドサービスとして提供する構成となる。コントロールプレーンがマネージドのためユーザー側で istiod の運用/管理の必要がなり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/55fb38ee-d376-8257-5f6c-852a028d1fe6.png)

※写真引用元
[Anthos Service Meshについて](https://cloud.google.com/service-mesh/docs/overview?hl=ja#control_plane)

### 3.Traffic Director
コントロールプレーンがGoogleフルマネージドであり、GCPのグローバルなインフラを活用した広域なトラフィック管理サービスとなる。負荷分散やロードバランシング、マルチ環境サービスメッシュを得意としたService Mesh。
各サービスに対してサイドカープロキシを立ててエンドポイントとし、ControlPlaneで管理する点は他のサービスメッシュと似ているが、Istioには基づかないというのはテクノロジーベースでの違いとなる。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/03aa70fc-5ae4-b78a-3e91-50a1d0c636c4.png)

※写真引用元
[Traffic Director についての説明](https://cloud.google.com/blog/ja/topics/developers-practitioners/traffic-director-explained)

## 4.Cloud Service Mesh (Anthos Service Mesh + Traffic Director)
Anthos Servic MeshとコントロールプレーンとしてTrafficDirectorを合わせた、GoogleフルマネージドのService Mesh。CloudRunへのMesh導入なども可能になった。
これ以上は別なサイトでも公開している人が多くいるみたいなので割愛。

※参考
[Cloud Service Mesh](https://cloud.google.com/products/service-mesh#benefits)

## Istio
Service MeshのツールとしてはIstioがよく使われるらしい。
サービス間のトラフィックを管理し、アクセス ポリシーを適用してテレメトリー データ集計を行う。インフラ制御になるため、アプリソースの改修を必要としないものらしい。

また、Istio サービス メッシュは、論理的にデータ プレーンとコントロール プレーンに分割される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/66841ede-da77-490b-2370-65c867d734fe.png)


### データプレーン
サイドカーとしてデプロイされたIstio-Proxy（Envoy） で構成されている。このProxyが、マイクロサービス間のすべてのネットワーク通信を仲介および制御し、テレメトリを収集してレポートしている。
### コントロールプレーン
トラフィックをルーティングするためのプロキシを管理および構成を行っている。
サービスを検出してIstio-Proxyを構成したり、証明書周りの管理をしているのもコントロールプレーンとなる。

※写真引用元。参考。
[Istio 公式サイト](https://istio.io/latest/docs/ops/deployment/architecture/)

## envoy
サービス間の通信制御において、インフラ制御としてネットワークプロキシを提供することを目的に開発されたツール。サイドカーコンテナの形で、デプロイされることで、各サービス間の通信時にProxyとして機能するほか、インバウンド・アウトバウンド通信におけるEdgeとしても機能する。

※参考
[初心者でもわかる！Envoyとは？](https://tech-lab.sios.jp/archives/35682)

## Custom Resource Definity
Istioを調べる中でリソースに関する話題がいくつか出てきたので、整理する。
Istio 互換のカスタムリソースとしては、以下がある。（これ以外にもあるっぽい）
|リソース名|説明|
|:--------:|:--:|
|Virtual serivces|Istioトラフィックルーティング機能。PATHやヘッダーなどによるトラフィックの振り分けを行うことが可能。トラフィックの重み付けをすることで、A/Bテストやカナリーリリースの実現も可能。|
|Destination rules|Virtual services の後に評価され、追加のポリシー設定やトラフィックの流し方を決定する。ランダムな負荷分散やCircuit Breakerの設定も可能。ラウンドロビン方法もランダム、加重、最小リクエストの3種類に分けられる。|
|Gateways|インバウンド・アウトバウンドトラフィックを管理する。特定Hostへの通信における使用ポートやプロトコルの指定が可能で、TLS設定などレイヤ4-6の負荷分散構成もできる。L7を同じAPIリソースに追加する代わりに Istio Virtual services をゲートウェイにバインドする。|
|Sidecars|デフォルトでIstioは、サイドカー（Istio-proxy）を構成しているが、Sidecarsリソースを作成することでSidecarsコンテナの微調整が可能になる。デフォルトではメッシュ内のすべてのサイドカープロキシを、メッシュ内のすべてのワークロード インスタンスに到達するために必要な構成でプログラムし、ワークロードに関連付けられているすべてのポートでトラフィックを受け入れる。Sidecarリソースでは、ワークロードとの間でトラフィックを転送するときにプロキシが受け入れるポートとプロトコルのセットを微調整できます。|

※参考
[Anthos Service Meshを調べていく その1](https://qiita.com/editnuki/items/488bae7d397107db268f)
[【Istio⛵️】Istioによって抽象化されるEnvoyのHTTPSリクエスト処理の仕組み](https://hiroki-hasegawa.hatenablog.jp/entry/2024/01/16/013404)


## サイドカーコンテナ
いくつかのプロセスを実行する場合（ログやモニタリングのため）には、同じコンテナ内で複数のプロセスを実行する代わりに、別のコンテナを展開する。これをサイドカーコンテナと言う。
一つのPod内にメインコンテナではない別なコンテナを立ち上げている。

#### アプリケーションコンテナとの違い
> サイドカー コンテナは、同じポッド内のアプリ コンテナと並行して実行されます。ただし、主要なアプリケーション ロジックは実行せず、代わりにメイン アプリケーションにサポート機能を提供します。
サイドカー コンテナには独自の独立したライフサイクルがあります。アプリ コンテナとは独立して起動、停止、再起動できます。つまり、プライマリ アプリケーションに影響を与えることなく、サイドカー コンテナを更新、拡張、または保守できます。
サイドカー コンテナーは、プライマリ コンテナーと同じネットワークおよびストレージ名前空間を共有します。この共存により、サイドカー コンテナーとプライマリ コンテナーは密接にやり取りし、リソースを共有できます。

※参考。引用元。
[Sidecar Containers](https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/)



## fleet
フリートとは、GoogleCloudにおける複数クラスタを論理的に分ける概念のこと。
フリートを使用すると、クラスタを論理的にグループ化できるため、クラスタグループの管理がリッチになる。フリートとして分けられた各グループは様々な機能を享受することができる。

### 同一性
#### 1. 名前空間の同一性

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/440ec770-0ede-a87c-dd57-da5f284bfc97.png)

#### 2. サービスの同一性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/5f3fc4b3-7bdd-c91d-183b-f708e701b759.png)

#### 3. フリート外のリソースにアクセスするIDの同一性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/7020e99d-0508-06f3-233d-760aa9c396c1.png)

#### 4. フリート内IDの同一性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3395028/58927f37-0e41-dab9-8de3-186e74552f26.png)

[フリートの仕組み](https://cloud.google.com/kubernetes-engine/fleet-management/docs/fleet-concepts?hl=ja#fleet-host-project)

※参考。写真引用元。
[フリートの仕組み](https://cloud.google.com/kubernetes-engine/fleet-management/docs/fleet-concepts?hl=ja#:~:text=%E3%83%95%E3%83%AA%E3%83%BC%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AE,%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)