## ๐Ÿ‘จโ€๐Ÿ’ป ์ž‘์„ฑ์ž ์กฐ๋ฏผ์ค€ - GitHub: https://github.com/jominjun94/k8s-cpu-limit-check-operator - docker registry: https://hub.docker.com/repository/docker/jominjun/cpu-reaper-operator --- # CPU Reaper Operator CPU Reaper Operator๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ Pod์˜ CPU ์‚ฌ์šฉ๋ฅ ์„ metrics.k8s.io API๋ฅผ ํ†ตํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ , ์„ค์ •๋œ ์ž„๊ณ„์น˜๋ฅผ ์ดˆ๊ณผํ•œ Pod๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์—ฌ Deployment, ReplicaSet ๋“ฑ์— ์˜ํ•ด Pod๊ฐ€ ์žฌ์ƒ์„ฑ๋˜๋„๋ก ์œ ๋„ํ•˜๋Š” Operator์ž…๋‹ˆ๋‹ค. CPU limit์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  throttling๋งŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU ๊ณผ๋‹ค ์‚ฌ์šฉ ์ƒํƒœ์—์„œ๋„ Pod๋Š” Running ์ƒํƒœ๋กœ ์œ ์ง€๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, CPU Reaper Operator๋Š” ์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. --- ## ๐Ÿ“Œ ์ฃผ์š” ๊ธฐ๋Šฅ - Pod CPU ์‚ฌ์šฉ๋ฅ  ๋ชจ๋‹ˆํ„ฐ๋ง - CPU Limit(๋˜๋Š” Request)์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ๋ฅ  ๊ณ„์‚ฐ - ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ ์ž„๊ณ„์น˜ ์ดˆ๊ณผ ์‹œ Pod ์ž๋™ ์‚ญ์ œ - Deployment / ReplicaSet ํ™˜๊ฒฝ์—์„œ ์ž๋™ ๋ณต๊ตฌ ์œ ๋„ - ์ •์ฑ…(Custom Resource) ๊ธฐ๋ฐ˜ ์„ค์ • --- ## ๐Ÿ“Œ ๋™์ž‘ ๊ฐœ์š” 1. ์‚ฌ์šฉ์ž๊ฐ€ `CpuReaperPolicy` ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. 2. Controller๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ •์ฑ…์„ Reconcile ํ•ฉ๋‹ˆ๋‹ค. 3. ์ง€์ •๋œ Label Selector์— ํ•ด๋‹นํ•˜๋Š” Pod๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. 4. `metrics.k8s.io` API๋ฅผ ํ†ตํ•ด Pod์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. 5. Pod์˜ CPU Limit(์—†์„ ๊ฒฝ์šฐ Request) ๋Œ€๋น„ ์‚ฌ์šฉ๋ฅ ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. 6. ์‚ฌ์šฉ๋ฅ ์ด ์ž„๊ณ„์น˜๋ฅผ ์ดˆ๊ณผํ•œ ์ƒํƒœ๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ ์ง€์†๋˜๋ฉด Pod๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. 7. ์ƒ์œ„ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด Pod๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. --- ## ๐Ÿ“Œ ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ - Kubernetes v1.23+ - metrics-server ํ•„์ˆ˜ - kubectl get apiservices | grep metrics.k8s.io - Go v1.21+ (๊ฐœ๋ฐœ ์‹œ) --- ## ๐Ÿš€ ์„ค์น˜ ๋ฐฉ๋ฒ• ``` kubectl apply -f https://raw.githubusercontent.com/jominjun94/k8s-cpu-limit-check-operator/main/dist/install.yaml ``` --- ## ๐Ÿ”ฌ ์ •์ฑ… ์ƒ์„ฑ Custom Resource ์ •์˜ (CpuReaperPolicy) ``` apiVersion: reaper.cpu.limit.check/v1alpha1 kind: CpuReaperPolicy metadata: name: cpu-reaper namespace: default spec: podSelector: matchLabels: app: stress thresholdPercent: 100 forSeconds: 30 checkIntervalSeconds: 10 ``` --- ## ๐Ÿ“ˆ ์ ์šฉ ``` kubectl apply -f cpureaperpolicy.yaml ``` ``` ํ…Œ์ŠคํŠธ์šฉ CPU ๋ถ€ํ•˜ Pod apiVersion: apps/v1 kind: Deployment metadata: name: cpu-stress namespace: default spec: replicas: 1 selector: matchLabels: app: stress template: metadata: labels: app: stress spec: containers: - name: stress image: busybox command: - sh - -c - | while true; do :; done resources: requests: cpu: "100m" limits: cpu: "100m" ``` --- ## โš™๏ธ ๋™์ž‘ ํ™•์ธ ``` kubectl logs -n cpu-reaper-system deploy/cpu-reaper-operator-controller-manager ``` --- ## ๐Ÿณ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ``` jominjun/cpu-reaper-operator:v0.1.0 (public docker registry) ``` ## ๐Ÿงช ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ชจ๋“œ ``` make install make run ```