Skip to content

Cloud Container Engineering

범수 edited this page Sep 12, 2026 · 1 revision

Cloud & Container Engineering

DBTower의 인프라 작업은 코드를 이미지로 만드는 데서 끝내지 않고, 생성·배포·관측·권한·데이터 수명주기를 하나의 운영 흐름으로 연결하는 것에 초점을 맞췄습니다.

한눈에 보기

영역 구현과 검증
CI 규약 검사, 전체 테스트, 역할별 Playwright E2E, E2E 미실행 방지 게이트
Release 테스트 후 Buildx로 amd64·arm64 이미지 빌드, SemVer 태그, GHCR 게시
Container 멀티스테이지 빌드, JRE 런타임, 비루트 UID 1001, Actuator HEALTHCHECK
Kubernetes kind에서 CloudNativePG CR -> Secret -> 등록 Job -> health up E2E
IaC Terraform RDS 모듈 validate, Ansible 계정 생성·멱등 등록 E2E
Observability Actuator, Prometheus, DB exporter, node_exporter, Grafana, 웹훅 경보
Reliability 대상별 풀 격리, 수집 샤딩, 분산 잠금, 공유 세션, 노드 장애 인수
Security 역할·팀 범위, 감사, AES-GCM, Vault 동적 계정, 비밀값 환경 주입

상황과 수치 중심의 상세 설명: Infrastructure Case Studies

CI/CD와 이미지 배포

Pull Request / main
  -> 규약 검사
  -> Playwright 설치
  -> 전체 테스트와 역할별 UI E2E
  -> 결과 XML에서 skipped=0 확인
  -> 실패 리포트 artifact

vX.Y.Z tag
  -> 전체 테스트
  -> QEMU + Buildx
  -> linux/amd64 + linux/arm64
  -> SemVer 태그로 GHCR 게시

테스트가 초록이어도 환경변수 누락으로 E2E가 조용히 건너뛸 수 있어, 결과 XML에서 실제 실행 여부를 별도로 검사합니다. Release는 packages: write 권한만 추가하고 태그나 수동 실행에서만 동작합니다.

CI workflow · Release workflow

컨테이너 운영 기준

  • 멀티스테이지 빌드로 Gradle과 JDK를 런타임에서 제거합니다.
  • eclipse-temurin:21-jre와 UID 1001 비루트 사용자로 실행합니다.
  • exec java ...로 JVM이 PID 1 신호를 직접 받습니다.
  • /actuator/health를 컨테이너 HEALTHCHECK로 사용합니다.
  • 앱은 메타 DB의 health condition 이후 기동합니다.
  • 메타 DB와 백업 산출물은 별도 볼륨에 보존합니다.
  • 서버와 클라이언트 버전 차이로 백업이 실패한 경험을 반영해 PostgreSQL 16 클라이언트를 고정했습니다.

Dockerfile · Compose

Kubernetes와 IaC

CloudNativePG Cluster CR
  -> Pod + Service + PVC + app Secret
  -> 등록 Job이 Secret을 읽음
  -> 멱등 PUT /api/instances
  -> DBTower health up

kind에서 Operator 설치부터 PostgreSQL 16.4 연결까지 E2E로 확인했습니다. VM 환경은 Ansible이 최소 권한 계정을 만들고 DBTower에 등록하며, 두 번째 실행에서 changed=0으로 수렴했습니다. AWS RDS는 Terraform/OpenTofu provider schema validate까지 수행했고 실제 apply는 하지 않았습니다.

Kubernetes · Terraform · Ansible

관측성과 장애 대응

Spring Actuator ----> Prometheus ----> Grafana
DB exporters -------/
node_exporter ------/

JVM·HTTP·HikariCP와 대상 DB·호스트 지표를 함께 수집합니다. 콘솔은 핵심 그래프를 제공하고 상세 분석은 Grafana에 위임합니다. 데이터가 없으면 값을 만들지 않고 미수집 사유를 표시합니다.

