You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ra...@apache.org on 2018/02/13 22:02:34 UTC
[incubator-openwhisk-deploy-kube] branch master updated: Add simple
loadtesting jobs (#158)
This is an automated email from the ASF dual-hosted git repository.
rabbah pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-deploy-kube.git
The following commit(s) were added to refs/heads/master by this push:
new 44d1646 Add simple loadtesting jobs (#158)
44d1646 is described below
commit 44d1646e955092dd32854cfa350e4695113da18e
Author: David Grove <dg...@users.noreply.github.com>
AuthorDate: Tue Feb 13 17:02:32 2018 -0500
Add simple loadtesting jobs (#158)
Add simple latency and throughput microbenchmaking
jobs based on incubator-openwhisk-performance.
Also add pod affinity/anti-affinity annotations to help
guide pods to specific kinds of nodes when deploying
on larger clusters with mixes of worker nodes.
---
kubernetes/apigateway/apigateway.yml | 10 ++++
kubernetes/cluster-setup/services.yml | 1 -
kubernetes/controller/controller.yml | 15 +++++-
kubernetes/couchdb/couchdb.yml | 10 ++++
kubernetes/kafka/kafka.yml | 10 ++++
kubernetes/loadtest/README.md | 24 ++++++++++
kubernetes/loadtest/loadtest-latency-internal.yml | 57 ++++++++++++++++++++++
kubernetes/loadtest/loadtest-latency.yml | 54 +++++++++++++++++++++
kubernetes/loadtest/loadtest-throughput.yml | 58 +++++++++++++++++++++++
kubernetes/nginx/nginx.yml | 10 ++++
kubernetes/zookeeper/zookeeper.yml | 10 ++++
11 files changed, 257 insertions(+), 2 deletions(-)
diff --git a/kubernetes/apigateway/apigateway.yml b/kubernetes/apigateway/apigateway.yml
index 119bfbb..70e9d33 100644
--- a/kubernetes/apigateway/apigateway.yml
+++ b/kubernetes/apigateway/apigateway.yml
@@ -26,6 +26,16 @@ spec:
operator: NotIn
values:
- invoker
+ # prefer to run on a control-plane node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - control-plane
# do not allow more than 1 apigateway instance to run on a node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
diff --git a/kubernetes/cluster-setup/services.yml b/kubernetes/cluster-setup/services.yml
index 0e02ff1..e88cfb7 100644
--- a/kubernetes/cluster-setup/services.yml
+++ b/kubernetes/cluster-setup/services.yml
@@ -57,7 +57,6 @@ metadata:
spec:
selector:
name: controller
- clusterIP: None
ports:
- port: 8080
targetPort: 8080
diff --git a/kubernetes/controller/controller.yml b/kubernetes/controller/controller.yml
index a7a19ce..1a4947e 100644
--- a/kubernetes/controller/controller.yml
+++ b/kubernetes/controller/controller.yml
@@ -27,6 +27,16 @@ spec:
operator: NotIn
values:
- invoker
+ # prefer to run on a control-plane node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - control-plane
# do not allow more than 1 controller instance to run on a node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
@@ -194,11 +204,14 @@ spec:
matchLabels:
name: controller
ingress:
- # Allow nginx to connect to controller
+ # Allow nginx and any pod with access=controller to connect to controller
- from:
- podSelector:
matchLabels:
name: nginx
+ - podSelector:
+ matchLabels:
+ access: controller
ports:
- port: 8080
# Controllers can connect to each other
diff --git a/kubernetes/couchdb/couchdb.yml b/kubernetes/couchdb/couchdb.yml
index a06aea7..5efc719 100644
--- a/kubernetes/couchdb/couchdb.yml
+++ b/kubernetes/couchdb/couchdb.yml
@@ -44,6 +44,16 @@ spec:
operator: NotIn
values:
- invoker
+ # prefer to run on a control-plane node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - control-plane
# do not allow more than 1 couchdb instance to run on a given node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
diff --git a/kubernetes/kafka/kafka.yml b/kubernetes/kafka/kafka.yml
index bc4ca09..3cdf980 100644
--- a/kubernetes/kafka/kafka.yml
+++ b/kubernetes/kafka/kafka.yml
@@ -26,6 +26,16 @@ spec:
operator: NotIn
values:
- invoker
+ # prefer to run on a control-plane node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - control-plane
# do not allow more than 1 kafka instance to run on a given node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
diff --git a/kubernetes/loadtest/README.md b/kubernetes/loadtest/README.md
new file mode 100644
index 0000000..5202621
--- /dev/null
+++ b/kubernetes/loadtest/README.md
@@ -0,0 +1,24 @@
+LoadTest
+-----
+
+A collection of jobs to do performance testing
+against openwhisk deployed on kube, based on
+the code in apache/incubator-openwhisk-performance.git.
+
+The jobs are intended to run in the openwhisk namespace in the same
+cluster as the system under test to eliminate external network
+latency.
+
+# Preparing
+
+The Jobs assume the noopLatency and noopThroughput actions are already
+created in the default namespace. These actions are simple noops
+(for example a JavaScript action whose body is `function main(){return {};}`).
+
+# Runnning
+
+To run one of the Jobs, edit the yml to adjust test parameters and then
+
+```
+kubectl apply -f loadtest-latency.yml
+```
diff --git a/kubernetes/loadtest/loadtest-latency-internal.yml b/kubernetes/loadtest/loadtest-latency-internal.yml
new file mode 100644
index 0000000..972eab5
--- /dev/null
+++ b/kubernetes/loadtest/loadtest-latency-internal.yml
@@ -0,0 +1,57 @@
+# This Job measures internal latency (no ingress, no TLS termination) by
+# hitting the controller service directly.
+
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: loadtest-latency-internal
+ namespace: openwhisk
+spec:
+ activeDeadlineSeconds: 3600
+ template:
+ metadata:
+ name: loadtest-latency-internal
+ labels:
+ access: controller
+ spec:
+ affinity:
+ # do not run on a node that openwhisk is actually using
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ - weight: 100
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: NotIn
+ values:
+ - invoker
+ - control-plane
+ - edge
+ # prefer to run on a loadtest node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - loadtest
+ containers:
+ - name: loadtest
+ image: markusthoemmes/loadtest
+ env:
+ # number of samples to gather
+ - name: "NUM_SAMPLES"
+ value: "10000"
+ # base64 encoding of default auth.guest credentials
+ - name: "ENCODED_AUTH"
+ value: "MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+ - name: "WHISK_API_HOST_NAME"
+ valueFrom:
+ configMapKeyRef:
+ name: whisk.ingress
+ key: api_host
+ command: ["loadtest"]
+ args: ["-n", "$(NUM_SAMPLES)", "-k", "-m", "POST", "-H", "Authorization: basic $(ENCODED_AUTH)", "http://$(CONTROLLER_SERVICE_HOST):$(CONTROLLER_SERVICE_PORT)/api/v1/namespaces/_/actions/noopLatency?blocking=true"]
+ restartPolicy: Never
diff --git a/kubernetes/loadtest/loadtest-latency.yml b/kubernetes/loadtest/loadtest-latency.yml
new file mode 100644
index 0000000..7a70adc
--- /dev/null
+++ b/kubernetes/loadtest/loadtest-latency.yml
@@ -0,0 +1,54 @@
+# This Job measures end-to-end latency by hitting the public ingress.
+
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: loadtest-latency
+ namespace: openwhisk
+spec:
+ activeDeadlineSeconds: 3600
+ template:
+ metadata:
+ name: loadtest-latency
+ spec:
+ affinity:
+ # do not run on a node that openwhisk is actually using
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ - weight: 100
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: NotIn
+ values:
+ - invoker
+ - control-plane
+ - edge
+ # prefer to run on a loadtest node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - loadtest
+ containers:
+ - name: loadtest
+ image: markusthoemmes/loadtest
+ env:
+ # number of samples to gather
+ - name: "NUM_SAMPLES"
+ value: "10000"
+ # base64 encoding of default auth.guest credentials
+ - name: "ENCODED_AUTH"
+ value: "MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+ - name: "WHISK_API_HOST_NAME"
+ valueFrom:
+ configMapKeyRef:
+ name: whisk.ingress
+ key: api_host
+ command: ["loadtest"]
+ args: ["-n", "$(NUM_SAMPLES)", "-k", "-m", "POST", "-H", "Authorization: basic $(ENCODED_AUTH)", "$(WHISK_API_HOST_NAME)/api/v1/namespaces/_/actions/noopLatency?blocking=true"]
+ restartPolicy: Never
diff --git a/kubernetes/loadtest/loadtest-throughput.yml b/kubernetes/loadtest/loadtest-throughput.yml
new file mode 100644
index 0000000..a136a2f
--- /dev/null
+++ b/kubernetes/loadtest/loadtest-throughput.yml
@@ -0,0 +1,58 @@
+# This Job measures throughput obtainable by hitting the public ingress.
+
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: loadtest-throughput-512x1024x300sec
+ namespace: openwhisk
+spec:
+ activeDeadlineSeconds: 3600
+ template:
+ metadata:
+ name: loadtest-throughput-512x1024x300sec
+ spec:
+ affinity:
+ # do not run on a node that openwhisk is actually using
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ - weight: 100
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: NotIn
+ values:
+ - invoker
+ - control-plane
+ - edge
+ # prefer to run on a loadtest node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - loadtest
+ containers:
+ - name: loadtest
+ image: williamyeh/wrk
+ env:
+ # number of samples to gather
+ - name: "DURATION"
+ value: "300"
+ - name: "CONCURRENCY"
+ value: "1024"
+ - name: "NUM_CORES"
+ value: "512"
+ # base64 encoding of default auth.guest credentials
+ - name: "ENCODED_AUTH"
+ value: "MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+ - name: "WHISK_API_HOST_NAME"
+ valueFrom:
+ configMapKeyRef:
+ name: whisk.ingress
+ key: api_host
+ command: ["/bin/sh"]
+ args: ["-c", "echo wrk.method = \\\"POST\\\" > post.lua; wrk --threads $(NUM_CORES) --connections $(CONCURRENCY) --duration $(DURATION) --header \"Authorization: basic $(ENCODED_AUTH)\" $(WHISK_API_HOST_NAME)/api/v1/namespaces/_/actions/noopThroughput?blocking=true --latency --timeout 10s --script post.lua"]
+ restartPolicy: Never
diff --git a/kubernetes/nginx/nginx.yml b/kubernetes/nginx/nginx.yml
index e69c77f..5b76834 100644
--- a/kubernetes/nginx/nginx.yml
+++ b/kubernetes/nginx/nginx.yml
@@ -26,6 +26,16 @@ spec:
operator: NotIn
values:
- invoker
+ # prefer to run on an edge node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - edge
# do not allow more than 1 nginx instance to run on a given node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
diff --git a/kubernetes/zookeeper/zookeeper.yml b/kubernetes/zookeeper/zookeeper.yml
index 15f1b74..41cdd1d 100644
--- a/kubernetes/zookeeper/zookeeper.yml
+++ b/kubernetes/zookeeper/zookeeper.yml
@@ -25,6 +25,16 @@ spec:
operator: NotIn
values:
- invoker
+ # prefer to run on a control-plane node
+ nodeAffinity:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ - weight: 50
+ preference:
+ matchExpressions:
+ - key: openwhisk-role
+ operator: In
+ values:
+ - control-plane
# do not allow more than 1 zookeeper instance to run on a given node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
--
To stop receiving notification emails like this one, please contact
rabbah@apache.org.