0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dapr ✕ Kubernetesのクラスタ構成を確認してみる

Posted at

はじめに

Daprはローカル環境で動作するSelf-hostedモードの他に、Kubernetesクラスタと連携して動作するKubernetesモードがあります。このKubernetesモードの動作を確認するのに良いサンプルが、Dapr公式のHello Kubernetesクイックスタートになります。
https://github.com/dapr/quickstarts/tree/master/tutorials/hello-kubernetes

本記事では、このクイックスタートの環境を動かし、デプロイされるポッドやサービスを確認することにより、KubenetesクラスタにDaprを導入したときの構成を紐解いていきたいと思います。

学べること

  • Minikubeを使ったHello Kubernetesクイックスタートの動かし方
  • KubernetesクラスタにDaprを導入するための設定方法の概要
  • Daprを導入したときのKubernetesクラスタの構成

※これまでに投稿したDaprに関する記事

環境構築

DaprのHello Kubernetesクイックスタートを使って、DaprがKubernetesクラスタにどのように展開されるかを見ていきたいと思います。今回は、Kubernetes環境としてminikubeを使用します。minikubeでクイックスタートを動かすには、各Stepで以下の操作を行います。

Step1
下の公式サイトに書かれている方法で、minikubeをインストールします。
https://minikube.sigs.k8s.io/docs/start/
私の環境(Linux X86-64)では、下のコマンドでインストールできました。

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

また、kubectlを併せてインストールします。

https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

Step2
Step 2の1.でRedisストレージのセットアップを行いますが、ここではKubernetes向けRedisをセットアップします。下の図の赤枠で囲ったKubernetesタブに書かれた内容に従って、環境を構築します。

