让我们来检查一下Dapr和Kubernetes的集群配置
首先
Dapr有两种模式,一种是在本地环境中运行的自托管模式,另一种是与Kubernetes集群一起运行的Kubernetes模式。要确认这个Kubernetes模式的运行情况,可以使用Dapr官方的Hello Kubernetes快速入门示例。
https://github.com/dapr/quickstarts/tree/master/tutorials/hello-kubernetes
在这篇文章中,我们打算通过运行这个快速入门的环境并确认部署的Pod和Service,来探究在Kubernetes集群中引入Dapr时的配置。
可以学习的事物 de
-
- Minikubeを使ったHello Kubernetesクイックスタートの動かし方
-
- KubernetesクラスタにDaprを導入するための設定方法の概要
- Daprを導入したときのKubernetesクラスタの構成
※之前发布过的有关Dapr的文章
-
- マイクロサービスを簡単に連携させるランタイム「Dapr」について
- Daprのクイックスタートでサービス呼出しのイメージを掴む
环境构建
本文使用 Dapr 的 Hello Kubernetes 快速入门,来了解 Dapr 在 Kubernetes 集群中的部署方式。本次将使用 minikube 作为 Kubernetes 环境。要在 minikube 上运行快速入门,需要按照以下步骤进行操作。
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
第二步
在步骤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では、次のようにデプロイメントにアノテーションが追加されています。
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
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/
全体成员构成
你好,Kubernetes集群由下面这张图所示的结构构建而成。接下来,我想通过使用命令来逐步确认图中的构成要素。
应用程序的容器
個々のアプリケーションに対応して生成されるポッドを確認します。大きく分けて、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的容器到Pod中。这个daprd容器作为应用程序的sidecar工作,并提供Dapr的功能。
实际上,在nodeapp Pod中可以看到包含与应用程序相对应的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
可以看到与每个服务相对应的Pod也同时运行着。
$ 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に関しては継続的に記事を書いていきたいと思っています。これまでに書いた記事を下に載せていますので、参考になれば嬉しいです。
-
- マイクロサービスを簡単に連携させるランタイム「Dapr」について
- Daprのクイックスタートでサービス呼出しのイメージを掴む
请参考以下链接。
-
- GitHub – Dapr quickstarts Hello Kubernetes
-
- https://github.com/dapr/quickstarts/tree/master/tutorials/hello-kubernetes
Dapr Docs – Overview of Dapr on Kubernetes
https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-overview/
Dapr Docs – Deploy Dapr on a Kubernetes cluster
https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-deploy/
Dapr Docs – Dapr sidecar (daprd) overview
https://docs.dapr.io/concepts/dapr-services/sidecar/
Dapr Docs – Dapr arguments and annotations for daprd, CLI, and Kubernetes
https://docs.dapr.io/reference/arguments-annotations-overview/
minikube start
https://minikube.sigs.k8s.io/docs/start/