임시 요구사항(특정 기간 조회, 특정 클러스터 유형 격리 정산 등)을 현업의 요청이 있을 때마다 배치 코드 수정 없이 온디맨드로 즉시 가동(Ad-hoc 실행)할 수 있는 두 가지 실행 표준 가이드입니다.
쿠버네티스(Kubernetes) 환경의 특성을 살려 1) 쉘 스크립트의 환경변수 자동 매핑 최적화와 2) K8s 일회성 작업 객체(One-shot Job)를 활용한 마스터 실행법을 제시합니다.
run_pipeline.sh 개정)임시 기동 시 파라미터가 유연하게 하방 스크립트(step1, 2, 3, 6)로 전달되도록 run_pipeline.sh를 환경변수 인지형(Env-Aware) 구조로 변경합니다. 이 스크립트 하나로 일배치와 임시 조회를 모두 커버할 수 있습니다.
#!/bin/bash
# run_pipeline.sh (최종 통합 범용 버전)
set -e
echo "=== [FinOps 데이터 레이크하우스 파이프라인 엔진 기동] ==="
# ── ⏱️ 1. 기간 파라미터 동적 조율 ──
# 환경변수가 지정되지 않았다면 기본값으로 자동 세팅
STEP=${STEP:-"1m"}
CLUSTER_TYPE=${CLUSTER_TYPE:-"ALL"}
ARGS_STEP1=""
ARGS_STEP2=""
if [ ! -z "$START_DATE" ] && [ ! -z "$END_DATE" ]; then
echo "📅 [절대 범위 모드] KST $START_DATE ~ $END_DATE 정산 예정"
ARGS_STEP1="--start-date $START_DATE --end-date $END_DATE --step $STEP"
ARGS_STEP2="--start-date $START_DATE --end-date $END_DATE"
elif [ ! -z "$DAYS" ]; then
echo "📅 [상대 범위 모드] 최근 $DAYS일치 데이터 정산 예정"
ARGS_STEP1="--days $DAYS --step $STEP"
ARGS_STEP2="--days $DAYS"
else
echo "📅 [데일리 일배치 모드] 전일 24시간 자동 징수 및 마감 정산"
ARGS_STEP1="--days 1 --step $STEP"
# step2에 아무 인자도 안 주면 코드가 자동으로 어제 자정 윈도우 계산
ARGS_STEP2=""
fi
# ── 🌐 2. 클러스터 격리 파라미터 조율 ──
if [ ! -z "$CLUSTER_NAME" ]; then
echo "🌐 [인프라 격리] 특정 클러스터 단독 정산: $CLUSTER_NAME"
ARGS_STEP2="$ARGS_STEP2 --cluster $CLUSTER_NAME"
else
echo "🌐 [인프라 격리] 클러스터 유형 도메인 필터: $CLUSTER_TYPE"
ARGS_STEP2="$ARGS_STEP2 --cluster-type $CLUSTER_TYPE"
fi
# ── 🚀 3. 파이프라인 순차 집행 ──
# 💡 팁: 만약 과거 데이터를 타노스에서 다시 긁을 필요가 없고 MinIO 레이크에 이미 데이터가 100% 채워져 있다면
# 환경변수로 SKIP_STEP1=true 를 주어 타노스 징수 단계를 패스할 수 있습니다.
if [ "$SKIP_STEP1" = "true" ]; then
echo "⏭️ [SKIP] Thanos 원천 징수를 건너뛰고 MinIO 레이크하우스 데이터만 재처리합니다."
else
echo "▶️ [1/4] step1_prom_fetch.py 가동 규칙: $ARGS_STEP1"
python step1_prom_fetch.py $ARGS_STEP1
fi
echo "▶️ [2/4] step2_pipeline.py 가동 규칙: $ARGS_STEP2"
python step2_pipeline.py $ARGS_STEP2
echo "▶️ [3/4] step3_analytics.py 추이 장표 드로잉 중..."
python step3_analytics.py
echo "▶️ [4/4] step6_excel_builder.py 성적표 빌드 및 MinIO 최종 배포 중..."
python step6_excel_builder.py
echo "🎉 === [FinOps 프로세스 가동 성공 종료] ==="
일일 새벽 스케줄러(CronJob)와 별개로, 현업의 임시 요청이 올 때마다 YAML의 env 설정만 바꿔서 kubectl apply로 쏘는 일회성 정산 포드(Job) 구성안입니다. PVC가 없는 emptyDir: {} 구조이므로 여러 개를 동시에 띄워도 클러스터 디스크에 영향이 없습니다.
finops-adhoc-compute-range.yamlapiVersion: batch/v1
kind: Job
metadata:
name: finops-adhoc-compute-june
namespace: infrastructure-system
spec:
ttlSecondsAfterFinished: 3600 # 작업 종료 1시간 후 K8s가 포드 로그를 자동 청소
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
containers:
- name: analyzer
image: registry.internal.zone/finops/infrastructure-analyzer:v1.1.0
# ── 💡 [핵심] 임시 기동 조건 환경변수 주입 구역 ──
env:
- name: START_DATE
value: "2026-06-01"
- name: END_DATE
value: "2026-06-07"
- name: CLUSTER_TYPE
value: "COMPUTE" # 스토리지 노드는 메모리 상방에서 전수 필터 드롭
- name: SKIP_STEP1
value: "false" # 해당 과거 기간 데이터가 MinIO에 없을지 모르니 Thanos에서 징수 동행
# 사내 인프라 코어 접속 정보 (동일 유지)
- name: THANOS_QUERY_URL
value: "http://thanos-query.internal.zone:9090"
- name: MINIO_ENDPOINT
value: "http://minio-service.storage-system.svc.cluster.local:9000"
- name: MINIO_BUCKET_NAME
value: "enterprise-finops-raw-lake"
- name: MINIO_ACCESS_KEY
valueFrom:
secretKeyRef:
name: minio-aistor-secret
key: accesskey
- name: MINIO_SECRET_KEY
valueFrom:
secretKeyRef:
name: minio-aistor-secret
key: secretkey
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
volumeMounts:
- name: workspace
mountPath: /app/data
restartPolicy: Never
volumes:
- name: workspace
emptyDir: {}
kubectl apply -f finops-adhoc-compute-range.yaml
# ➡️ 생성되는 파일명: finops_report_compute_2026-06-01_to_2026-06-07.xlsx
finops-adhoc-storage-7d.yamlprod-storage-cluster 단독 인프라 정산 리포트 추출apiVersion: batch/v1
kind: Job
metadata:
name: finops-adhoc-storage-weekly
namespace: infrastructure-system
spec:
ttlSecondsAfterFinished: 3600
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
containers:
- name: analyzer
image: registry.internal.zone/finops/infrastructure-analyzer:v1.1.0
env:
# ── 💡 최근 7일치 스캔 및 특정 스토리지 클러스터 실명 타겟팅 주입 ──
- name: DAYS
value: "7"
- name: CLUSTER_NAME
value: "prod-storage-cluster"
- name: SKIP_STEP1
value: "true" # 매일 새벽 배치로 MinIO 레이크에 데이터가 이미 차있으므로 타노스 스킵 (초고속 모드)
- name: THANOS_QUERY_URL
value: "http://thanos-query.internal.zone:9090"
- name: MINIO_ENDPOINT
value: "http://minio-service.storage-system.svc.cluster.local:9000"
- name: MINIO_BUCKET_NAME
value: "enterprise-finops-raw-lake"
- name: MINIO_ACCESS_KEY
valueFrom:
secretKeyRef:
name: minio-aistor-secret
key: accesskey
- name: MINIO_SECRET_KEY
valueFrom:
secretKeyRef:
name: minio-aistor-secret
key: secretkey
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
volumeMounts:
- name: workspace
mountPath: /app/data
restartPolicy: Never
volumes:
- name: workspace
emptyDir: {}
kubectl apply -f finops-adhoc-storage-7d.yaml
# ➡️ 생성되는 파일명: finops_report_prod-storage-cluster_recent_7days.xlsx
Ad-hoc Job을 실행한 후 배치가 정상적으로 동작하고 완료되었는지 확인하는 인프라 리드 명령어 트랙입니다.
# 1. 포드 기동 상태 및 어느 워커 노드에 할당되었는지 실시간 트래킹
kubectl get pods -n infrastructure-system -l job-name=finops-adhoc-storage-weekly -w
# 2. 내부 파이썬 판독 로그 및 MinIO 최종 전수 완료 메시지 실시간 스트리밍 확인
kubectl logs -n infrastructure-system -l job-name=finops-adhoc-storage-weekly -f
# 3. 작업이 정상 종료(Completed)되었는지 총괄 확인
kubectl get job -n infrastructure-system finops-adhoc-storage-weekly
작업이 종료되면 코드가 알아서 MinIO AIStor의 reports/ 버킷 내부 경로에 고유한 접미사가 붙은 엑셀 원부를 드랍하므로, 인프라팀은 웹 콘솔에서 해당 주소만 다운로드 받아 요청 부서에 즉각 메일로 회신해 줄 수 있는 완벽한 온디맨드 운영 체계가 정립됩니다.