Files
k8s-cpu-limit-check-operator/README.md
2025-12-12 16:38:48 +09:00

3.6 KiB
Raw Blame History

CPU Reaper Operator

Kubernetes Pod CPU 사용률을 실시간으로 감시하고,
설정된 임계치를 초과한 Pod를 자동으로 재기동(삭제)하는 Kubernetes Operator


📌 프로젝트 개요

CPU Reaper Operator는 Kubernetes 클러스터에서 실행 중인 Pod의
CPU 사용량을 metrics.k8s.io 기반으로 주기적으로 확인하여,

  • CPU 사용률이 설정한 임계치(%)를 초과하고
  • 일정 시간 이상 지속될 경우

해당 Pod를 자동으로 삭제하여
Deployment / ReplicaSet에 의해 Pod가 재생성되도록 유도하는
정책 기반(Self-Healing) 오퍼레이터입니다.

운영 환경에서 다음과 같은 상황을 해결하는 것을 목표로 합니다:

  • CPU 폭주로 인한 서비스 성능 저하
  • 비정상 Pod의 수동 재기동 반복
  • HPA만으로 해결하기 어려운 순간적 CPU 스파이크

🧠 아키텍처 개요

CpuReaperPolicy (Custom Resource)
        │
        ▼
CPU Reaper Controller
        │
        ├─ metrics.k8s.io (PodMetrics)
        │
        ├─ CPU 사용률 계산
        │
        ├─ 임계치 초과 여부 판단
        │
        └─ 임계치 초과 시 Pod 삭제
                    │
                    └─ Deployment / ReplicaSet에 의해 Pod 

⚙️ 동작 방식

사용자가 CpuReaperPolicy CR을 생성

Controller가 주기적으로 정책을 Reconcile

Label Selector에 매칭되는 Pod 목록 조회

metrics.k8s.io API를 통해 Pod CPU 사용량 조회

Pod의 CPU Limit(Request fallback) 대비 사용률 계산

임계치 초과 상태가 forSeconds 이상 지속되면 Pod 삭제

상위 컨트롤러(Deployment/RS)에 의해 Pod 자동 재생성

📦 필수 요구사항

Kubernetes v1.23+

metrics-server 설치 필수
(PodMetrics API 사용)

kubectl get apiservices | grep metrics.k8s.io


Go v1.21+ (개발 시)

Docker / Podman (이미지 빌드 시)

🧩 Custom Resource 정의 (CpuReaperPolicy)
apiVersion: reaper.cpu.limit.check/v1alpha1
kind: CpuReaperPolicy
metadata:
  name: cpu-reaper
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: stress
  thresholdPercent: 100        # CPU 사용률 %
  forSeconds: 30               # 초과 상태 유지 시간
  checkIntervalSeconds: 10     # 체크 주기

🔬 테스트용 CPU 부하 Deployment 예시
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"

🚀 설치 방법 (사용자 기준)
1⃣ CRD 설치
kubectl apply -f https://raw.githubusercontent.com/jominjun94/k8s-cpu-limit-check-operator/main/dist/install.yaml

2⃣ CpuReaperPolicy 생성
kubectl apply -f cpureaperpolicy.yaml

3⃣ 동작 확인
kubectl logs -n cpu-reaper-system deploy/cpu-reaper-operator-controller-manager

🐳 컨테이너 이미지
jominjun/cpu-reaper-operator:v0.1.0


Docker Hub 공개 이미지로 별도 인증 없이 Pull 가능

🧪 로컬 개발 모드
make install
make run

📈 향후 개선 예정

HPA 연동

CPU Throttling 기반 판단

Memory 정책 추가

Prometheus / Alertmanager 연계

Dry-Run 모드 지원

👨‍💻 작성자

GitHub: https://github.com/jominjun94

Project: https://github.com/jominjun94/k8s-cpu-limit-check-operator