From d5d72fd2c76163eeed0d722d11ac1e2b1ddb7dc4 Mon Sep 17 00:00:00 2001 From: Ardika Bagus Date: Wed, 4 Dec 2024 18:17:40 +0700 Subject: [PATCH] feat: add resource-leaker image Signed-off-by: Ardika Bagus --- dockerfiles/resource-leaker/Dockerfile | 5 ++ dockerfiles/resource-leaker/leaker.py | 79 +++++++++++++++++++ kubernetes/services/leaker/deployment.yaml | 40 ++++++++++ kubernetes/services/leaker/service.yaml | 15 ++++ .../podinfo/istio/canary/deployment.yaml | 0 .../podinfo/istio/canary/service.yaml | 0 .../podinfo/istio/destinationrule.yaml | 0 .../{ => services}/podinfo/istio/service.yaml | 0 .../podinfo/istio/stable/deployment.yaml | 0 .../podinfo/istio/stable/service.yaml | 0 .../podinfo/istio/virtualservice.yaml | 0 .../podinfo/simple/deployment.yaml | 0 .../podinfo/simple/service.yaml | 0 13 files changed, 139 insertions(+) create mode 100644 dockerfiles/resource-leaker/Dockerfile create mode 100644 dockerfiles/resource-leaker/leaker.py create mode 100644 kubernetes/services/leaker/deployment.yaml create mode 100644 kubernetes/services/leaker/service.yaml rename kubernetes/{ => services}/podinfo/istio/canary/deployment.yaml (100%) rename kubernetes/{ => services}/podinfo/istio/canary/service.yaml (100%) rename kubernetes/{ => services}/podinfo/istio/destinationrule.yaml (100%) rename kubernetes/{ => services}/podinfo/istio/service.yaml (100%) rename kubernetes/{ => services}/podinfo/istio/stable/deployment.yaml (100%) rename kubernetes/{ => services}/podinfo/istio/stable/service.yaml (100%) rename kubernetes/{ => services}/podinfo/istio/virtualservice.yaml (100%) rename kubernetes/{ => services}/podinfo/simple/deployment.yaml (100%) rename kubernetes/{ => services}/podinfo/simple/service.yaml (100%) diff --git a/dockerfiles/resource-leaker/Dockerfile b/dockerfiles/resource-leaker/Dockerfile new file mode 100644 index 0000000..0f07925 --- /dev/null +++ b/dockerfiles/resource-leaker/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.10-bullseye +RUN pip install flask +COPY leaker.py /app/leaker.py +WORKDIR /app +CMD ["python", "leaker.py"] \ No newline at end of file diff --git a/dockerfiles/resource-leaker/leaker.py b/dockerfiles/resource-leaker/leaker.py new file mode 100644 index 0000000..d92d276 --- /dev/null +++ b/dockerfiles/resource-leaker/leaker.py @@ -0,0 +1,79 @@ +import multiprocessing +import threading +import time + +from flask import Flask, jsonify, request + +app = Flask(__name__) +memory_hog = [] +cpu_hog_processes = [] +leak_running = False +cpu_running = False + +def memory_leak_simulator(): + global memory_hog, leak_running + while leak_running: + memory_hog.append(" " * 10**6) # Allocate 1MB + time.sleep(1) # Gradual allocation + +def cpu_stress_simulator(): + while True: + _ = 1 + 1 # Simple CPU loop + +@app.route('/start', methods=['POST']) +def start(): + global leak_running, cpu_running, cpu_hog_processes + + resource = request.args.get('resource', 'memory').lower() + if resource == "memory": + if not leak_running: + leak_running = True + thread = threading.Thread(target=memory_leak_simulator) + thread.start() + return jsonify({"status": "Memory leak started"}), 200 + return jsonify({"status": "Memory leak already running"}), 400 + elif resource == "cpu": + if not cpu_running: + cpu_running = True + cpu_hog_processes = [ + multiprocessing.Process(target=cpu_stress_simulator) + for _ in range(multiprocessing.cpu_count()) + ] + for process in cpu_hog_processes: + process.start() + return jsonify({"status": "CPU stress started"}), 200 + return jsonify({"status": "CPU stress already running"}), 400 + return jsonify({"error": "Invalid resource type"}), 400 + +@app.route('/stop', methods=['POST']) +def stop(): + global leak_running, cpu_running, memory_hog, cpu_hog_processes + + resource = request.args.get('resource', 'memory').lower() + if resource == "memory": + if leak_running: + leak_running = False + memory_hog = [] # Clear memory + return jsonify({"status": "Memory leak stopped"}), 200 + return jsonify({"status": "No memory leak running"}), 400 + elif resource == "cpu": + if cpu_running: + cpu_running = False + for process in cpu_hog_processes: + process.terminate() + cpu_hog_processes = [] + return jsonify({"status": "CPU stress stopped"}), 200 + return jsonify({"status": "No CPU stress running"}), 400 + return jsonify({"error": "Invalid resource type"}), 400 + +@app.route('/status', methods=['GET']) +def status(): + return jsonify({ + "memory_leak_running": leak_running, + "cpu_stress_running": cpu_running, + "memory_allocated_mb": len(memory_hog), + "cpu_cores_stressed": len(cpu_hog_processes) + }) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/kubernetes/services/leaker/deployment.yaml b/kubernetes/services/leaker/deployment.yaml new file mode 100644 index 0000000..ae2472b --- /dev/null +++ b/kubernetes/services/leaker/deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: resource-leaker + labels: + app.kubernetes.io/name: resource-leaker +spec: + minReadySeconds: 3 + revisionHistoryLimit: 5 + progressDeadlineSeconds: 60 + strategy: + rollingUpdate: + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app.kubernetes.io/name: resource-leaker + template: + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9797" + labels: + app.kubernetes.io/name: resource-leaker + spec: + containers: + - name: leaker + image: ghcr.io/ardikabs/etc/resource-leaker:latest + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 5000 + protocol: TCP + resources: + limits: + cpu: 100m + memory: 64Mi + requests: + cpu: 100m + memory: 64Mi diff --git a/kubernetes/services/leaker/service.yaml b/kubernetes/services/leaker/service.yaml new file mode 100644 index 0000000..1d11630 --- /dev/null +++ b/kubernetes/services/leaker/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: resource-leaker + name: resource-leaker +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: resource-leaker + ports: + - name: http + port: 5000 + protocol: TCP + targetPort: http diff --git a/kubernetes/podinfo/istio/canary/deployment.yaml b/kubernetes/services/podinfo/istio/canary/deployment.yaml similarity index 100% rename from kubernetes/podinfo/istio/canary/deployment.yaml rename to kubernetes/services/podinfo/istio/canary/deployment.yaml diff --git a/kubernetes/podinfo/istio/canary/service.yaml b/kubernetes/services/podinfo/istio/canary/service.yaml similarity index 100% rename from kubernetes/podinfo/istio/canary/service.yaml rename to kubernetes/services/podinfo/istio/canary/service.yaml diff --git a/kubernetes/podinfo/istio/destinationrule.yaml b/kubernetes/services/podinfo/istio/destinationrule.yaml similarity index 100% rename from kubernetes/podinfo/istio/destinationrule.yaml rename to kubernetes/services/podinfo/istio/destinationrule.yaml diff --git a/kubernetes/podinfo/istio/service.yaml b/kubernetes/services/podinfo/istio/service.yaml similarity index 100% rename from kubernetes/podinfo/istio/service.yaml rename to kubernetes/services/podinfo/istio/service.yaml diff --git a/kubernetes/podinfo/istio/stable/deployment.yaml b/kubernetes/services/podinfo/istio/stable/deployment.yaml similarity index 100% rename from kubernetes/podinfo/istio/stable/deployment.yaml rename to kubernetes/services/podinfo/istio/stable/deployment.yaml diff --git a/kubernetes/podinfo/istio/stable/service.yaml b/kubernetes/services/podinfo/istio/stable/service.yaml similarity index 100% rename from kubernetes/podinfo/istio/stable/service.yaml rename to kubernetes/services/podinfo/istio/stable/service.yaml diff --git a/kubernetes/podinfo/istio/virtualservice.yaml b/kubernetes/services/podinfo/istio/virtualservice.yaml similarity index 100% rename from kubernetes/podinfo/istio/virtualservice.yaml rename to kubernetes/services/podinfo/istio/virtualservice.yaml diff --git a/kubernetes/podinfo/simple/deployment.yaml b/kubernetes/services/podinfo/simple/deployment.yaml similarity index 100% rename from kubernetes/podinfo/simple/deployment.yaml rename to kubernetes/services/podinfo/simple/deployment.yaml diff --git a/kubernetes/podinfo/simple/service.yaml b/kubernetes/services/podinfo/simple/service.yaml similarity index 100% rename from kubernetes/podinfo/simple/service.yaml rename to kubernetes/services/podinfo/simple/service.yaml