穿裤衩的大鲨鱼 發表於 2021-1-3 15:17:00

[原创]Dapr入门教程之四:Dapr程序的部署(Kubernetes模式)

<p>上一篇我们在Standalone模式部署了第一个Dapr程序。这一次我们换成在Kubernetes模式下部署同样的程序。<br>
程序来自Dapr官方的quickstarts教程里的Hello Kubernetes,我们用目前的最新版本v1.0.0-rc.2。</p>
<pre><code>$ git clone -b v1.0.0-rc.2 https://github.com/dapr/quickstarts.git
$ cd quickstarts/hello-kubernetes
</code></pre>
<p>里面包括一个Python的程序,每秒发1个HTTP Request给Node程序。一个Node程序,用来在StateStore里保存发过来的OrderId。<br>
<img src="https://img2020.cnblogs.com/blog/194239/202012/194239-20201228232151262-1138268785.png"></p>
<p>下面开始部署。Kubernetes模式的Dapr Runtime的安装,请参看本系列的第二章Dapr的安装。<br>
首先要先部署Redis。跟Standalone模式不同,Kubernetes模式的Dapr Runtime安装的时候不会自动安装Redis,需要手动安装。</p>
<pre><code>$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo update
$ helm install redis bitnami/redis

NAME: redis
LAST DEPLOYED: Sun Jan3 12:42:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
Redis can be accessed via port 6379 on the following DNS names from within your cluster:

redis-master.default.svc.cluster.local for read/write operations
redis-slave.default.svc.cluster.local for read-only operations


To get your password run:

    export REDIS_PASSWORD=$(kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode)

To connect to your Redis server:

1. Run a Redis pod that you can use as a client:
   kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \
    --env REDIS_PASSWORD=$REDIS_PASSWORD \
   --image docker.io/bitnami/redis:6.0.9-debian-10-r38 -- bash

2. Connect using the Redis CLI:
   redis-cli -h redis-master -a $REDIS_PASSWORD
   redis-cli -h redis-slave -a $REDIS_PASSWORD

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/redis-master 6379:6379 &amp;
    redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD
</code></pre>
<p>安装完成。看一下Pod里多了什么:</p>
<pre><code>$ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
redis-master-0   1/1   Running   0          2m5s
redis-slave-0    1/1   Running   0          2m5s
redis-slave-1    1/1   Running   0          1m7s
</code></pre>
<p>接下来部署Statestore。</p>
<pre><code>$ cd quickstarts/hello-kubernetes/deploy
$ kubectl apply -f redis.yaml
component.dapr.io/statestore created
</code></pre>
<p>redis.yaml的内容如下:</p>
<pre><code>apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
spec:
type: state.redis
metadata:
# These settings will work out of the box if you use `helm install
# bitnami/redis`.If you have your own setup, replace
# `redis-master:6379` with your own Redis master address, and the
# Redis password with your own Secret's name. For more information,
# see https://docs.dapr.io/operations/components/component-secrets .
- name: redisHost
    value: redis-master:6379
- name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
auth:
secretStore: kubernetes
</code></pre>
<p>意思是部署一个名字叫statestore的Component,类型为state.redis。<br>
用dapr cli看一下components:</p>
<pre><code>$ dapr components -k
NAME      TYPE         VERSIONSCOPESCREATED            AGE
statestorestate.redis                   2021-01-03 12:50.4158s
</code></pre>
<p>接下来部署Node的APP。</p>
<pre><code>$ kubectl apply -f node.yaml
service/nodeapp created
deployment.apps/nodeapp created
</code></pre>
<p>其中node.yaml的内容如下:</p>
<pre><code>kind: Service
apiVersion: v1
metadata:
name: nodeapp
labels:
    app: node
spec:
selector:
    app: node
ports:
- protocol: TCP
    port: 80
    targetPort: 3000
type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
labels:
    app: node
spec:
replicas: 1
selector:
    matchLabels:
      app: node
template:
    metadata:
      labels:
      app: node
      annotations:
      dapr.io/enabled: "true"
      dapr.io/app-id: "nodeapp"
      dapr.io/app-port: "3000"
    spec:
      containers:
      - name: node
      image: dapriosamples/hello-k8s-node:latest
      ports:
      - containerPort: 3000
      imagePullPolicy: Always
