26Y19c4

Young-Kyoo Kim·7일 전

생산 환경(K8s)에서 이 실시간 에이전트를 안정적으로 구동하기 위해서는 단독 Pod보다는 자가 치유(Self-healing)와 롤링 업데이트가 보장되는 Deployment로 띄우는 것이 정석입니다.

특히 스크립트 내부에서 K8s API를 호출해 장애 포트의 로그 백로그(Tail)를 읽어오는 로직이 있으므로, 포드가 로그를 읽을 수 있도록 권한을 부여하는 RBAC(ServiceAccount, Role, RoleBinding) 설정까지 한 번에 묶어서 배포해야 크래시가 나지 않습니다.

컨테이너화부터 K8s 완전 배포까지의 올인원 패키지 아키텍처 명세입니다.


🐋 1. 컨테이너 이미지 빌드를 위한 Dockerfile

스크립트와 동일한 위치에 Dockerfile을 생성하고 아래 내용을 저장합니다. 이미지 레이어 최적화를 위해 경량화 버전인 slim 이미지를 베이스로 삼습니다.

FROM python:3.11-slim

WORKDIR /app

# 부하가 큰 Polars 및 FastAPI 고속 캐시 설치
RUN pip install --no-cache-dir fastapi uvicorn polars requests

# 에이전트 핵심 파일 복사
COPY sre_jit_rca_agent.py /app/sre_jit_rca_agent.py

# FastAPI 기본 포트 개방
EXPOSE 8080

# Uvicorn 비동기 WAS 엔진 가동
CMD ["uvicorn", "sre_jit_rca_agent:app", "--host", "0.0.0.0", "--port", "8080"]

💡 이미지 빌드 및 푸시 명령어 가이드:

docker build -t your-registry.internal.zone/monitoring/sre-jit-agent:v1.0 .
docker push your-registry.internal.zone/monitoring/sre-jit-agent:v1.0

☸️ 2. K8s 통합 배포 매니페스트 (sre-jit-agent-manifest.yaml)

RBAC 권한 부여, Deployment 사양, 그리고 이전에 설계한 ClusterIP Service까지 완벽하게 정렬한 단일 파일 통합본입니다. 사내 인프라 환경에 맞춰 환경변수(value) 영역만 수정하여 사용하시면 됩니다.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: sre-jit-agent-sa
  namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: sre-jit-log-reader
  namespace: monitoring
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"] # ◀ 포드의 실시간 로그 덤프를 긁어오기 위한 필수 핵심 권한
  verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: sre-jit-agent-rbac-binding
  namespace: monitoring
subjects:
- kind: ServiceAccount
  name: sre-jit-agent-sa
  namespace: monitoring
roleRef:
  kind: Role
  name: sre-jit-log-reader
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sre-jit-rca-agent
  namespace: monitoring
  labels:
    app: sre-jit-rca-agent
spec:
  replicas: 1 # 실시간 정황 조율 에이전트이므로 1개 파티션으로 동기화 유지
  selector:
    matchLabels:
      app: sre-jit-rca-agent
  template:
    metadata:
      labels:
        app: sre-jit-rca-agent
    spec:
      serviceAccountName: sre-jit-agent-sa # 위에서 생성한 권한 컴포넌트 결착
      containers:
      - name: agent-core
        image: your-registry.internal.zone/monitoring/sre-jit-agent:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: http-port
        env:
        # ─── ⚙️ 사내 데이터 레이크하우스 토폴로지 맞춤형 환경변수 ───
        - name: THANOS_QUERY_URL
          value: "http://thanos-querier.monitoring.svc:9090"
        - name: INTERNAL_LLM_API_KEY
          value: "sk-company-sre-brain-token-xxxxxx"
        - name: SLACK_WEBHOOK_URL
          value: "https://hooks.slack.com/services/T00/B00/X00"
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "1000m"
            memory: "512Mi" # Polars 메모리 연산 버퍼를 감안한 넉넉한 쿼터 제공
---
apiVersion: v1
kind: Service
metadata:
  name: sre-jit-agent
  namespace: monitoring
spec:
  selector:
    app: sre-jit-rca-agent
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
  type: ClusterIP

🛠️ 3. 클러스터 배포 및 정상 가동 팩트 체크

작성된 통합 매니페스트를 클러스터에 적용하고 런타임 상태를 모니터링합니다.

# 1. 아키텍처 전반 레이어 일괄 배포 구동
kubectl apply -f sre-jit-agent-manifest.yaml

# 2. 포드 기동 상태 및 이벤트 트레이스 체크
kubectl get pod -n monitoring -l app=sre-jit-rca-agent

# 3. 인프라 실시간 내부 로그 테일링 (Uvicorn 바인딩 상태 확인)
kubectl logs -f -n monitoring -l app=sre-jit-rca-agent

위 셋업이 끝나면 [http://sre-jit-agent.monitoring.svc.cluster.local:8080/alert-webhook](http://sre-jit-agent.monitoring.svc.cluster.local:8080/alert-webhook) 수신 주소가 클러스터 내부 네트워킹에 완벽히 바인딩됩니다. 이제 Alertmanager 경보가 터질 때마다 이 포드가 권한 위반(403 Forbidden) 에러 없이 타겟 포드의 로그와 메트릭을 순식간에 수집하여 사내 LLM으로 온디맨드 추론을 수행하게 됩니다.

0개의 댓글