장애 분석에서는 스레드 덤프, Prometheus 메트릭, 대상 DB 원장, 소켓 재현 서버를 사용했습니다. 응답 없는 대상 하나가 전체 폴러를 막은 문제는 25초 초과 -> 약 2초로 줄이고 회귀 테스트로 고정했습니다.

운영 안정성과 수명주기

문제 조치 결과
앱 노드 증가 시 단일 수집 락 샤드별 분산 잠금과 자동 인수 A 종료 후 B가 4개 샤드 인수
스냅샷 200만 행 보존 정리 월별 RANGE 파티션과 DROP 1,879.9 ms -> 12.8 ms
격리 대상의 유휴 커넥션 minimumIdle=0, 풀 LRU 제거, 폴링 중단 대상 연결 1 -> 0
정적 DB 자격증명 Vault TTL 계정과 리스 80% 선제 갱신 새 계정·풀 교체·기존 계정 소멸 확인
로컬 백업만 존재 복원 검증, AES-GCM, S3 호환 원격 보관 MinIO 업로드 경로 실측

보안과 접근 제어

  • 사람을 5개 역할로 나누고 승인자와 실행자를 분리합니다.
  • 팀 범위 밖 인스턴스는 404로 존재를 숨깁니다.
  • 로그인, 상태 변경, 권한 거부를 감사 로그에 남깁니다.
  • 운영 암호화 키가 없으면 애플리케이션 기동을 거부합니다.
  • 비밀번호와 토큰은 환경변수·Secret으로 주입하고 외부 명령 argv에 넣지 않습니다.
  • Vault database secrets engine으로 수명 있는 DB 계정을 발급합니다.

Linux·네트워크·자동화

  • Ubuntu GitHub Actions 러너와 JRE 기반 Linux 컨테이너에서 빌드·테스트·실행합니다.
  • check-conventions.sh는 저장소 규칙을 빠르게 실패시키고, dbtower-mcp.sh는 stdio 서버 실행 환경을 정규화합니다.
  • Docker·kubectl·curl·openssl과 프로세스·포트·로그·헬스 엔드포인트를 이용해 재현 절차를 작성했습니다.
  • JDBC 연결 획득, 드라이버 로그인, 쿼리, 외부 AI 호출의 timeout을 같은 값으로 뭉치지 않고 단계별로 둡니다.
  • 관리 대상 TLS는 JVM truststore 검증을 사용하며 검증 해제 옵션을 제공하지 않습니다.
  • HTTPS 리버스 프록시 뒤에서는 forwarded header와 Secure 세션·CSRF 쿠키를 사용합니다.

경험의 접점과 차이

채용 기술 이 프로젝트의 근거 차이
Jenkins CI/CD GitHub Actions 단계·게이트·artifact·태그 릴리스 Jenkins 자체는 미사용
ArgoCD·무중단 배포 선언형 K8s CR, health, 버전 이미지, 2노드 페일오버 ArgoCD·Canary·Blue/Green 미구현
AWS Terraform RDS, AWS SDK CloudWatch, S3 호환 백업 RDS apply와 실제 CloudWatch E2E 미실행
Kubernetes·OpenShift kind + CloudNativePG E2E, Secret, Job, PVC OpenShift 미사용, 앱 Deployment 미작성
IAM·VPC·WAF·RBAC 앱 역할·팀 범위, OAuth, Vault, Secret 주입 클라우드 IAM·네트워크 정책과 K8s RBAC 미구현
Python·Shell Python NL2SQL 평가, Shell 규약·실행 스크립트, Ansible Python 기반 운영 플랫폼은 아님
비용 최적화 DB 인덱스 낭비, 연결 낭비, 디스크 ETA AWS Cost Explorer 기반 분석은 아님

특정 도구 이름을 사용한 것처럼 꾸미지 않고, 파이프라인의 실패 조건, 멱등성, 비밀과 권한, 관측 가능성, 검증 범위를 기술적으로 설명할 수 있는 경험을 보여줍니다.

Clone this wiki locally