</code></pre>
<p>看一下service:</p>
<pre><code>$ kubectl get svc
NAME             TYPE         CLUSTER-IP       EXTERNAL-IP   PORT(S)                               AGE
kubernetes       ClusterIP      10.96.0.1      &lt;none&gt;      443/TCP                               83m
nodeapp          LoadBalancer   10.96.83.185   &lt;pending&gt;   80:31324/TCP                        49m
nodeapp-dapr   ClusterIP      None             &lt;none&gt;      80/TCP,50001/TCP,50002/TCP,9090/TCP   49m
redis-headless   ClusterIP      None             &lt;none&gt;      6379/TCP                              60m
redis-master   ClusterIP      10.109.27.202    &lt;none&gt;      6379/TCP                              60m
redis-slave      ClusterIP      10.103.201.158   &lt;none&gt;      6379/TCP                              60m
</code></pre>
<p>启动了一个叫nodeapp的service和一个叫nodeapp-dapr(就是sidecar)的service。<br>
因为是运行在minikube上,所以nodeapp的service没有EXTERNAL IP(显示为pending)。<br>
看一下pod:</p>
<pre><code>$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nodeapp-5d5dc88584-kqr2v   2/2   Running   0          13m
redis-master-0             1/1   Running   0          142m
redis-slave-0            1/1   Running   0          142m
redis-slave-1            1/1   Running   0          141m
</code></pre>
<p>看一下nodeapp的log:</p>
<pre><code>$ kubectl logs nodeapp-5d5dc88584-kqr2v -c node
Node App listening on port 3000!
DAPR_HTTP_PORT: 3500
DAPR_GRPC_PORT: 50001
</code></pre>
<p>下面部署python的APP:</p>
<pre><code>$ kubectl apply -f python.yaml
deployment.apps/pythonapp created
</code></pre>
<p>python.yaml的内容如下:</p>
<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
name: pythonapp
labels:
    app: python
spec:
replicas: 1
selector:
    matchLabels:
      app: python
template:
    metadata:
      labels:
      app: python
      annotations:
      dapr.io/enabled: "true"
      dapr.io/app-id: "pythonapp"
    spec:
      containers:
      - name: python
      image: dapriosamples/hello-k8s-python:latest
</code></pre>
<p>看一下pod里多了什么:</p>
<pre><code>$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nodeapp-5d5dc88584-kqr2v   2/2   Running   0          16m
pythonapp-fcb4f49b-n6ltf   2/2   Running   0          49s
redis-master-0             1/1   Running   0          145m
redis-slave-0            1/1   Running   0          145m
redis-slave-1            1/1   Running   0          144m
</code></pre>
<p>看一下nodeapp的log:</p>
<pre><code>$ kubectl logs nodeapp-5d5dc88584-kqr2v -c node
Node App listening on port 3000!
DAPR_HTTP_PORT: 3500
DAPR_GRPC_PORT: 50001
Got a new order! Order ID: 5
Successfully persisted state.
Got a new order! Order ID: 6
Successfully persisted state.
Got a new order! Order ID: 7
Successfully persisted state.
Got a new order! Order ID: 8
Successfully persisted state.
</code></pre>
<p>用kubernetes的端口映射查看最新的orderid:</p>
<pre><code>$ kubectl port-forward nodeapp-5d5dc88584-kqr2v 8080:3000
</code></pre>
<p>把pod里的nodeapp的http端口3000映射到localhost的8080。另开一个窗口,执行:</p>
<pre><code>$ curl http://localhost:8080/order
</code></pre>
<p>或者</p>
<pre><code>$ kubectl port-forward nodeapp-5d5dc88584-kqr2v 8080:3500
</code></pre>
<p>把pod里的dapr sidecar的http端口3500映射到localhost的8080。另开一个窗口,执行:</p>
<pre><code>$ curl http://127.0.0.1:8080/v1.0/invoke/nodeapp/method/order/
</code></pre>
<p>如果想在redis里查看最新的orderid,执行下面的命令:</p>
<pre><code>$ export REDIS_PASSWORD=$(kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode)
$ kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \
   --env REDIS_PASSWORD=$REDIS_PASSWORD \
    --image docker.io/bitnami/redis:6.0.9-debian-10-r38 -- bash
If you don't see a command prompt, try pressing enter.
I have no name!@redis-client:/$ redis-cli -h redis-master -a $REDIS_PASSWORD
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-master:6379&gt; hgetall nodeapp||order
</code></pre><br><br>
来源:https://www.cnblogs.com/thrillcattle/p/14204424.html
頁: [1]
查看完整版本: [原创]Dapr入门教程之四:Dapr程序的部署(Kubernetes模式)