【第3回】Hello World ~ Dapr を Kubernetes で動かしてみる

“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第3回目の本記事では Kubernetes 環境で Distributed Application Runtime (Dapr) の Hello World サンプルアプリケーションを動かす方法を紹介します。

サンプルアプリの構成

本記事では Dapr コミュニティプロジェクトで提供されているサンプルアプリケーションを利用します。サンプルアプリケーションの構成は以下の図の通りです。

注目するポイントは以下の 2 つです。

  1. サービス同士およびサービスとステートストア間の通信が Dapr を通して行われている。
  2. Dapr がサイドカーコンテナとして起動している。

まず 1 点目のサービス同士およびサービスとステートストア間の通信が Dapr を通して行われている点については、前回の“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第 2 回で紹介した通りのため詳細は割愛しますが、各サービスでは複雑なサービス間呼び出しの実装やステートストア用の SDK や API を利用した実装は不要です。

次に 2 点目の、Dapr がサイドカーコンテナとして起動している点についてですが、このデザインパターンは Istio をはじめとするサービスメッシュ構成と同様です。ちなみに、Dapr と Istio が実現することの違いについては、Dapr FAQ ページより確認出来ます。簡単にそれらの違いを紹介すると Istio はネットワークレイヤーでの機能提供にフォーカスしていますが、一方 Dapr はビルディングブロックをはじめアプリケーションレイヤーでの機能提供にフォーカスしています。もちろん Istio などを利用したサービスメッシュ構成と Dapr を一緒に使うことも可能です。

本記事では、ステートストアとして Kubernetes 上にデプロイした Redis を利用しますが、クラウドサービスプロバイダーのマネージドサービスを利用する事も可能です。

動作確認環境

本記事の内容については、以下の環境にて動作確認を行いました。

  • macOS: 10.15.5
  • Docker Desktop: 2.3.0.3
  • Git: 2.26.2
  • kubectl: v1.10.3

必要なソフトウェアのインストール

“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第2回で既にインストール済みのソフトウェアについては追加インストール不要です。

Docker Desktop

公式サイトより適切なパッケージをインストールします。

kubectl

公式サイトを参考に実行環境の OS に合った方法で kubectl をインストールします。

Kubernetes クラスタ構築

Kubernetes クラスタを構築します。クラウドサービスプロバイダーが提供するマネージド Kubernetes サービスを利用しても構いませんが、本記事ではローカル PC の Docker Desktop 環境でKubernetes を有効にして利用します。Docker Desktop のシステム設定より数クリックで有効化出来ますが、詳細な方法については公式ドキュメントから確認出来ます。

Dapr セットアップ

Dapr の実行環境をセットアップします。

インストール

最新のバージョンの Dapr CLI をインストールします。以下は、macOS 環境でのインストールコマンドです。その他の OS 環境でのインストールコマンドについては、インストールドキュメントを確認します。

上記のコマンドを実行すると、dapr コマンドが /usr/local/bin 配下にインストールされます。インストールが完了したら、以下のコマンドを実行し正常にインストールされたことを確認します。

上記のコマンドを実行すると、以下のような結果が出力されます。
CLI version: 0.8.0
Runtime version: 0.7.1

初期化

以下のコマンドを実行し、Dapr の初期化を行ます。

この時、初期化が正常に完了すると、以下のようなメッセージが表示されます。

⌛ Making the jump to hyperspace…
ℹ️ Note: this installation is recommended for testing purposes. For production environments, please use Helm
✅ Deploying the Dapr control plane to your cluster…
✅ Success! Dapr has been installed. To verify, run ‘kubectl get pods -w’ or ‘dapr status -k’ in your terminal. To get started, go here: https://aka.ms/dapr-getting-started

サンプルアプリケーションの中身確認

まずは、サンプルアプリケーションをダウンロードし、アプリケーションの中身を確認します。

対象ディレクトリには様々なサンプルアプリケーションが含まれていますが、今回は samples/2.hello-kubernetes を利用します。

このディレクトリに含まれているアプリケーションは、”【第2回】Hello World ~ Dapr を Standalone で動かしてみる”で利用したものと同様です。

ステートストア用の Redis デプロイ

ステートストア用に Redis をデプロイします。Redis の環境には、クラウドサービスプロバイダーが提供するマネージドサービスを利用する事も出来ますが、本記事では Helm Chart を利用して Kubernetes 環境に自前の Redis 環境をデプロイします。

それでは早速、以下のコマンドを実行し、Kubernetes 環境に Redis をデプロイします。

以下のコマンドを実行し、Redis コンテナが実行されていることを確認します。

次に、deploy/redis.yaml ファイルの中の、YOUR_REDIS_HOST_HERE を今作成した Redis ホスト名 redis-master に置き換えます。

