日立グループ OSS Advent Calendar 2021 の 12 日目の記事です。
今回は OSS サービスメッシュである Kuma の Docker Compose サンプルを動作させ、Kuma の簡単な動作を説明していきます。
Kuma のサンプル
Kuma の Docker Compose は GitHub リポジトリの 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 のイメージを利用するように変更できます。
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-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.yaml
の中身を見ると、network_mode: service:kuma-example-xxx-namespace
という表記があり、これにより各コンテナがkuma-example-xxx-namespace
コンテナとネットワークを共有するようになります。同一のネットワークになるため、アプリケーションとサイドカー間は localhost でアクセスできるようになっています。
Web コンソールへのアクセス
ブラウザからhttp://localhost:5681/gui/で Kuma の Web コンソールにアクセスできます。
Kuma の Web コンソールは基本的に Readonly なので、設定などはkumactl
コマンドで行います。
Traffic Route の設定
最後に用意されているポリシーを適用して、プロキシの動作が変わることを確認します。まずはkuma-example-web
から http://localhost:6060 へリクエストを実行します。
$ 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 のアプリケーションにプロキシされる設定が記載されています。
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 のポリシーを適用します。
$ docker-compose exec kumactl kumactl apply -f /kuma-example/policies/web-to-backend.traffic-route.yaml
ポリシー適用後にリクエストを何度か実行すると、{"version":"v2"}
のみが出力されることが確認できます。
$ docker-compose exec kuma-example-web curl http://localhost:6060
{"version":"v2"}
まとめ
OSS のサービスメッシュである Kuma は Kubernetes 環境だけでなく、VM や Docker Compose の環境でもサービスメッシュを構築できます。また今回は TrafficRoute の設定のみを試しましたが、ほかに提供されている様々なポリシーもこの環境で試すことができます。