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


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

  • kuma-example-client, kuma-example-app

    kuma-example-clientkuma-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 のアプリケーションにプロキシされる設定が記載されています。

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 のポリシーを適用します。

$ 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 の設定のみを試しましたが、ほかに提供されている様々なポリシーもこの環境で試すことができます。