26Y06p1

Young-Kyoo Kim·2026년 7월 6일

네, 당연히 가능합니다. 대규모 클러스터(1,000노드급) 환경에서 완료된 Pod와 Job의 흔적이 etcd에 수천 개씩 쌓이게 내버려 두면, 마스터 노드의 성능 저하(etcd 메모리 비대화 및 응답 지연)와 SRE 운영 오버헤드를 유발하는 주범이 됩니다.

현재 사용 중이신 쿠버네티스 최신 버전(v1.34+)에서는 이를 자동 회수(Garbage Collection)하기 위한 1) 개수 기반 한도 설정2) 시간 기반 TTL(Time-To-Live) 설정이라는 두 가지 강력한 내장 가드레일을 제공합니다.

CronJob 매니페스트에 이 두 가지 설정을 바인딩하여 무덤 파드(Completed/Failed)를 완벽하게 자동 청소하는 방법입니다.


방법 1. 시간 기반 자동 삭제: ttlSecondsAfterFinished (강력 추천)

작업이 성공(Success)했든 실패(Failed)했든, 완료 시점으로부터 정확히 '지정한 시간(초)'이 지나면 쿠버네티스 TTL 컨트롤러가 Job 오브젝트와 하방의 모든 Pod 실행 흔적을 통째로 클러스터에서 영구 삭제합니다.

  • 7일 보관 후 자동 삭제: 604800 (60초 × 60분 × 24시간 × 7일)
  • 3일 보관 후 자동 삭제: 259200 (60초 × 60분 × 24시간 × 3일)
  • 24시간 보관 후 자동 삭제: 86400

📄 CronJob 결합 적용 예시 (YAML)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: finops-analysis-pipeline-daily
  namespace: devops-finops
spec:
  schedule: "0 3 * * *"  # 매일 새벽 3시 가동
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      # ─── 🛡️ [시간 기반 가드레일] 작업 마감 후 정확히 3일(72시간) 뒤 자동 삭제 ───
      ttlSecondsAfterFinished: 259200
      
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: analyzer
            image: harbor.internal.zone/devops/finops-pipeline:v2
            # ... (이하 생략) ...

방법 2. 개수 기반 한도 제한: HistoryLimit (기본 필수 가드)

시간과 관계없이 "성공한 기록은 최신 N개만 남기고, 실패한 기록은 최신 M개만 유지하겠다"고 선언하는 방식입니다. CronJob 스펙의 루트 레벨에 선언하며, 개수를 초과하는 구세대 기록은 새로운 작업이 성공/실패하는 순간 순차적으로 밀려나며 자동 삭제됩니다.

  • successfulJobsHistoryLimit: 성공한 Job/Pod 보관 개수 (미설정 시 기본값은 3)
  • failedJobsHistoryLimit: 실패한 Job/Pod 보관 개수 (미설정 시 기본값은 1)

📄 CronJob 역사적 개수 제한 적용 예시 (YAML)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: finops-analysis-pipeline-weekly
  namespace: devops-finops
spec:
  schedule: "0 4 * * 7"  # 매주 일요일 새벽 4시 가동
  
  # ─── 🛡️ [개수 기반 가드레일] etcd 자원 보존을 위한 최신 이력 개수 제어 ───
  successfulJobsHistoryLimit: 2  # 성공한 리포트는 최신 2개 세트만 남기고 자동 삭제
  failedJobsHistoryLimit: 1      # 트래블슈팅을 위해 실패한 기록은 딱 1개만 보존
  
  jobTemplate:
    spec:
      template:
        spec:
          # ... (이하 생략) ...

💡 DevOps / SRE 관점의 프로덕션 가이드라인

  1. 두 가지 가드레일의 동시 결합 (Best Practice):
    가장 이상적인 구성은 방법 1(TTL)과 방법 2(HistoryLimit)를 동시에 선언하는 것입니다.
    이렇게 하면 일주일 동안 수십 번 성공하더라도 개수 제한(successfulJobsHistoryLimit: 2)에 의해 etcd가 항상 가볍게 유지되며, 혹시 모를 에러로 실패한 파드들은 개수 한도 내에서 딱 3일간(ttlSecondsAfterFinished: 259200)만 디버깅용으로 보존되다가 알아서 흔적이 지워집니다.
  2. 로그 유실 리스크 방어 (중요):
    ttlSecondsAfterFinished에 의해 Job과 Pod이 삭제되면, kubectl logs 명령어로 보던 해당 파드의 런타임 표준 출력 로그도 함께 증발합니다.
    따라서 이 정책을 켜기 전에, 노드마다 데몬셋으로 구동 중인 로그 수집기(Vector, Fluent-bit 등)가 해당 파드의 로그를 사내 중앙 로그 저장소(Elasticsearch, Loki 등)로 100% 긁어갔는지(Ingestion Completed) 수집 레이턴시를 감안하여 TTL 시간을 최소 1일(86400) 이상으로 여유 있게 잡아두는 것이 안전합니다.
  3. kubectl get pods 뷰의 무결성:
    이 설정을 심어두면 아침에 출근해서 kubectl get pods -n devops-finops를 쳤을 때 몇 주 전 완료된 수십 개의 Completed 좀비 파드 라인들을 일일이 수동으로 kubectl delete 치며 청소할 필요가 없어지므로, 모니터링 가시성이 획기적으로 개선됩니다.

0개의 댓글