[Kubernetes] Steady Load on Kubernetes Node Using Stress

stress 설치 #

1RUN apt-get update && apt-get install -y stress bc

ConfigMap 설정 #

 1apiVersion: v1
 2kind: ConfigMap
 3metadata:
 4  name: stress-script
 5  namespace: chip-analyzer
 6data:
 7  stress-control.sh: |
 8    #!/bin/bash
 9
10    TARGET_CPU_USAGE=$TARGET_CPU
11    echo "TARGET_CPU_USAGE = $TARGET_CPU_USAGE"
12
13    TARGET_MEMORY_USAGE=$TARGET_MEM
14    echo "TARGET_MEMORY_USAGE = $TARGET_MEMORY_USAGE"
15
16    TIMEOUT=$TIMEOUT
17    echo "TIMEOUT = $TIMEOUT"
18
19    while true; do
20      echo "##### CPU Check #####"
21      TOTAL_CORES=$(nproc)
22      echo "TOTAL_CORES = $TOTAL_CORES"
23
24      CURRENT_IDLE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print $1}')
25      echo "CURRENT_IDLE = $CURRENT_IDLE"
26
27      CURRENT_CPU_USAGE=$(echo "100 - $CURRENT_IDLE" | bc -l)
28      echo "CURRENT_CPU_USAGE = $CURRENT_CPU_USAGE"
29
30      NEEDED_CPU_USAGE=$(echo "$TARGET_CPU_USAGE - $CURRENT_CPU_USAGE" | bc -l)
31      echo "NEEDED_CPU_USAGE = $NEEDED_CPU_USAGE"
32
33      TARGET_CPU_CORES=$(echo "$NEEDED_CPU_USAGE * $TOTAL_CORES / 100" | bc -l)
34      echo "TARGET_CPU_CORES = $TARGET_CPU_CORES"
35
36      TARGET_CPU_CORES_ROUNDED=$(echo "($TARGET_CPU_CORES+0.5)/1" | bc)
37      echo "TARGET_CPU_CORES_ROUNDED = $TARGET_CPU_CORES_ROUNDED"
38
39
40      echo "##### Memory Check #####"
41      TOTAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
42      echo "TOTAL_MEMORY = $TOTAL_MEMORY"
43
44      FREE_MEMORY=$(grep MemFree /proc/meminfo | awk '{print $2}')
45      echo "FREE_MEMORY = $FREE_MEMORY"
46
47      BUFFERS=$(grep Buffers /proc/meminfo | awk '{print $2}')
48      echo "BUFFERS = $BUFFERS"
49
50      CACHED=$(grep "^Cached" /proc/meminfo | awk '{print $2}')
51      echo "CACHED = $CACHED"
52
53      USED_MEMORY=$((TOTAL_MEMORY - FREE_MEMORY - BUFFERS - CACHED))
54      echo "USED_MEMORY = $USED_MEMORY"
55
56      TARGET_MEMORY=$(echo "$TOTAL_MEMORY * $TARGET_MEMORY_USAGE / 100" | bc)
57      echo "TARGET_MEMORY = $TARGET_MEMORY"
58
59      NEEDED_MEMORY=$((TARGET_MEMORY - USED_MEMORY))
60      echo "NEEDED_MEMORY = $NEEDED_MEMORY"
61
62      # MB로 계산하고 싶을 때(반올림 추가)
63      NEEDED_MEMORY_ROUNDED=$(echo "($NEEDED_MEMORY + 1023) / 1024" | bc)
64      echo "NEEDED_MEMORY_ROUNDED = $NEEDED_MEMORY_ROUNDED"
65
66      if (( $(echo "$TARGET_CPU_CORES_ROUNDED > 0" | bc -l) )) && (( NEEDED_MEMORY > 1023 )); then
67        echo "Adding Stress CPU: $TARGET_CPU_CORES_ROUNDED / Memory: $NEEDED_MEMORY KB."
68        stress --cpu $TARGET_CPU_CORES_ROUNDED --vm 1 --vm-bytes ${NEEDED_MEMORY}k --vm-hang 0 --verbose --timeout ${TIMEOUT}s
69      elif (( $(echo "$TARGET_CPU_CORES_ROUNDED > 0" | bc -l) )) && (( NEEDED_MEMORY <= 1023 )); then
70        echo "Adding Stress CPU:  $TARGET_CPU_CORES_ROUNDED."
71        stress --cpu $TARGET_CPU_CORES_ROUNDED --vm-hang 0 --verbose --timeout ${TIMEOUT}s
72      elif (( $(echo "$TARGET_CPU_CORES_ROUNDED <= 0" | bc -l) )) && (( NEEDED_MEMORY > 1023 )); then
73        echo "Adding Stress Memory: $NEEDED_MEMORY KB."
74        stress --vm 1 --vm-bytes ${NEEDED_MEMORY}k --vm-hang 0 --verbose --timeout ${TIMEOUT}s
75      else
76        echo "No Stress Needed."
77      fi
78
79      wait
80
81      sleep 1
82
83    done

DaemonSet 설정 #

 1apiVersion: apps/v1
 2kind: DaemonSet
 3metadata:
 4  labels:
 5    app: chip-analyzer-master
 6  name: chip-analyzer-master
 7  namespace: chip-analyzer
 8spec:
 9  updateStrategy:
10    type: RollingUpdate
11    rollingUpdate:
12      maxUnavailable: 5
13      maxSurge: 0
14  selector:
15    matchLabels:
16      app: chip-analyzer-master
17  template:
18    metadata:
19      labels:
20        app: chip-analyzer-master
21    spec:
22      affinity:
23        nodeAffinity:
24          requiredDuringSchedulingIgnoredDuringExecution:
25            nodeSelectorTerms:
26              - matchExpressions:
27                - key: node-role.kubernetes.io/control-plane
28                   operator: Exists
29      tolerations:
30        - key: node-role.kubernetes.io/control-plane
31           operator: Exists
32           effect: NoSchedule
33        - key: node-role.kubernetes.io/master
34           operator: Exists
35           effect: NoSchedule
36      containers:
37      - env:
38        - name: TARGET_CPU
39           value: '50'
40        - name: TARGET_MEM
41           value: '50'
42        - name: TIMEOUT
43           value: '300'
44        image: stress:v1.0
45        command: ["/bin/bash", "/scripts/stress-control.sh"]
46        volumeMounts:
47        - name: script-volume
48           mountPath: /scripts
49        imagePullPolicy: Always
50        name: chip-analyzer-master
51      restartPolicy: Always
52      volumes:
53      - name: script-volume
54         configMap:
55           name: stress-script
56           defaultMode: 0775
Advertisement