Post

[Kubernetes] Steady Load on Kubernetes Node Using Stress

[Kubernetes] Steady Load on Kubernetes Node Using Stress

stress 설치

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

ConfigMap 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
apiVersion: v1
kind: ConfigMap
metadata:
  name: stress-script
  namespace: chip-analyzer
data:
  stress-control.sh: |
    #!/bin/bash

    TARGET_CPU_USAGE=$TARGET_CPU
    echo "TARGET_CPU_USAGE = $TARGET_CPU_USAGE"

    TARGET_MEMORY_USAGE=$TARGET_MEM
    echo "TARGET_MEMORY_USAGE = $TARGET_MEMORY_USAGE"

    TIMEOUT=$TIMEOUT
    echo "TIMEOUT = $TIMEOUT"

    while true; do
      echo "##### CPU Check #####"
      TOTAL_CORES=$(nproc)
      echo "TOTAL_CORES = $TOTAL_CORES"

      CURRENT_IDLE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print $1}')
      echo "CURRENT_IDLE = $CURRENT_IDLE"

      CURRENT_CPU_USAGE=$(echo "100 - $CURRENT_IDLE" | bc -l)
      echo "CURRENT_CPU_USAGE = $CURRENT_CPU_USAGE"

      NEEDED_CPU_USAGE=$(echo "$TARGET_CPU_USAGE - $CURRENT_CPU_USAGE" | bc -l)
      echo "NEEDED_CPU_USAGE = $NEEDED_CPU_USAGE"

      TARGET_CPU_CORES=$(echo "$NEEDED_CPU_USAGE * $TOTAL_CORES / 100" | bc -l)
      echo "TARGET_CPU_CORES = $TARGET_CPU_CORES"

      TARGET_CPU_CORES_ROUNDED=$(echo "($TARGET_CPU_CORES+0.5)/1" | bc)
      echo "TARGET_CPU_CORES_ROUNDED = $TARGET_CPU_CORES_ROUNDED"


      echo "##### Memory Check #####"
      TOTAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
      echo "TOTAL_MEMORY = $TOTAL_MEMORY"

      FREE_MEMORY=$(grep MemFree /proc/meminfo | awk '{print $2}')
      echo "FREE_MEMORY = $FREE_MEMORY"

      BUFFERS=$(grep Buffers /proc/meminfo | awk '{print $2}')
      echo "BUFFERS = $BUFFERS"

      CACHED=$(grep "^Cached" /proc/meminfo | awk '{print $2}')
      echo "CACHED = $CACHED"

      USED_MEMORY=$((TOTAL_MEMORY - FREE_MEMORY - BUFFERS - CACHED))
      echo "USED_MEMORY = $USED_MEMORY"

      TARGET_MEMORY=$(echo "$TOTAL_MEMORY * $TARGET_MEMORY_USAGE / 100" | bc)
      echo "TARGET_MEMORY = $TARGET_MEMORY"

      NEEDED_MEMORY=$((TARGET_MEMORY - USED_MEMORY))
      echo "NEEDED_MEMORY = $NEEDED_MEMORY"

      # MB로 계산하고 싶을 때(반올림 추가)
      NEEDED_MEMORY_ROUNDED=$(echo "($NEEDED_MEMORY + 1023) / 1024" | bc)
      echo "NEEDED_MEMORY_ROUNDED = $NEEDED_MEMORY_ROUNDED"

      if (( $(echo "$TARGET_CPU_CORES_ROUNDED > 0" | bc -l) )) && (( NEEDED_MEMORY > 1023 )); then
        echo "Adding Stress CPU: $TARGET_CPU_CORES_ROUNDED / Memory: $NEEDED_MEMORY KB."
        stress --cpu $TARGET_CPU_CORES_ROUNDED --vm 1 --vm-bytes ${NEEDED_MEMORY}k --vm-hang 0 --verbose --timeout ${TIMEOUT}s
      elif (( $(echo "$TARGET_CPU_CORES_ROUNDED > 0" | bc -l) )) && (( NEEDED_MEMORY <= 1023 )); then
        echo "Adding Stress CPU:  $TARGET_CPU_CORES_ROUNDED."
        stress --cpu $TARGET_CPU_CORES_ROUNDED --vm-hang 0 --verbose --timeout ${TIMEOUT}s
      elif (( $(echo "$TARGET_CPU_CORES_ROUNDED <= 0" | bc -l) )) && (( NEEDED_MEMORY > 1023 )); then
        echo "Adding Stress Memory: $NEEDED_MEMORY KB."
        stress --vm 1 --vm-bytes ${NEEDED_MEMORY}k --vm-hang 0 --verbose --timeout ${TIMEOUT}s
      else
        echo "No Stress Needed."
      fi

      wait

      sleep 1

    done

DaemonSet 설정

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