はじめに
前回はAzure Kubernetes Service(AKS)を使ってKubernetesクラスター上でコンテナ化アプリケーションを実行する方法について説明しました。今回はマイクロサービスアーキテクチャのアプリケーション構築を支援する「Dapr」を使ってAKS上にアプリケーションを構築していく方法について説明していきます。
Azure Kubernates Serviceでマイクロサービスアプリケーションを動かそう
AKS上にマイクロサービスアーキテクチャのアプリケーションを構築する方法には様々なものがあります。今回はDaprというツールを使ったマイクロサービスの開発と運用方法について説明します。
マイクロサービスアーキテクチャとは
まずはマイクロサービスアーキテクチャについて説明します。マイクロサービスアーキテクチャとは複数の小規模なサービス(アプリケーション)を組み合わせて一つのアプリケーションを構築していくソフトウェアの開発手法です。これまでは一つの大きなアプリケーションを構築する手法(モノリシック(一枚岩)アーキテクチャ)が一般的でしたが、コンテナ技術の発展によりアプリケーションをサービス単位で分割して開発・実行することが容易になったことからマイクロサービスアーキテクチャが注目されるようになりました。
マイクロサービスアーキテクチャはサービス単位での開発が可能のため、各サービスは個別に言語やフレームワークを選択して開発を行い、個別にデプロイできます。
Kubernetesを使用する場合、各マイクロサービスはそれぞれが独立したコンテナーとしてクラスター上にデプロイされ、お互いに連携を取って一つのアプリケーションとしての機能を提供していきます。
Daprとは
Daprという名称は「Distributed Application Runtime(分散アプリケーションランタイム)」を略したものです。分散アプリケーションとはマイクロサービスを指しており、マイクロサービスアプリケーションの開発や実行を簡略化・サポートするAPI群を提供する実行基盤(ランタイム)という位置づけとなっています。Kubernetes上では各マイクロサービスアプリケーションはポッド単位で分割されますが、Daprは各マイクロサービス用のポッド内にデプロイされます。このようにアプリケーションのコンテナに隣接してデプロイされるコンテナは、サイドカーコンテナと呼ばれます。サイドカーコンテナは各マイクロサービスのポッドが連携する際の仲介役として機能します。
AKSでは、クラスター拡張機能と呼ばれる機能でKubernetesクラスター内にDaprを容易に追加することができるようになっています。
Daprを使ったマイクロサービスアプリケーションをAKS上に構築しよう
ここからは実際にDaprを使ったマイクロサービスアプリケーションをAKS上に構築していきます。今回はHTTPリクエストでJSON形式のメッセージを受け取り、それをRedisに保存するアプリケーションをDaprを使って開発していきます。
AKSにDaprを導入する
まずはAKSでDaprが利用できるようにするために、AKSのクラスター拡張機能を利用してDaprをKubernetesクラスターに追加していきます。なおAKSのクラスターを未作成の場合は、前回の内容を参考にクラスターの作成を行って下さい。
Azure CLIからAKSにDapr拡張機能を追加する
az k8s-extension create --cluster-type managedClusters \
--resource-group zerokara \
--cluster-name zerokara-dapr \
--name myDaprExtension \
--extension-type Microsoft.Dapr
「az k8s-extension create」コマンドでAKSに拡張機能を追加できます。「extension-type」オプションで「Microsoft.Dapr」を指定することでDaprが追加されます。「cluster-type」は「managedClusters」固定で、「resource-group」、「cluster-name」にはそれぞれAKSクラスターの所属するリソースグループ名とクラスター名を入力します。「name」には作成する拡張機能の名称を設定します。
コマンドを実行してしばらく待つと拡張機能の追加が完了し、Daprを利用できるようになります。
Redisの構築
次にアプリケーションのデータを保存するRedisを用意します。今回はAzureのマネージドサービスであるAzure Cache for Redisを使ってRedisインスタンスを作成します。AzureポータルからAzure Cache for Redisのサービスを選択し、「作成」ボタンからインスタンスを新規作成していきます。
サブスクリプションとリソースグループは任意のものを選択します。DNS名と場所には任意の名称と場所を入力します。キャッシュの種類でRedisキャッシュのスペックを決定します。今回は開発用途のため最小構成である「Basic C0」のプランを選択します。基本情報の入力が完了したら「レビューと作成」ボタンを選択し、「作成」ボタンを選択してRedisインスタンスの作成を開始します。しばらく待つとインスタンスの作成が完了します。
Redisインスタンスの作成が完了したら以下のコマンドをAzure CLIから実行します。
RedisインスタンスのアクセスキーをKubernatesシークレットとして保存する
$ az aks get-credentials --resource-group zerokara --name zerokara-dapr
$ kubectl create secret generic redis --from-literal=redis-password=<Redisのプライ マリアクセスキー>
まず「az aks get-credentials」コマンドでAzure CLIが接続するAKSのクラスターを指定し、Kubernatesのインスタンスを操作するためのkubectlコマンドが利用できるようにします。次に「kubectl create secret」コマンドでパスワードなどの機密情報を保持するKubernatesの「シークレット」という種類のリソースを作成していきます。先程作成したRedisインスタンスをAzureポータルで表示し、「アクセスキー」のメニューにある「プライマリ」に表示されているアクセスキーをコピーしてコマンドに入力して実行します。
シークレットが作成できたら、RedisインスタンスにアクセスするためのDaprコンポーネントである状態ストアをAKS上に作成していきます。状態ストアはKubernetesのマニュフェストファイルの形式で定義していきます。deployフォルダを作成して「redis.yaml」ファイルを記述します。
Redisインスタンスにアクセスするための状態ストアのマニュフェスト(deploy/redis.yaml)
apiVersion: dapr.io/v1alpha1 # DaprのAPIリソースを使用する・・・①
kind: Component
metadata:
name: redisstore
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: zerokara-dapr.redis.cache.windows.net:6380 # Azure Cache for Redisのホスト名を設定・・・②
- name: redisPassword
secretKeyRef: # Redisのパスワードを保持するシークレット名とキー名を設定・・・③
name: redis
key: redis-password
- name: enableTLS
value: true
auth:
secretStore: kubernetes
状態ストアはDaprが提供するComponentというリソースで実装されているため、先頭の「apiVersion」はDaprのAPIグループを指定します(①)。「metadata.name」はリソースを識別できる任意の名称を入力します。ここでは「redisstore」という名称にします。「spec.type」ではDaprのComponentの種類を指定します。Redisを使った状態ストアの場合は「state.redis」と指定します。「redisHost」というメタデータにはRedisのホスト名を指定します(②)。Azure Cache for Redisの場合、「
マニュフェストファイルを作成したら、AKSにマニュフェストを適用します。
Redis用状態ストアのマニュフェストをAKSに適用する
$ kubectl apply -f ./deploy/redis.yaml
「component.dapr.io/redisstore created」といったメッセージが表示されれば、状態ストアの作成は成功です。