次に、デプロイした Redis 環境のパスワードを取得します。以下は、Linux / macOS 環境での実行コマンドですので、Windows 環境を利用の場合には、ドキュメントを確認し該当するコマンドを実行します。

deploy/redis.yaml ファイルの中の YOUR_REDIS_KEY_HERE を今取得した Redis パスワードと置き換えます。以下の値はサンプルですので、実際の環境で取得したパスワードに置き換える必要があります。

以下のコマンドを実行し、ステートストア用 Dapr コンポーネントの設定をします。

“component.dapr.io/statestore created” が表示されれば成功です。

Node.js サンプルアプリケーションのデプロイ

Node.js サンプルアプリケーションをデプロイします。このサンプルアプリケーションは、“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第 2 回で利用したサンプルアプリケーションと同様になります。GET / POST リクエストで受け取ったメッセージを元にステートストアへデータの読み書きを行います。node/app.js ファイルを確認してみると、Redis を利用するための複雑な SDK や API の実装はなく、HTTP GET / POST を利用したシンプルな実装が確認出来ます。

一方、サンプルアプリケーションを Kubernetes 環境にデプロイするための deploy/node.yaml ファイルを確認してみると Dapr を有効化するためのアノテーションが確認出来ます。

  • dapr.io/enabled: “true”: Dapr サイドカーの追加
  • dapr.io/id: “nodeapp”: Dapr で管理するアプリケーションの一意の ID
  • dapr.io/port: “3000”: サンプルアプリケーションの待ち受けポート

上記の設定により、Dapr コントロールプレーンのコンテナが自動的に対象 Pod への Dapr サイドカーコンテナの追加を行います。

それでは早速、以下のコマンドを実行し Node.js サンプルアプリケーションをデプロイします。

Node.js サンプルアプリケーションのデプロイが完了したら、以下のコマンドを実行し、アクセス用の IP アドレスを確認します。

Python サンプルアプリケーションのデプロイ

Node.js サンプルアプリケーションに HTTP POST リクエストを送信する Python サンプルアプリケーションをデプロイします。Nodes.js サンプルアプリケーションは、適切な HTTP POST リクエストを受け取るとそのデータをステートストア (ここでは Redis) に書き込みます。

以下のコマンドを実行し、Python サンプルアプリケーションの STATUS が Running 状態になっていることを確認します。

リクエストログの確認

Node.js および Python で実装されたそれぞれのサンプルアプリケーションのデプロイが完了しました。それでは、実際に Python サンプルアプリケーションから Node.js サンプルアプリケーションにリクエストが送信されていることを確認します。

以下のコマンドを実行し、Node.js サンプルアプリケーションのログを確認します。

正常にリクエストを受け付けられている場合には、以下のようなログが出力されるかと思います。

Got a new order! Order ID: 227
Successfully persisted state.
Got a new order! Order ID: 228
Successfully persisted state.
Got a new order! Order ID: 229
Successfully persisted state.
Got a new order! Order ID: 230
Successfully persisted state.
Got a new order! Order ID: 231
Successfully persisted state.

ステートストアの Redis にログが保存されていることを確認するため、以下のコマンドを実行します。

正常にデータがステートストアに格納されている場合には、{“orderId”:352} のような出力が確認出来ます。

環境削除

最後に、今回作成した Dapr 環境を削除します。以下のコマンドを実行すると、dapr init 実行時に作成されたコントロールプレーンの Pod やステート管理用の Redis Pod、サンプルアプリケーション用 Podが削除されます。

以下のコマンドを実行し、今回作成した Pod が削除されていることを確認します。

Dapr や Redis、Nodes.js / Python サンプルアプリケーション用の Pod が削除されていれば成功です。

まとめ

“これだけ分かれば大丈夫 Dapr 入門シリーズ” 第3回目の本記事では、Kubernetes 環境で Dapr の Hello World サンプルアプリを動かす方法を紹介しました。

Dapr を Kubernetes 環境で利用する場合には、アプリケーションが稼働する Pod のサイドカーコンテナーとして Dapr 用コンテナが自動で追加されることが分かりました。そのため、アプリケーション側では Dapr を利用するための複雑な実装は必要ありません。また、ビルディングブロックで利用するコンポーネントの設定についても YAML ファイルで簡潔に行えるため、アプリケーション開発者はプラットフォーム部分の実装に時間を割く必要がなくなります。

Dapr ビルディングブロックとコンポーネント

次回は Dapr の真髄であるビルディングブロック機能にフォーカスし、アプリケーションの実装を一切変更せずにコンポーネントを変更する様子をサンプルアプリケーションを利用しながら紹介します。

参考

投稿内容は私個人の意見であり、所属企業を代表するものではありません。

Share your ideas with millions of readers.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store