mirror of https://github.com/dapr/samples.git
Knative Serving distributed calculator (#85)
* adding distributed calculator sample with Knative Serving * adding Knative section to the table in the root readme.md
This commit is contained in:
parent
b4b1553cad
commit
a985c90c6f
|
@ -28,6 +28,7 @@ If you are new to Dapr, you may want to review following resources first:
|
||||||
| [Distributed Calendar](./dapr-distributed-calendar) | Shows use of statestore, pubsub and output binding features of Dapr to roughly create a distributed version of a MVCS architecture application. |
|
| [Distributed Calendar](./dapr-distributed-calendar) | Shows use of statestore, pubsub and output binding features of Dapr to roughly create a distributed version of a MVCS architecture application. |
|
||||||
| [Hello Service Fabric](./hello-service-fabric) | Shows use of statestore, pubsub and service invocation in a Service Fabric environment running the Dapr sidecar as a guest executable. |
|
| [Hello Service Fabric](./hello-service-fabric) | Shows use of statestore, pubsub and service invocation in a Service Fabric environment running the Dapr sidecar as a guest executable. |
|
||||||
| [Pub-sub routing](./pub-sub-routing) | Demonstrates how to use Dapr to enable pub-sub applications with message routing. |
|
| [Pub-sub routing](./pub-sub-routing) | Demonstrates how to use Dapr to enable pub-sub applications with message routing. |
|
||||||
|
| [Distributed Calculator with Knative Serving](./knative-distributed-calculator) | Demonstrates how to use Dapr and Knative Serving using distributed calculator from quickstarts. |
|
||||||
|
|
||||||
## External samples
|
## External samples
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,197 @@
|
||||||
|
# Distributed calculator using Knative Serving
|
||||||
|
|
||||||
|
| Attribute | Details |
|
||||||
|
| ----------------------- | -------------------------- |
|
||||||
|
| Dapr runtime version | v1.5.0 |
|
||||||
|
| Knative Serving version | v1.0 |
|
||||||
|
| Language | Javascript, Python, Go, C# |
|
||||||
|
| Environment | Kubernetes |
|
||||||
|
|
||||||
|
This is a distrubuted calculator application from [Dapr quickstart](https://github.com/dapr/quickstarts/tree/master/distributed-calculator) using Knative Serving (with Kourier) to host React Calculator. This is build as proof-of-concept to show how to use Knative Serving with Dapr.
|
||||||
|
|
||||||
|
## Contents
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
This sample requires you to have the following installed on your machine:
|
||||||
|
|
||||||
|
- [Dapr CLI](https://github.com/dapr/cli/tree/release-1.5) v1.5.0
|
||||||
|
- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
|
||||||
|
- An online hoster Kubernetes cluster, such as [AKS](https://docs.dapr.io/operations/hosting/kubernetes/cluster/setup-aks/) or [GKE](https://cloud.google.com/kubernetes-engine/)
|
||||||
|
|
||||||
|
Also, unless you have already done so, clone the repository with the samples and `cd` into the right directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/dapr/samples.git
|
||||||
|
cd samples/read-kubernetes-events
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 1 - Make sure that your kubectl client is working
|
||||||
|
|
||||||
|
The first thing you need is an enabled Kubernetes cluster. This sample was tested on fully-fledged cluster.
|
||||||
|
|
||||||
|
Once you have that make sure you get a positive response from the following kubectl command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get pods
|
||||||
|
```
|
||||||
|
|
||||||
|
This should either have output as `No resources found in default namespace.` or should list the pods running the `default` namesapce.
|
||||||
|
|
||||||
|
## Step 2 - Setup Dapr
|
||||||
|
|
||||||
|
Follow [instructions](https://docs.dapr.io/getting-started/install-dapr/) to download and install the Dapr CLI and initialize Dapr.
|
||||||
|
|
||||||
|
## Step 3 - Setup Knative Serving
|
||||||
|
|
||||||
|
> **Note**: Here you can find full [instruction](https://knative.dev/docs/install/serving/install-serving-with-yaml/) of how to install and configure Knative Serving. All the information below in steps 3 and 4 is an excerpt from it which was used and tested.
|
||||||
|
|
||||||
|
### Install Knative Serving CRDs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.0.0/serving-crds.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install Knative Serving Core
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.0.0/serving-core.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install Knative Kourier - networking layer
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f https://github.com/knative/net-kourier/releases/download/knative-v1.0.0/kourier.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Knative to use Kourier
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl patch configmap/config-network \
|
||||||
|
--namespace knative-serving \
|
||||||
|
--type merge \
|
||||||
|
--patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verify installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get pods -n knative-serving
|
||||||
|
```
|
||||||
|
|
||||||
|
All pods inside `knative-serving` namespace should have `Running` or `Completed` status.
|
||||||
|
|
||||||
|
## Step 3 - Configure DNS for Knative
|
||||||
|
|
||||||
|
### Fetch the External IP address by running the command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl --namespace kourier-system get service kourier
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure DNS
|
||||||
|
|
||||||
|
This sample was tested with real DNS. In this case, you need to take External IP address from previous step and add to your DNS wildcard `A` record (e.g. `*.knative.example.com`).
|
||||||
|
|
||||||
|
### Direct Knative to use that domain
|
||||||
|
|
||||||
|
Please change `knative.example.com` below to your domain.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl patch configmap/config-domain \
|
||||||
|
--namespace knative-serving \
|
||||||
|
--type merge \
|
||||||
|
--patch '{"data":{"knative.example.com":""}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 4 - Setup Distributed Calculator
|
||||||
|
|
||||||
|
### Install Redis store
|
||||||
|
|
||||||
|
Follow [these instructions](https://docs.dapr.io/getting-started/configure-state-pubsub/) to create and configure a Redis store.
|
||||||
|
|
||||||
|
Here is a quick excerpt from it using Helm:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
helm repo update
|
||||||
|
helm install redis bitnami/redis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install Distributed Calculator
|
||||||
|
|
||||||
|
Navigate to the deploy directory in this quickstart directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
Deploy all of your resources:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl apply -f .
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**: This is the same Distributed Calculator from [quickstart](https://github.com/dapr/quickstarts/tree/release-1.5/distributed-calculator) except for the React deployment.
|
||||||
|
|
||||||
|
### Verification
|
||||||
|
|
||||||
|
Get URL for your React application:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get service.serving
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME URL LATESTCREATED LATESTREADY READY REASON
|
||||||
|
calculator-front-end http://calculator-front-end.default.knative.example.com calculator-front-end-rev1 calculator-front-end-rev1 True
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure that `READY` is set to `True`. Otherwise, please wait until all the necessary components are configured by Knative. The address in this case is `http://calculator-front-end.default.knative.example.com`.
|
||||||
|
|
||||||
|
Navigate to this address with your browser and you should see the distributed calculator. Do some calculations to make sure that all works as expected.
|
||||||
|
|
||||||
|
### Behind the scene
|
||||||
|
|
||||||
|
By default, Knative will scale to zero its workloads if there is no traffic to them. Wait for a couple minutes and run next command to list all pods in `default` namespace:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get pods
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME READY STATUS RESTARTS AGE
|
||||||
|
addapp-86cfcb8969-mvzs8 2/2 Running 0 2d23h
|
||||||
|
divideapp-6b94b477f5-58n92 2/2 Running 0 2d23h
|
||||||
|
multiplyapp-545c4bc54d-n6vrd 2/2 Running 0 2d23h
|
||||||
|
redis-master-0 1/1 Running 0 2d23h
|
||||||
|
redis-replicas-0 1/1 Running 0 2d23h
|
||||||
|
redis-replicas-1 1/1 Running 0 2d23h
|
||||||
|
redis-replicas-2 1/1 Running 0 2d23h
|
||||||
|
subtractapp-5c6c6bc4fc-wlbqv 2/2 Running 0 2d23h
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see there are no `calculator-front-end` pods.
|
||||||
|
|
||||||
|
Navigate back to the address with your browser to generate some traffic.
|
||||||
|
|
||||||
|
Return back to and list all pods once again:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME READY STATUS RESTARTS AGE
|
||||||
|
addapp-86cfcb8969-mvzs8 2/2 Running 0 2d23h
|
||||||
|
calculator-front-end-rev1-deployment-6fd89f78df-6ttr2 3/3 Running 0 6s
|
||||||
|
divideapp-6b94b477f5-58n92 2/2 Running 0 2d23h
|
||||||
|
multiplyapp-545c4bc54d-n6vrd 2/2 Running 0 2d23h
|
||||||
|
redis-master-0 1/1 Running 0 2d23h
|
||||||
|
redis-replicas-0 1/1 Running 0 2d23h
|
||||||
|
redis-replicas-1 1/1 Running 0 2d23h
|
||||||
|
redis-replicas-2 1/1 Running 0 2d23h
|
||||||
|
subtractapp-5c6c6bc4fc-wlbqv 2/2 Running 0 2d23h
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see there is `calculator-front-end-rev1-deployment-6fd89f78df-6ttr2` pod with 3 containers running inside: `calculator-front-end`, `queue-proxy` and `daprd`.
|
|
@ -0,0 +1,9 @@
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Configuration
|
||||||
|
metadata:
|
||||||
|
name: appconfig
|
||||||
|
spec:
|
||||||
|
tracing:
|
||||||
|
samplingRate: "1"
|
||||||
|
zipkin:
|
||||||
|
endpointAddress: "http://zipkin.default.svc.cluster.local:9411/api/v2/spans"
|
|
@ -0,0 +1,27 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: subtractapp
|
||||||
|
labels:
|
||||||
|
app: subtract
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: subtract
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: subtract
|
||||||
|
annotations:
|
||||||
|
dapr.io/enabled: "true"
|
||||||
|
dapr.io/app-id: "subtractapp"
|
||||||
|
dapr.io/app-port: "80"
|
||||||
|
dapr.io/config: "appconfig"
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: subtract
|
||||||
|
image: dapriosamples/distributed-calculator-csharp:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
imagePullPolicy: Always
|
|
@ -0,0 +1,27 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: addapp
|
||||||
|
labels:
|
||||||
|
app: add
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: add
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: add
|
||||||
|
annotations:
|
||||||
|
dapr.io/enabled: "true"
|
||||||
|
dapr.io/app-id: "addapp"
|
||||||
|
dapr.io/app-port: "6000"
|
||||||
|
dapr.io/config: "appconfig"
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: add
|
||||||
|
image: dapriosamples/distributed-calculator-go:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 6000
|
||||||
|
imagePullPolicy: Always
|
|
@ -0,0 +1,27 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: divideapp
|
||||||
|
labels:
|
||||||
|
app: divide
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: divide
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: divide
|
||||||
|
annotations:
|
||||||
|
dapr.io/enabled: "true"
|
||||||
|
dapr.io/app-id: "divideapp"
|
||||||
|
dapr.io/app-port: "4000"
|
||||||
|
dapr.io/config: "appconfig"
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: divide
|
||||||
|
image: dapriosamples/distributed-calculator-node:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 4000
|
||||||
|
imagePullPolicy: Always
|
|
@ -0,0 +1,27 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: multiplyapp
|
||||||
|
labels:
|
||||||
|
app: multiply
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: multiply
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: multiply
|
||||||
|
annotations:
|
||||||
|
dapr.io/enabled: "true"
|
||||||
|
dapr.io/app-id: "multiplyapp"
|
||||||
|
dapr.io/app-port: "5000"
|
||||||
|
dapr.io/config: "appconfig"
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: multiply
|
||||||
|
image: dapriosamples/distributed-calculator-python:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 5000
|
||||||
|
imagePullPolicy: Always
|
|
@ -0,0 +1,23 @@
|
||||||
|
apiVersion: serving.knative.dev/v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: calculator-front-end
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
# This is the name of our new "Revision," it must follow the convention {service-name}-{revision-name}
|
||||||
|
name: calculator-front-end-rev1
|
||||||
|
annotations:
|
||||||
|
dapr.io/enabled: "true"
|
||||||
|
dapr.io/app-id: calculator-front-end
|
||||||
|
dapr.io/app-port: "8080"
|
||||||
|
dapr.io/metrics-port: "19090"
|
||||||
|
dapr.io/config: "appconfig"
|
||||||
|
dapr.io/log-level: debug
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: dapriosamples/distributed-calculator-react-calculator:latest
|
||||||
|
name: calculator-front-end
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
|
@ -0,0 +1,21 @@
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: statestore
|
||||||
|
spec:
|
||||||
|
type: state.redis
|
||||||
|
version: v1
|
||||||
|
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
|
Loading…
Reference in New Issue