initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
yamls/**
|
||||||
13
README.md
Normal file
13
README.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Test heavy load on cluster
|
||||||
|
|
||||||
|
Log in cluster.
|
||||||
|
|
||||||
|
## nodes configuration
|
||||||
|
oc label node worker-0 wkloadtype=fakeload
|
||||||
|
oc adm taint node worker-0 wkloadtype=fakeload:NoSchedule
|
||||||
|
|
||||||
|
## Deploy workload
|
||||||
|
|
||||||
|
~~~
|
||||||
|
deploy_wkload.sh {number of deployment} [-d]
|
||||||
|
~~~
|
||||||
204
app_template.yaml
Normal file
204
app_template.yaml
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/part-of: fakeworkload
|
||||||
|
name: ${current_ns}
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: fakeworkload
|
||||||
|
namespace: ${current_ns}
|
||||||
|
labels: &deploy_labels
|
||||||
|
app.kubernetes.io/part-of: fakeworkload
|
||||||
|
app.kubernetes.io/name: ${current_ns}
|
||||||
|
spec:
|
||||||
|
replicas: 2
|
||||||
|
revisionHistoryLimit: 2
|
||||||
|
progressDeadlineSeconds: 2000
|
||||||
|
strategy:
|
||||||
|
type: RollingUpdate
|
||||||
|
rollingUpdate:
|
||||||
|
maxUnavailable: 25%
|
||||||
|
maxSurge: 25%
|
||||||
|
selector:
|
||||||
|
matchLabels: *deploy_labels
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: null
|
||||||
|
labels: *deploy_labels
|
||||||
|
spec:
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
affinity:
|
||||||
|
nodeAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
nodeSelectorTerms:
|
||||||
|
- matchExpressions:
|
||||||
|
- key: wkloadtype
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- fakeload
|
||||||
|
podAntiAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- weight: 100
|
||||||
|
podAffinityTerm:
|
||||||
|
labelSelector:
|
||||||
|
matchExpressions:
|
||||||
|
- key: app.kubernetes.io/name
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- ${current_ns}
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
tolerations:
|
||||||
|
- key: wkloadtype
|
||||||
|
operator: Equal
|
||||||
|
value: fakeload
|
||||||
|
effect: "NoSchedule"
|
||||||
|
containers:
|
||||||
|
- image: quay.io/simbelmas/nginx:stable
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "1Mi"
|
||||||
|
cpu: "1m"
|
||||||
|
limits:
|
||||||
|
memory: "20Mi"
|
||||||
|
command:
|
||||||
|
- bash
|
||||||
|
- -e
|
||||||
|
- -c
|
||||||
|
- |-
|
||||||
|
lc()
|
||||||
|
{
|
||||||
|
(
|
||||||
|
pids=""
|
||||||
|
cpus=\${1:-1}
|
||||||
|
seconds=\${2:-60}
|
||||||
|
echo loading \$cpus CPUs for \$seconds seconds
|
||||||
|
trap 'for p in \$pids; do kill \$p; done' 0
|
||||||
|
for ((i=0;i<cpus;i++)); do
|
||||||
|
while : ; do
|
||||||
|
:
|
||||||
|
done &
|
||||||
|
pids="\$pids $!"
|
||||||
|
done
|
||||||
|
sleep \$seconds
|
||||||
|
) &
|
||||||
|
}
|
||||||
|
#lc \$((1 + \$RANDOM % 3)) \$((120 + \$RANDOM % 421))
|
||||||
|
lc \$((1 + \$RANDOM % 3)) \$((120 + \$RANDOM % 600))
|
||||||
|
wait
|
||||||
|
echo Starting frontend
|
||||||
|
exec nginx -g "daemon off;"
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop: ['ALL']
|
||||||
|
name: front
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/www/html
|
||||||
|
name: web
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
protocol: TCP
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: 8080
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
timeoutSeconds: 1
|
||||||
|
periodSeconds: 20
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 3
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: 8080
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
timeoutSeconds: 1
|
||||||
|
periodSeconds: 30
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 3
|
||||||
|
startupProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /
|
||||||
|
port: 8080
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 90
|
||||||
|
initContainers:
|
||||||
|
- command:
|
||||||
|
- bash
|
||||||
|
- -e
|
||||||
|
- -c
|
||||||
|
- |-
|
||||||
|
cat >/var/www/index.html <<EOF
|
||||||
|
<html>
|
||||||
|
<head><title>${current_ns}</title>
|
||||||
|
<body>
|
||||||
|
<h1>${current_ns}</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
EOF
|
||||||
|
image: quay.io/simbelmas/nginx:stable
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop: ['ALL']
|
||||||
|
name: generate-web
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/www
|
||||||
|
name: web
|
||||||
|
volumes:
|
||||||
|
- emptyDir: {}
|
||||||
|
name: web
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels: &svc_labels
|
||||||
|
app.kubernetes.io/part-of: fakeworkload
|
||||||
|
app.kubernetes.io/name: ${current_ns}
|
||||||
|
name: fakeworkload-${current_ns}
|
||||||
|
namespace: ${current_ns}
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 8080
|
||||||
|
selector: *svc_labels
|
||||||
|
sessionAffinity: ClientIP
|
||||||
|
type: ClusterIP
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: fakeworkload-${current_ns}
|
||||||
|
namespace: ${current_ns}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/part-of: fakeworkload
|
||||||
|
app.kubernetes.io/name: ${current_ns}
|
||||||
|
spec:
|
||||||
|
ingressClassName: openshift-default
|
||||||
|
rules:
|
||||||
|
- host: ${current_ns}.${route_domain}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: fakeworkload-${current_ns}
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
|
||||||
39
deploy_wkload.sh
Executable file
39
deploy_wkload.sh
Executable file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/zsh -e
|
||||||
|
script_dir="$(dirname "$(readlink -f "$0")")"
|
||||||
|
manifests_dir=${script_dir}/yamls
|
||||||
|
|
||||||
|
|
||||||
|
ns_prefix=wkload-
|
||||||
|
|
||||||
|
if [[ "$1" =~ '^[0-9]+$' ]] ; then
|
||||||
|
nb_ns="$1"
|
||||||
|
else
|
||||||
|
echo First paramater nor given or not number, assuming 1 >&2
|
||||||
|
nb_ns=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Namesspaces Cleanup
|
||||||
|
if [[ "$2" == "-d" ]] ; then
|
||||||
|
oc delete --wait ns -l app.kubernetes.io/part-of=fakeworkload || echo No namespace to delete continuing
|
||||||
|
fi
|
||||||
|
|
||||||
|
# yamls Cleanup
|
||||||
|
if [ -d "${manifests_dir}" ] ; then
|
||||||
|
rm -rf "${manifests_dir}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Generate yamls
|
||||||
|
echo Template generation ....
|
||||||
|
mkdir "${manifests_dir}"
|
||||||
|
route_domain="$(oc get ingresses.config.openshift.io cluster -o jsonpath='{.spec.domain}')"
|
||||||
|
start=1
|
||||||
|
while [[ "${start}" -le "${nb_ns}" ]] ; do
|
||||||
|
current_ns=${ns_prefix}$(printf "%05d" "${start}")
|
||||||
|
start=$((start + 1))
|
||||||
|
eval "cat >${manifests_dir}/${current_ns}.yaml <<EOF
|
||||||
|
$(<${script_dir}/app_template.yaml)
|
||||||
|
EOF"
|
||||||
|
done
|
||||||
|
|
||||||
|
oc apply -f "${manifests_dir}"
|
||||||
|
echo All Done!
|
||||||
11
kubelet-500-pods-per-node.yaml
Normal file
11
kubelet-500-pods-per-node.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: machineconfiguration.openshift.io/v1
|
||||||
|
kind: KubeletConfig
|
||||||
|
metadata:
|
||||||
|
name: set-max-pods
|
||||||
|
spec:
|
||||||
|
machineConfigPoolSelector:
|
||||||
|
matchLabels:
|
||||||
|
pools.operator.machineconfiguration.openshift.io/worker: ""
|
||||||
|
kubeletConfig:
|
||||||
|
podsPerCore: 0
|
||||||
|
maxPods: 500
|
||||||
Reference in New Issue
Block a user