commit
01ee3ff94a
@ -0,0 +1,21 @@ |
|||||||
|
MIT License |
||||||
|
|
||||||
|
Copyright (c) 2018 Pharb |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
of this software and associated documentation files (the "Software"), to deal |
||||||
|
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
copies of the Software, and to permit persons to whom the Software is |
||||||
|
furnished to do so, subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
|
copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||||
|
SOFTWARE. |
@ -0,0 +1,50 @@ |
|||||||
|
# iperf3-k8s |
||||||
|
|
||||||
|
Simple wrapper around iperf3 to measure network bandwidth from all nodes of a Kubernetes cluster. |
||||||
|
|
||||||
|
## How to use |
||||||
|
|
||||||
|
*Make sure you are using the correct cluster context before running this script: `kubectl config current-context`* |
||||||
|
|
||||||
|
```sh |
||||||
|
./iperf3.sh |
||||||
|
``` |
||||||
|
|
||||||
|
Any options supported by iperf3 can be added, e.g.: |
||||||
|
|
||||||
|
```sh |
||||||
|
./iperf3.sh -t 2 |
||||||
|
``` |
||||||
|
|
||||||
|
### NetworkPolicies |
||||||
|
|
||||||
|
If you need NetworkPolicies you can install it: |
||||||
|
|
||||||
|
```sh |
||||||
|
kubectl apply -f network-policy.yaml |
||||||
|
``` |
||||||
|
|
||||||
|
And cleanup afterwards: |
||||||
|
|
||||||
|
```sh |
||||||
|
kubectl delete -f network-policy.yaml |
||||||
|
``` |
||||||
|
|
||||||
|
## How it works |
||||||
|
|
||||||
|
The script will run an iperf3 client inside a pod on every cluster node including the Kubernetes master. |
||||||
|
Each iperf3 client will then sequentially run the same benchmark against the iperf3 server running on the Kubernetes master. |
||||||
|
|
||||||
|
All required Kubernetes resources will be created and removed after the benchmark finished successfully. |
||||||
|
|
||||||
|
This has been tested with v1.9.6, v1.10.3 and v1.11.6 of Kubernetes. |
||||||
|
|
||||||
|
The latest version of this Docker image is used to run iperf3: |
||||||
|
[https://hub.docker.com/r/networkstatic/iperf3/](https://hub.docker.com/r/networkstatic/iperf3/) |
||||||
|
|
||||||
|
Details on how to use iperf3 can be found here: |
||||||
|
[https://github.com/esnet/iperf](https://github.com/esnet/iperf) |
||||||
|
|
||||||
|
## Thanks |
||||||
|
|
||||||
|
Thanks to [Pharb](https://github.com/Pharb) for the code. This is a repackaged version of his [project](https://github.com/Pharb/kubernetes-iperf3) adapted for my use cases. |
@ -0,0 +1,51 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
set -eu |
||||||
|
|
||||||
|
cd $(dirname $0) |
||||||
|
|
||||||
|
## <setup> |
||||||
|
|
||||||
|
kubectl create -f iperf3.yaml |
||||||
|
|
||||||
|
until $(kubectl get pods -l app=iperf3-server -o jsonpath='{.items[0].status.containerStatuses[0].ready}'); do |
||||||
|
echo "Waiting for iperf3 server to start..." |
||||||
|
sleep 5 |
||||||
|
done |
||||||
|
|
||||||
|
echo "Server is running" |
||||||
|
echo |
||||||
|
|
||||||
|
CLIENTS=$(kubectl get pods -l app=iperf3-client -o name | cut -d'/' -f2) |
||||||
|
|
||||||
|
for POD in ${CLIENTS}; do |
||||||
|
until $(kubectl get pod "${POD}" -o jsonpath='{.status.containerStatuses[0].ready}'); do |
||||||
|
echo "Waiting for ${POD} to start..." |
||||||
|
sleep 5 |
||||||
|
done |
||||||
|
done |
||||||
|
|
||||||
|
echo "All clients are running" |
||||||
|
echo |
||||||
|
|
||||||
|
kubectl get pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,IP-NODE:.status.hostIP,IP-POD:status.podIP |
||||||
|
|
||||||
|
echo |
||||||
|
|
||||||
|
## </setup> |
||||||
|
## <run> |
||||||
|
|
||||||
|
CLIENTS=$(kubectl get pods -l app=iperf3-client -o name | cut -d'/' -f2) |
||||||
|
|
||||||
|
for POD in ${CLIENTS}; do |
||||||
|
HOST=$(kubectl get pod "${POD}" -o jsonpath='{.status.hostIP}') |
||||||
|
kubectl exec -it "${POD}" -- iperf3 -c iperf3-server -T "Client on ${HOST}" "$@" |
||||||
|
echo |
||||||
|
done |
||||||
|
|
||||||
|
## </run> |
||||||
|
## <clean> |
||||||
|
|
||||||
|
kubectl delete --cascade -f iperf3.yaml |
||||||
|
|
||||||
|
## </clean> |
@ -0,0 +1,80 @@ |
|||||||
|
apiVersion: apps/v1 |
||||||
|
kind: Deployment |
||||||
|
metadata: |
||||||
|
name: iperf3-server-deployment |
||||||
|
labels: |
||||||
|
app: iperf3-server |
||||||
|
spec: |
||||||
|
replicas: 1 |
||||||
|
selector: |
||||||
|
matchLabels: |
||||||
|
app: iperf3-server |
||||||
|
template: |
||||||
|
metadata: |
||||||
|
labels: |
||||||
|
app: iperf3-server |
||||||
|
spec: |
||||||
|
affinity: |
||||||
|
nodeAffinity: |
||||||
|
preferredDuringSchedulingIgnoredDuringExecution: |
||||||
|
- weight: 1 |
||||||
|
preference: |
||||||
|
matchExpressions: |
||||||
|
- key: kubernetes.io/role |
||||||
|
operator: In |
||||||
|
values: |
||||||
|
- master |
||||||
|
tolerations: |
||||||
|
- key: node-role.kubernetes.io/master |
||||||
|
operator: Exists |
||||||
|
effect: NoSchedule |
||||||
|
containers: |
||||||
|
- name: iperf3-server |
||||||
|
image: networkstatic/iperf3 |
||||||
|
args: ['-s'] |
||||||
|
ports: |
||||||
|
- containerPort: 5201 |
||||||
|
name: server |
||||||
|
terminationGracePeriodSeconds: 0 |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
apiVersion: v1 |
||||||
|
kind: Service |
||||||
|
metadata: |
||||||
|
name: iperf3-server |
||||||
|
spec: |
||||||
|
selector: |
||||||
|
app: iperf3-server |
||||||
|
ports: |
||||||
|
- protocol: TCP |
||||||
|
port: 5201 |
||||||
|
targetPort: server |
||||||
|
|
||||||
|
--- |
||||||
|
|
||||||
|
apiVersion: apps/v1 |
||||||
|
kind: DaemonSet |
||||||
|
metadata: |
||||||
|
name: iperf3-clients |
||||||
|
labels: |
||||||
|
app: iperf3-client |
||||||
|
spec: |
||||||
|
selector: |
||||||
|
matchLabels: |
||||||
|
app: iperf3-client |
||||||
|
template: |
||||||
|
metadata: |
||||||
|
labels: |
||||||
|
app: iperf3-client |
||||||
|
spec: |
||||||
|
tolerations: |
||||||
|
- key: node-role.kubernetes.io/master |
||||||
|
operator: Exists |
||||||
|
effect: NoSchedule |
||||||
|
containers: |
||||||
|
- name: iperf3-client |
||||||
|
image: networkstatic/iperf3 |
||||||
|
command: ['/bin/sh', '-c', 'sleep infinity'] |
||||||
|
# To benchmark manually: kubectl exec iperf3-clients-jlfxq -- /bin/sh -c 'iperf3 -c iperf3-server' |
||||||
|
terminationGracePeriodSeconds: 0 |
@ -0,0 +1,15 @@ |
|||||||
|
kind: NetworkPolicy |
||||||
|
apiVersion: networking.k8s.io/v1 |
||||||
|
metadata: |
||||||
|
name: iperf3-server-access |
||||||
|
spec: |
||||||
|
podSelector: |
||||||
|
matchLabels: |
||||||
|
app: iperf3-server |
||||||
|
ingress: |
||||||
|
- ports: |
||||||
|
- port: 5201 |
||||||
|
from: |
||||||
|
- podSelector: |
||||||
|
matchLabels: |
||||||
|
app: iperf3-client |
Loading…
Reference in new issue