Merge "Kube-proxy performance test plan and report"
This commit is contained in:
commit
a91c847c63
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ name }}
|
||||||
|
namespace: minions
|
||||||
|
labels:
|
||||||
|
k8s-app: minion
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
k8s-app: minion
|
||||||
|
ports:
|
||||||
|
- name: {{ name }}
|
||||||
|
port: 80
|
||||||
|
protocol: TCP
|
@ -0,0 +1,58 @@
|
|||||||
|
import os
|
||||||
|
import random
|
||||||
|
import shlex
|
||||||
|
import string
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
import jinja2
|
||||||
|
|
||||||
|
SERVICES = 100 # amount of services, > len(NODES)
|
||||||
|
REPLICAS = 1
|
||||||
|
NODES = ['node2', 'node3', 'node4', 'node5', 'node6']
|
||||||
|
|
||||||
|
|
||||||
|
def render(tpl_path, context):
|
||||||
|
path, filename = os.path.split(tpl_path)
|
||||||
|
return jinja2.Environment(
|
||||||
|
loader=jinja2.FileSystemLoader(path or './')
|
||||||
|
).get_template(filename).render(context)
|
||||||
|
|
||||||
|
|
||||||
|
def id_generator(size=8, chars=string.ascii_lowercase + string.digits):
|
||||||
|
return ''.join(random.choice(chars) for _ in range(size))
|
||||||
|
|
||||||
|
|
||||||
|
def create_svc(node='node1'):
|
||||||
|
service_name = "minion-{}".format(id_generator())
|
||||||
|
file_name = "{}.yaml".format(service_name)
|
||||||
|
|
||||||
|
# Create YAML file for new service
|
||||||
|
template = render("service.yaml", {"name": service_name})
|
||||||
|
f = open(file_name, "w")
|
||||||
|
f.write(template)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
cmd = "kubectl -n minions create -f {}".format(file_name)
|
||||||
|
args = shlex.split(cmd)
|
||||||
|
|
||||||
|
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
|
||||||
|
(out, err) = proc.communicate()
|
||||||
|
|
||||||
|
# Delete YAML file
|
||||||
|
os.remove(file_name)
|
||||||
|
|
||||||
|
if not err:
|
||||||
|
return True
|
||||||
|
|
||||||
|
print err
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
service_per_node = int(SERVICES / len(NODES))
|
||||||
|
for node in NODES:
|
||||||
|
for i in range(0, service_per_node):
|
||||||
|
success = create_svc(node=node)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
25
doc/source/test_plans/kubernetes_proxy/code/locustfile.py
Normal file
25
doc/source/test_plans/kubernetes_proxy/code/locustfile.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from locust import HttpLocust, TaskSet
|
||||||
|
|
||||||
|
|
||||||
|
urls = []
|
||||||
|
f = open('/root/ayasakov/hosts.txt', 'r')
|
||||||
|
for line in f:
|
||||||
|
if 'http' in line:
|
||||||
|
urls.append('{}'.format(line[:-1]))
|
||||||
|
|
||||||
|
print urls
|
||||||
|
|
||||||
|
|
||||||
|
def getting_page(l):
|
||||||
|
for url in urls:
|
||||||
|
l.client.get(url, name=url)
|
||||||
|
|
||||||
|
|
||||||
|
class UserBehavior(TaskSet):
|
||||||
|
tasks = {getting_page: 1}
|
||||||
|
|
||||||
|
|
||||||
|
class WebsiteUser(HttpLocust):
|
||||||
|
task_set = UserBehavior
|
||||||
|
min_wait = 5000
|
||||||
|
max_wait = 9000
|
20
doc/source/test_plans/kubernetes_proxy/code/minion.yaml
Normal file
20
doc/source/test_plans/kubernetes_proxy/code/minion.yaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ReplicationController
|
||||||
|
metadata:
|
||||||
|
name: minion
|
||||||
|
namespace: minions
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
k8s-app: minion
|
||||||
|
ersion: v0
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: minion
|
||||||
|
ersion: v0
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: minion
|
||||||
|
image: 172.20.9.32:5000/qa/minion:latest
|
@ -0,0 +1,2 @@
|
|||||||
|
FROM nginx:latest
|
||||||
|
COPY static /usr/share/nginx/html
|
1308
doc/source/test_plans/kubernetes_proxy/code/minion/static/index.html
Normal file
1308
doc/source/test_plans/kubernetes_proxy/code/minion/static/index.html
Normal file
File diff suppressed because it is too large
Load Diff
101
doc/source/test_plans/kubernetes_proxy/plan.rst
Normal file
101
doc/source/test_plans/kubernetes_proxy/plan.rst
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
.. _Kubernetes_proxy_performance_test_plan:
|
||||||
|
|
||||||
|
**************************************
|
||||||
|
Kubernetes proxy performance test plan
|
||||||
|
**************************************
|
||||||
|
|
||||||
|
:status: **ready**
|
||||||
|
:version: 1.0
|
||||||
|
|
||||||
|
:Abstract:
|
||||||
|
|
||||||
|
This test plan covers scenarios for Kubernetes proxy performance testing.
|
||||||
|
|
||||||
|
Test Plan
|
||||||
|
=========
|
||||||
|
|
||||||
|
Kube-proxy(starting with k8s version 1.4) by default works in 'iptables' mode
|
||||||
|
and does not proxy the traffic. Old 'userspace' mode is left for backward
|
||||||
|
compatibility only. There is opinion, that even most recent version of
|
||||||
|
kube-proxy is not as effective, as it can be due ip-tables mode has its own
|
||||||
|
disadvantages and possible lack of performance. We want to check it.
|
||||||
|
|
||||||
|
Test Environment
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Preparation
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
The test plan is executed against Kubernetes deployed on bare-metal nodes.
|
||||||
|
|
||||||
|
Environment description
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The environment description includes hardware specification of servers,
|
||||||
|
network parameters, operation system and OpenStack deployment characteristics.
|
||||||
|
|
||||||
|
|
||||||
|
Test Case #1: Performing kube-proxy
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
Description
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
In this test case we investigate how number of services affects Kubernetes
|
||||||
|
proxy performance.
|
||||||
|
|
||||||
|
Script :download:`code/kubeproxy/test_kubeproxy.py` will create Kubernetes
|
||||||
|
services based on file :download:`code/kubeproxy/service.yaml`. After that,
|
||||||
|
will make request to this services using Locust_ (
|
||||||
|
:download:`code/locustfile.py`). Results will show response time.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
**Case group 1:**
|
||||||
|
|
||||||
|
.. table:
|
||||||
|
|
||||||
|
+----------------------+------------------------+
|
||||||
|
| Parameter name | Value |
|
||||||
|
+======================+========================+
|
||||||
|
| number of Services | 100, 200, ..., 1400 |
|
||||||
|
+----------------------+------------------------+
|
||||||
|
|
||||||
|
**Case group 2:**
|
||||||
|
|
||||||
|
.. table:
|
||||||
|
|
||||||
|
+----------------------+------------------------+
|
||||||
|
| Parameter name | Value |
|
||||||
|
+======================+========================+
|
||||||
|
| number of Services | 10, 50 |
|
||||||
|
+----------------------+------------------------+
|
||||||
|
| number of Pods | 1, 3, 5 |
|
||||||
|
+----------------------+------------------------+
|
||||||
|
|
||||||
|
List of performance metrics
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. table:: list of test metrics to be collected during this test
|
||||||
|
|
||||||
|
+-------------------------+-----------------------------------------------+
|
||||||
|
| Parameter | Description |
|
||||||
|
+=========================+===============================================+
|
||||||
|
| MIN_RESPONSE | time in ms |
|
||||||
|
+-------------------------+-----------------------------------------------+
|
||||||
|
| MAX_RESPONSE | time in ms |
|
||||||
|
+-------------------------+-----------------------------------------------+
|
||||||
|
| AVERAGE_RESPONSE | time in ms |
|
||||||
|
+-------------------------+-----------------------------------------------+
|
||||||
|
|
||||||
|
Reports
|
||||||
|
=======
|
||||||
|
|
||||||
|
Test plan execution reports:
|
||||||
|
* :ref:`Kubernetes_proxy_performance_test_report`
|
||||||
|
|
||||||
|
|
||||||
|
.. references:
|
||||||
|
|
||||||
|
.. _Locust: http://locust.io/
|
@ -0,0 +1,183 @@
|
|||||||
|
.. _Kubernetes_proxy_performance_test_report:
|
||||||
|
|
||||||
|
****************************************
|
||||||
|
Kubernetes proxy performance test report
|
||||||
|
****************************************
|
||||||
|
|
||||||
|
:Abstract:
|
||||||
|
|
||||||
|
This document is the report for :ref:`Kubernetes_proxy_performance_test_plan`
|
||||||
|
|
||||||
|
|
||||||
|
Environment description
|
||||||
|
=======================
|
||||||
|
|
||||||
|
This report is collected on the hardware described in
|
||||||
|
:ref:`intel_mirantis_performance_lab_1`.
|
||||||
|
|
||||||
|
|
||||||
|
Software
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
Kubernetes is installed using :ref:`Kargo` deployment tool on Ubuntu 16.04.1.
|
||||||
|
|
||||||
|
Node roles:
|
||||||
|
- node1: minion+master+etcd
|
||||||
|
- node2: minion+master+etcd
|
||||||
|
- node3: minion+etcd
|
||||||
|
- node4: minion
|
||||||
|
- node5: minion
|
||||||
|
- node6: minion
|
||||||
|
|
||||||
|
Software versions:
|
||||||
|
- OS: Ubuntu 16.04.1 LTS (Xenial Xerus)
|
||||||
|
- Kernel: 4.4.0-47-generic
|
||||||
|
- Docker: 1.13.0
|
||||||
|
- Kubernetes: v1.5.3+coreos.0
|
||||||
|
|
||||||
|
Reports
|
||||||
|
=======
|
||||||
|
|
||||||
|
Test Case #1: Performing kube-proxy
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Launched script that adds 100 services
|
||||||
|
|
||||||
|
|
||||||
|
Detailed Stats
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Case group 1
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Note: You can download these reports in csv format
|
||||||
|
:download:`here <reports.tar.gz>`
|
||||||
|
|
||||||
|
.. image:: kubeproxy.png
|
||||||
|
|
||||||
|
|
||||||
|
.. list-table:: Response time stats
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
*
|
||||||
|
- SERVICE_COUNT
|
||||||
|
- MIN_RESPONCE, ms
|
||||||
|
- AVERAGE_RESPONSE, ms
|
||||||
|
- MAX_RESPONSE, ms
|
||||||
|
*
|
||||||
|
- 100
|
||||||
|
- 12
|
||||||
|
- 821
|
||||||
|
- 2854
|
||||||
|
*
|
||||||
|
- 200
|
||||||
|
- 717
|
||||||
|
- 1843
|
||||||
|
- 4599
|
||||||
|
*
|
||||||
|
- 300
|
||||||
|
- 1173
|
||||||
|
- 2859
|
||||||
|
- 7773
|
||||||
|
*
|
||||||
|
- 400
|
||||||
|
- 1132
|
||||||
|
- 3898
|
||||||
|
- 9939
|
||||||
|
*
|
||||||
|
- 500
|
||||||
|
- 1483
|
||||||
|
- 4794
|
||||||
|
- 10567
|
||||||
|
*
|
||||||
|
- 600
|
||||||
|
- 2077
|
||||||
|
- 6139
|
||||||
|
- 13680
|
||||||
|
*
|
||||||
|
- 700
|
||||||
|
- 3280
|
||||||
|
- 7246
|
||||||
|
- 20293
|
||||||
|
*
|
||||||
|
- 800
|
||||||
|
- 3853
|
||||||
|
- 8268
|
||||||
|
- 19396
|
||||||
|
*
|
||||||
|
- 900
|
||||||
|
- 5216
|
||||||
|
- 9357
|
||||||
|
- 21877
|
||||||
|
*
|
||||||
|
- 1000
|
||||||
|
- 3056
|
||||||
|
- 10844
|
||||||
|
- 23374
|
||||||
|
*
|
||||||
|
- 1200
|
||||||
|
- 4339
|
||||||
|
- 13327
|
||||||
|
- 27060
|
||||||
|
*
|
||||||
|
- 1400
|
||||||
|
- 7168
|
||||||
|
- 16072
|
||||||
|
- 34114
|
||||||
|
|
||||||
|
Case group 2
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Note: The dependence of the time response from number of pods.
|
||||||
|
|
||||||
|
.. image:: s10.png
|
||||||
|
|
||||||
|
.. list-table:: for 10 services
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
*
|
||||||
|
- POD_COUNT
|
||||||
|
- MIN_RESPONCE, ms
|
||||||
|
- AVERAGE_RESPONSE, ms
|
||||||
|
- MAX_RESPONSE, ms
|
||||||
|
*
|
||||||
|
- 1
|
||||||
|
- 1
|
||||||
|
- 16
|
||||||
|
- 1704
|
||||||
|
*
|
||||||
|
- 3
|
||||||
|
- 1
|
||||||
|
- 5
|
||||||
|
- 434
|
||||||
|
*
|
||||||
|
- 5
|
||||||
|
- 1
|
||||||
|
- 4
|
||||||
|
- 200
|
||||||
|
|
||||||
|
.. image:: s50.png
|
||||||
|
|
||||||
|
.. list-table:: for 50 services
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
*
|
||||||
|
- POD_COUNT
|
||||||
|
- MIN_RESPONCE, ms
|
||||||
|
- AVERAGE_RESPONSE, ms
|
||||||
|
- MAX_RESPONSE, ms
|
||||||
|
*
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- 818
|
||||||
|
- 2818
|
||||||
|
*
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
- 317
|
||||||
|
- 1980
|
||||||
|
*
|
||||||
|
- 5
|
||||||
|
- 3
|
||||||
|
- 321
|
||||||
|
- 1634
|
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
Loading…
Reference in New Issue
Block a user