我尝试在Minikube上使用Dapr进行测试(服务调用/状态管理)
首先
我对Dapr的运行情况感到好奇,所以我使用Minikube进行验证。
首先,我尝试了使用示例来进行服务间调用和状态存储,并查看了API文档。
此外,我也简单地查看了引入Dapr的开销。
准备好
准备Minikube环境
在Linux + Docker环境中设置以运行Minikube。
安装Docker
$ curl -fsSL https://get.docker.com | sh -
$ sudo usermod -aG docker <ユーザー名>
安装Minikube
$ 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 755 kubectl
$ sudo mv kubectl /usr/local/bin/.
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x
minikube
$ sudo install minikube /usr/local/bin/
$ sudo apt install conntrack
$ minikube start --driver=none
$ sudo chown -R <ユーザー:グループ> .kube/
$ sudo chown -R <ユーザー:グループ> .minikube/
引入Dapr
命令行界面引导
请按照官方文档的指引来安装CLI。
官方文档在这里。
在运行Minikube的服务器上执行以下命令。
$ curl -fsSL https://raw.githubusercontent.com/dapr/cli/master/install/install.sh | /bin/bash
在Minikube上安装Dapr。
在2020/05/03时点,指定最新的版本为0.6.0。
$ dapr init --kubernetes --runtime-version 0.6.0
如果安装顺利完成,则会在默认命名空间中创建一个Pod。
NAME READY STATUS RESTARTS AGE
dapr-sidecar-injector-7849f77c4b-vxfgq 1/1 Running 0 23m
dapr-operator-7d9668fd8b-nmrtm 1/1 Running 0 23m
dapr-sentry-756f7799fd-blgp6 1/1 Running 0 23m
dapr-placement-7dbcc6bf59-fvth4 1/1 Running 0 23m
运行样本
我将从Git上公开的示例中选择一个Kubernetes的样例并执行。
大致描述正在做的事情是,使用Python中的无限循环进行递增计数,并将该计数作为参数调用节点的应用程序,节点则不断将计数写入Redis。通过这样做,可以确认通过Dapr实现了Python与节点之间的API调用以及节点与Redis之间的数据注册。
样品的部署
Redis 简称”远程字典服务”,是一个开源的内存数据结构存储系统,常用于缓存、消息队列以及实时分析等应用领域。
由于样本本身不包含Redis的部署,因此需要事先使用Helm进行部署。
$ sudo snap install helm --classic
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
$ helm install redis stable/redis
当Redis的Pod启动后,请确认密码。
$ kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode
应用程序
$ git clone https://github.com/dapr/samples.git
$ cd samples/2.hello-kubernetes/deploy
将Redis配置嵌入
将主机名和密码嵌入。主机名为redis-master(可以通过kubectl get service确认),密码是刚刚确认的那个。
$ vi redis.yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
spec:
type: state.redis
metadata:
- name: redisHost
value: <ホスト名>:6379
- name: redisPassword
value: <パスワード>
部署
$ kubectl apply -f redis.yaml
$ kubectl apply -f node.yaml
$ kubectl apply -f python.yaml
当正确部署后,使用kubectl get po命令查看时,将会看到有两个节点和两个Python容器同时启动。
NAME READY STATUS RESTARTS AGE
dapr-operator-6b577ddf48-b878j 1/1 Running 0 13h
dapr-placement-6648767c45-6wfzb 1/1 Running 0 13h
dapr-sentry-6b674cb77b-llg9v 1/1 Running 0 13h
dapr-sidecar-injector-77bff6d75b-pp657 1/1 Running 0 13h
nodeapp-57cdcb5bdc-gxxmm 2/2 Running 0 12h
pythonapp-f777dd679-n87t8 2/2 Running 0 12h
redis-master-0 1/1 Running 0 12h
redis-slave-0 1/1 Running 0 12h
redis-slave-1 1/1 Running 0 12h
此外,查看节点日志可以确认neworder一直在被注册。
Got a new order! Order ID: 45793
Successfully persisted state.
Got a new order! Order ID: 45794
Successfully persisted state.
Got a new order! Order ID: 45795
Successfully persisted state.
Got a new order! Order ID: 45796
Successfully persisted state.
Got a new order! Order ID: 45797
Successfully persisted state.
API调用规范
在查看示例和API文档的同时,确认调用规范。
Python
Python is a programming language that is widely used.
这段代码只是通过无限循环调用http://localhost:3500/v1.0/invoke/nodeapp/method/neworder。
它会向Dapr sidecar发出请求,然后请求会传递到nodejs的/neworder路径上。
node.js – 基于JavaScript的开发平台
一旦收到neworder的请求,会向http://localhost:${daprPort}/v1.0/state/statestore发送类似于订单注册的请求。
这是针对Redis的注册过程。
服务调用规范
这是一个使用Dapr统一处理服务间调用的规范。
文件
HTTP请求的规范
daprPort是在自己的Pod YAML中记录的Dapr端口,appId是记录在调用目标的容器注释中的dapr.io/id,method-name是调用目标应用程序中实现的API路径。
POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/invoke/<appId>/method/<method-name>
状态管理规范
这是用Dapr 统一处理类似 Redis 这样的 state(状态)维护的规范。
文件
基本上,我们将部署以下组件(在本示例中是redis.yaml)。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <NAME>
namespace: <NAMESPACE>
spec:
type: state.<TYPE>
metadata:
- name:<KEY>
value:<VALUE>
- name: <KEY>
value: <VALUE>
用于访问的API
API的详细规范已记录在文档中,但重点在于storename与组件的metadata.name匹配的状态将被访问。
发帖
POST http://localhost:<daprPort>/v1.0/state/<storename>
获得
GET http://localhost:<daprPor>/v1.0/state/<storename>/<key>
删除
DELETE http://localhost:<daprPort>/v1.0/state/<storename>/<key>
支持的状态在下面的文件中有记录。似乎不仅支持KeyValue,还支持文档型数据库和关系型数据库。
Statestore文档
我想再次研究一下如何使用文档数据库和关系数据库。
内存使用
确认Sidecar注入的开销有多大。(如果没有Dapr,则在同一应用程序中使用注释将Dapr设置为false并进行确认)
当没有Dapr时。
NAME CPU(cores) MEMORY(bytes)
nodeapp-59cb95db9b-zjzdf 0m 15Mi
pythonapp-76f498d768-tbv6g 3m 13Mi
redis-master-0 6m 4Mi
redis-slave-0 5m 4Mi
redis-slave-1 6m 4Mi
当Dapr存在时。
NAME CPU(cores) MEMORY(bytes)
dapr-operator-6b577ddf48-b878j 1m 7Mi
dapr-placement-6648767c45-6wfzb 1m 5Mi
dapr-sentry-6b674cb77b-llg9v 1m 4Mi
dapr-sidecar-injector-77bff6d75b-pp657 1m 5Mi
nodeapp-57cdcb5bdc-6r489 5m 34Mi
pythonapp-f777dd679-n87t8 6m 26Mi
redis-master-0 8m 4Mi
redis-slave-0 7m 4Mi
redis-slave-1 5m 4Mi
结果将显示metrics-server的kubectl top po的内容。
Dapr本身总计为21Mi。
SideCar在节点上增加了19Mi,在Python上增加了13Mi。
如果仅是这个程度,似乎不需要过分强调开销问题。
迷上了的地方
我最初是从家里的On-Premise(代理服务器下)的K3s开始的。
-
- k3sだとうまく動かなかった(なぜかSidecarがインジェクションされない)
- Minikubeでもプロキシ配下だとうまく動かなかった(Sidecarはインジェクションされるが、ヘルスチェックでエラーになる)
在附近,最終我們在GCP上建立了一個服務器並在Minikube上進行了測試。我想要在有時間的時候從源代碼的角度去找出它無法運行的原因。
总结
我在使用示例基础上进行了操作,并且边操作边查看API文档,感觉使用起来并不难(通过查看文档,应该可以完成更加详细的设置)。本次确认的API调用和数据访问都可以通过本地的http调用完成,这种不依赖外部的实现很容易编写,而且与DDD等相容性也很好。而且,这种实现的开销也不大,所以暂时尝试一下应该也是不错的选择(虽然还不是正式发布)。
我想先看一下文档数据库、关系数据库和发布/订阅。