なお、セットアップを実行するには、Helmをインストールする必要があります。私はHelmプロジェクト( https://helm.sh/ja/docs/intro/install/ )からバイナリリリースをインストールしました。
実際には、下のコマンドでHelm(執筆当時の最新 v3.8.2)をインストールしました。

curl -LO https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz
tar -xvf helm-v3.8.2-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

Step7
minikubeを使用している場合、typeをloadbalancerに設定しても、EXTERNAL-IPがpendingと表示され、IPが割り当てられません。minikube tunnelを利用すると、IPが割り当てられるようになります。

minikube tunnel

KubernetesクラスタにDaprを導入する設定

KubernetesクラスタにDaprを導入するには、マニフェストにDaprのアノテーションを追加します。Hello Kubernetesでは、次のようにデプロイメントにアノテーションが追加されています。

deploy/node.yaml(抜粋)
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "nodeapp"
        dapr.io/app-port: "3000"
deploy/python.yaml(抜粋)
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "pythonapp"

これを見ると、Daprを組み込むためにenabledとapp-idのアノテーションを記述する必要があることが分かります。逆に言えば、これらを最低限記述すればKubernetesクラスタでDaprを動かすことができるので、ハードルとしては低いと感じます。
アノテーションは他にも種類があり、Daprが使用する通信プロトコルなどを指定できます。設定できる項目は、下のDaprのドキュメントを参照してください。
https://docs.dapr.io/reference/arguments-annotations-overview/

全体構成

Hello Kubernetesで構築されるKubenetesクラスタは、下の図のような構成になっています。これから、図の構成要素をコマンドを使いながら確認していきたいと思います。

image.png

アプリケーションのポッド

個々のアプリケーションに対応して生成されるポッドを確認します。大きく分けて、nodeappポッドとpythonappポッドとredisポッド群の3種類が動作していることが分かります。

$ kubectl get pods
NAME                         READY   STATUS    RESTARTS       AGE
nodeapp-59d545f986-8tvbd     2/2     Running   14 (89m ago)   5d
pythonapp-79b69b7494-cvsgw   2/2     Running   13 (89m ago)   5d
redis-master-0               1/1     Running   5 (92m ago)    5d4h
redis-replicas-0             1/1     Running   7 (92m ago)    5d4h
redis-replicas-1             1/1     Running   7 (92m ago)    5d4h
redis-replicas-2             1/1     Running   7 (92m ago)    5d4h

KubernetesのマニフェストにDaprのアノテーションを追加すると、daprdという名前のコンテナがポッドに追加されます。このdaprdコンテナが、アプリケーションのサイドカーとして働き、daprの機能を提供します。
実際にnodeappポッドには、アプリケーションに対応するnodeコンテナとdaprdコンテナが含まれていることが分かります。

$ kubectl get pod nodeapp-59d545f986-8tvbd -o jsonpath="{.spec.containers[*].name}"
node daprd

Daprサイドカーに対応するサービスはClusterIP=Noneとなっており、ヘッドレスサービスとして実行されています。

$ kubectl get svc
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
kubernetes       ClusterIP      10.96.0.1       <none>        443/TCP                               9d
nodeapp          LoadBalancer   10.111.176.78   <pending>     80:30684/TCP                          9d
nodeapp-dapr     ClusterIP      None            <none>        80/TCP,50001/TCP,50002/TCP,9090/TCP   9d
pythonapp-dapr   ClusterIP      None            <none>        80/TCP,50001/TCP,50002/TCP,9090/TCP   9d
redis-headless   ClusterIP      None            <none>        6379/TCP                              9d
redis-master     ClusterIP      10.98.43.62     <none>        6379/TCP                              9d
redis-replicas   ClusterIP      10.97.209.171   <none>        6379/TCP

daprdコンテナに対しては、下のようにIPが割り当てられています。

$ kubectl run -it busybox --restart=Never --rm --image=busybox sh
/ # nslookup nodeapp-dapr
Server:		10.96.0.10
Address:	10.96.0.10:53

Name:	nodeapp-dapr.default.svc.cluster.local
Address: 172.17.0.2

Daprのサービス

DaprをKubernetesに導入する設定をすると、Kubernetesクラスタに以下のサービスが追加されます。

  • Dapr Operator:Daprコンポーネントの更新を管理
  • Dapr Sidecar Injector:ポッドにDaprサイドカーを導入するサービス
  • Dapr Placement Server:DaprのActor機能を利用する時のマップを作成するサービス
  • Dapr Sentry:サービス間のmTLS通信を管理するサービス
  • Dapr Dashboard:Dapr Dashboardを提供するサービス

Hello Kubernetesの環境がデプロイされているとき、上記のサービスが動作(HEALTHY=True)していることが分かります。

$ dapr status -k
  NAME                   NAMESPACE    HEALTHY  STATUS   REPLICAS  VERSION  AGE  CREATED              
  dapr-sentry            dapr-system  True     Running  1         1.6.0    6d   2022-03-26 11:42.45  
  dapr-dashboard         dapr-system  True     Running  1         0.9.0    6d   2022-03-26 11:42.45  
  dapr-sidecar-injector  dapr-system  True     Running  1         1.6.0    6d   2022-03-26 11:42.45  
  dapr-placement-server  dapr-system  True     Running  1         1.6.0    6d   2022-03-26 11:42.47  
  dapr-operator          dapr-system  True     Running  1         1.6.0    6d   2022-03-26 11:42.45

これらのサービスは、Kubernetesクラスタのdapr-system名前空間においてデプロイメントまたはステートフルセットとして動作しています(Dapr Placement Serverのみステートフルセット)。

$ kubectl get deploy --namespace dapr-system
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
dapr-dashboard          1/1     1            1           8d
dapr-operator           1/1     1            1           8d
dapr-sentry             1/1     1            1           8d
dapr-sidecar-injector   1/1     1            1           8d
$ kubectl get sts --namespace dapr-system
NAME                    READY   AGE
dapr-placement-server   1/1     8d

それぞれのサービスに対応するポッドも、併せて動作していることが分かります。

$ kubectl get pods --namespace dapr-system
NAME                                     READY   STATUS    RESTARTS       AGE
dapr-dashboard-5b7dd7b657-w2stl          1/1     Running   7 (72m ago)    6d10h
dapr-operator-d78cf9fc7-7z44z            1/1     Running   13 (68m ago)   6d10h
dapr-placement-server-0                  1/1     Running   7 (72m ago)    6d10h
dapr-sentry-5874cb7d67-mhvcw             1/1     Running   11 (72m ago)   6d10h
dapr-sidecar-injector-6fb45cc48c-kxp8g   1/1     Running   11 (72m ago)   6d10h

おわりに

KubernetesクラスタにDaprを導入するときの設定と動作を、Hello Kubernetesのクイックスタートを題材に確認してきました。Kubernetesのマニフェストにアノテーションを追加すれば、Daprの機能が利用できるようになるので、導入のハードルとしては低いかなと思います。
Daprに関しては継続的に記事を書いていきたいと思っています。これまでに書いた記事を下に載せていますので、参考になれば嬉しいです。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?