我尝试在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的样例并执行。

Architecture_Diagram.png

大致描述正在做的事情是,使用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等相容性也很好。而且,这种实现的开销也不大,所以暂时尝试一下应该也是不错的选择(虽然还不是正式发布)。

我想先看一下文档数据库、关系数据库和发布/订阅。

广告
将在 10 秒后关闭
bannerAds