サービスメッシュ Kuma の サンプルを Docker Compose で動かす



日立グループ OSS Advent Calendar 2021 の 12 日目の記事です。

今回は OSS サービスメッシュである Kuma の Docker Compose サンプルを動作させ、Kuma の簡単な動作を説明していきます。

# Kuma のサンプル

Kuma の Docker Compose は [GitHub リポジトリ](https://github.com/kumahq/kuma)の [tools/e2e/examples/docker-compose](https://github.com/kumahq/kuma/tree/master/tools/e2e/examples/docker-compose) にあります。ファイル構成は下記のようになっています。

```
docker-compose
├── README.md
├── backend.yaml
├── certs 
    ├── ...
├── docker-compose.yaml
├── kuma-example-installer.sh
└── policies
    ├── everyone-to-everyone.traffic-permission.yaml
    ├── mtls.yaml
    ├── no-mtls.yaml
    └── web-to-backend.traffic-route.yaml
```

# 使用するイメージの設定

Docker Compose の起動前に、利用するイメージを設定します。公開されているサンプルでは、ローカルでビルドしたイメージを利用するように設定されています。下記の環境変数を設定することで、Docker Hub に登録されている Kuma のイメージを利用するように変更できます。

```sh
export KUMACTL_DOCKER_IMAGE=kumahq/kumactl:1.4.0
export KUMA_CP_DOCKER_IMAGE=kumahq/kuma-cp:1.4.0
export KUMA_DP_DOCKER_IMAGE=kumahq/kuma-dp:1.4.0
```

上記の環境変数を設定後に Docker Compose を起動すると、アプリケーションが立ち上がります。

# サンプルの構成

サンプルの構成は下記の通りです。

![kuma-example-arch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/7dde6bb9-32ac-21a4-a2ff-f37fb6337d0e.jpeg)

- `kuma-control-plane`

    Kuma の Control Plane が動作するコンテナです。ブラウザから`http://localhost:5681`で Web コンソールにアクセスできます。

- `kuma-example-web`, `kuma-example-backend-v1/v2`

    `kuma-example-web`は`kuma-example-backend-v1`, `kuma-example-backend-v2`の 2 つのアプリケーションへリクエストをプロキシします。`web`から`backend`への通信はロードバランスされているため、アクセスごとに`{"version":"v1"}`, `{"version":"v2"}`のどちらかが表示されます。

- `kuma-example-client`, `kuma-example-app`

    `kuma-example-client`は`kuma-example-app`へリクエストをプロキシします。

- `kumactl`
  
  Control Plane への設定変更を行うためのコンテナです。`policies`ディレクトリが`/kuma-example/policies`にマウントされています。
  
# Docker Compose での Sidecar Container

上記の構成図では表れていませんが、各アプリケーションは`kuma-example-xxx`,`kuma-example-xxx-namespace`,`kuma-example-xxx-sidecar`という 3 つのコンテナで構成されています。下の図は`kuma-example-app`の例です。

![docker-compose-sidecar.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/e6ebe119-3ed5-ed88-f86c-cdfc2f28e192.jpeg)

`docker-compose.yaml`の中身を見ると、`network_mode: service:kuma-example-xxx-namespace`という表記があり、これにより各コンテナが`kuma-example-xxx-namespace`コンテナとネットワークを共有するようになります。同一のネットワークになるため、アプリケーションとサイドカー間は localhost でアクセスできるようになっています。

# Web コンソールへのアクセス

ブラウザから[http://localhost:5681/gui/](http://localhost:5681/gui/)で Kuma の Web コンソールにアクセスできます。

![kuma-web-console.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/9ac8d0ab-5723-c13d-2028-1c1c2252d6ab.jpeg)

Kuma の Web コンソールは基本的に Readonly なので、設定などは`kumactl`コマンドで行います。

# Traffic Route の設定

最後に用意されているポリシーを適用して、プロキシの動作が変わることを確認します。まずは`kuma-example-web`から http://localhost:6060 へリクエストを実行します。

```sh
$ docker-compose exec kuma-example-web curl http://localhost:6060
{"version":"v2"} // または {"version":"v1"} 
```

`kuma-example-web`からバックエンドへのリクエストはロードバランスされているため、何度かリクエストを実行すると`{"version":"v2"}`または`{"version":"v1"}`と出力されることが確認できます。

ここに`policies/web-to-backend.traffic-route.yaml`ファイルを適用して、TrafficRoute を設定します。`web-to-backend.traffic-route.yaml`には下記のように、100 ％のリクエストが v2 のアプリケーションにプロキシされる設定が記載されています。

```yaml:web-to-backend.traffic-route.yaml
type: TrafficRoute
...
conf:
  split:
  - weight: 0
    destination:
      kuma.io/service: kuma-example-backend
      version: v1
  - weight: 100
    destination:
      kuma.io/service: kuma-example-backend
      version: v2
```

下記のコマンドを実行し、TrafficRoute のポリシーを適用します。

```console
$ docker-compose exec kumactl kumactl apply -f /kuma-example/policies/web-to-backend.traffic-route.yaml
```

ポリシー適用後にリクエストを何度か実行すると、`{"version":"v2"}`のみが出力されることが確認できます。

```sh
$ docker-compose exec kuma-example-web curl http://localhost:6060
{"version":"v2"}  
```

# まとめ

OSS のサービスメッシュである Kuma は Kubernetes 環境だけでなく、VM や Docker Compose の環境でもサービスメッシュを構築できます。また今回は TrafficRoute の設定のみを試しましたが、ほかに提供されている[様々なポリシー](https://kuma.io/policies/)もこの環境で試すことができます。