고가용성 · SLA · 클러스터링 · 용량 산정 · 관찰성 3대 축 · 장애 대응 · IaC · SRE
강사 박수현 · 🚀 젠아이랩스(GenAI Labs)
🎨 이미지 프롬프트: "Editorial wide shot — a focused Korean SRE engineer (30s, hoodie + glasses) seated in a dim NOC room at NHN TCC1 IDC Pangyo facing a wide curved 49-inch monitor wall; the monitor wall shows three side-by-side dashboards: left dashboard 'Grafana 11.x — SLO Overview' with green/teal availability gauges '99.99% (Error Budget 21min left, 28d window)' and four SLI tiles 'Availability 99.991% · Latency p95 412ms · Error rate 0.06% · MTTR P50 12min', middle dashboard 'Datadog Service Map' with hexagonal nodes (api-gateway → payment-svc → postgres-primary) latency color-coded yellow/red and stacked metrics charts (CPU 68% · Memory 75% · Disk IOPS 42K · Network 18Gbps), right dashboard 'Jaeger 1.6 trace timeline' with a distributed-trace flame graph (12 spans, root span 1.8s, slowest child span 'pg-query SELECT orders' 1.4s highlighted red) and a red Alertmanager banner 'PROD-DB-01 DiskFull · severity=critical · pcs status: db-cluster DEGRADED'; behind the engineer two 42U server racks (Dell PowerEdge R760 + HPE ProLiant DL380 Gen11) with status LEDs and a faint world map showing two DR sites (서울 본사 ↔ 천안 DR, 142km NetApp MetroCluster IP sync arc) connected by a glowing teal arc labeled 'RPO 0 · RTO 4min'; on the desk a coffee mug, a Pacemaker/Corosync RHEL 9.4 cheatsheet card, and a PagerDuty mobile alert glow; soft cinematic lighting, dark navy background with teal #00b894 and purple #6c5ce7 accents, calm focused atmosphere, 16:9"
2021.10.25 (월)
야간 승인 작업을 주간에 진행하던 중 라우팅 명령어 한 단어 누락 → 전국 89분 인터넷 마비. 결제·증권 HTS·POS 동시 정지.
💡 교훈 — 변경관리 SOP(CR·CAB·승인 윈도우)·작업관리자 의무·BGP 라우팅 격리 시험
참고: 과기정통부 「KT 네트워크 장애 원인분석」 보도자료
2023.01.29 / 1~2월
1.29 새벽·오후 3회·총 63분 인터넷 마비 (DDoS). 별건으로 1월 29만 명 가입자 정보 다크웹 유출 — 18만 명 현행, 11만 명은 해지 고객 보관 데이터.
💡 교훈 — DDoS 방어(BGP Blackhole·세션 외부화)·관찰성(NW 알람)·개인정보 보존 정책·해지 데이터 격리
참고: 정책브리핑 「LGU+ 고객정보 유출·디도스 원인분석」
2024.04~05
납세증명서 서식 변경 시 소스코드 수정 후 핵심 테스트 누락 → 교육증명서·납세증명서 발급 시 타인 정보 1,233건 노출. 한 달간 미공개로 추가 비판.
💡 교훈 — CI/CD 회귀 테스트·캐시·세션 격리·변경 후 모니터링·장애 보고 SOP(공개 의무)
참고: 경향신문 「정부24서 1200건 문서 오발급」
📌 이번 세션의 시각 — 위 3건은 「변경관리 SOP 부재」「관찰성·격리 부족」「테스트·자동화 누락」. 본 세션의 HA 패턴·SLA·용량 산정·관찰성·장애 5종·IaC가 직접 해법.

Day 2 · TA의 운영 종합 세션
TA는 멈추지 않게(HA) · 감당하게(용량) · 보이게(관찰성) · 회복하게(장애 대응) · 반복 가능하게(자동화) 만든다. 다섯 축은 따로가 아니라 한 묶음의 운영 시스템.
무중단 서비스 = SLA로 정의한 가용성 목표 + HA 패턴으로 구현한 이중화 구조.
HA는 "장비를 더 사는 것"이 아니라 "장애를 견디는 구조를 설계하는 것" — 가장 약한 고리가 전체를 결정한다.
| 패턴 | 구성 | 자원 효율 | 비용 | 가용성 | 적합 |
|---|---|---|---|---|---|
| N+1 | N대 운영 + 1대 예비 | 높음 (N/(N+1)) | 낮음 | 중간 (단일 노드 장애만) | VMware HA·K8s 클러스터 |
| N+M | N대 운영 + M대 예비 | 높음 | 중간 | 높음 (M개 동시 장애) | 대규모 클러스터·HPC |
| 2N (Active-Standby) | 1:1 페어 (전체 이중화) | 50% (유휴) | 중간 | 높음 | DB Standby·FW HA·전원 A/B |
| 2N+1 | 2N + 1대 예비 | 낮음 | 높음 | 최고 | 통신 코어·미션 크리티컬 |
| Active-Active | 양쪽 모두 운영, 부하 분산 | 최고 | 중간 | 매우 높음 | Web·WAS·NoSQL·Geo |
선택 기준: 자원 효율(N+1) ↔ 가용성(2N+1) 사이의 트레이드오프. TA는 시스템 등급(BIA) × 라이센스 비용 × 운영 복잡도 3축으로 결정한다.

HA 패턴 다이어그램 (삽화)
TA의 결정 규칙: 무상태(Web·API) → A/A 우선. 상태 보유(DB·MQ·파일) → A/S 우선. 단, 읽기 부하가 큰 DB는 Read Replica 패턴으로 A/A 흉내 가능.
📚 Multi-Site 패턴 본문(Cold DR · Pilot Light · Warm · Hot) 은 Session 6
## DR 5단계참조 — RTO/RPO·비용 표와 등급별 채택 패턴 포함.
| 가용성 | 9 개수 | 연간 다운 | 월간 다운 | 주간 다운 | 일일 다운 | 적용 영역 |
|---|---|---|---|---|---|---|
| 99% | 2 nines | 3.65일 | 7.2시간 | 1.68시간 | 14.4분 | 내부 위키·테스트 |
| 99.9% | 3 nines | 8.76시간 | 43.8분 | 10.1분 | 1.44분 | 일반 업무·중소 SaaS |
| 99.95% | 3.5 nines | 4.38시간 | 21.9분 | 5.04분 | 43.2초 | 중간급 SaaS |
| 99.99% | 4 nines | 52.6분 | 4.38분 | 1.01분 | 8.64초 | 금융·결제·코어 업무 |
| 99.999% | 5 nines | 5.26분 | 26.3초 | 6.05초 | 0.86초 | 통신·119·112 |
| 99.9999% | 6 nines | 31.5초 | 2.63초 | 0.6초 | 0.09초 | 군사·우주·비현실 |
환산 공식: 연간 다운(초) = 31,536,000 × (1 - 가용성). 이 표는 TA가 외워야 하는 핵심.

SLA 등급 차트 (삽화)
결정 입력값: 시스템 등급(BIA) · 상태 보유 여부 · 라이센스 비용 · 운영 인력 · DR 거리 — 5개를 항상 함께 본다.
"감으로 사이징"이 아니라 공식 + 가정값 + 마진의 조합.

용량 산정 흐름 (삽화)
| 시스템 유형 | 사고시간(Think Time) | 사용자당 TPS |
|---|---|---|
| 일반 업무·인트라넷 | 30~60초 | 0.02~0.03 |
| 포털·게시판 | 10~30초 | 0.03~0.1 |
| 이커머스·금융 | 5~15초 | 0.07~0.2 |
| 게임·실시간 | 1~5초 | 0.2~1.0 |
| 결제·인증 API | 즉시 | 1+ |
TA의 관행: 평균 산정 후 피크 ×3배 마진 + HA 절체 마진 +50% = 안전한 사이징.
| 트랜잭션 유형 | CPU ms |
|---|---|
| 단순 조회 (SELECT) | 5~20ms |
| 일반 업무 트랜잭션 | 20~50ms |
| 복잡한 보고서·집계 | 100~500ms |
| 결제·인증 (암호화 포함) | 50~200ms |
| 배치·ETL | 초~분 |
라이센스가 SKU를 결정 — Oracle DB EE·MS SQL EE·VMware vCF가 모두 Per-Core 라이센스라, 같은 성능이면 코어 수가 적고 클럭이 높은 SKU (예: Xeon Gold 6444Y 16C @ 4.0 GHz)가 라이센스비를 수억 원 단위로 줄인다. 산정 6단계 ⑤에서 SKU가 뒤집히는 사례 잦음 — 자세한 라이센스 비교는 Session 3 ## CPU 산정 (라이센스) 참조.
격언: "DB는 메모리가 곧 성능" — RAM 부족하면 SAN 성능 무관하게 응답 지연.
| 매체 | Random R IOPS | Latency |
|---|---|---|
| HDD 7.2K SATA | 75~100 | 8~12ms |
| HDD 10K SAS | 130~150 | 4~7ms |
| HDD 15K SAS | 175~200 | 3~5ms |
| SSD SATA | 50,000~100K | 0.1~0.5ms |
| SSD SAS | 100K~200K | 0.1ms |
| NVMe Gen 4 | 500K~1M | <0.1ms |
| NVMe Gen 5 | 1M~3M | <0.05ms |
산정은 가정 + 공식 + 실측 검증. 부하 테스트 도구 없이 산정은 추측에 불과.
모니터링은 "정해진 것을 본다", 관찰성은 "모르는 것을 캐낼 수 있다".
관찰성은 모니터링의 상위 개념 — 모니터링이 가능한 시스템 + 임의 질문에 답할 수 있는 시스템.

관찰성 3대 축 (삽화)
3축 협업 예: Metrics 알람("응답시간 급증") → Logs 검색("어떤 요청이?") → Traces 분석("어디서 지연?")
🎨 이미지 프롬프트: "Editorial side-by-side dashboard mockup illustration on dark navy background — left half labeled 'Zabbix 7.0 LTS Dashboard (Global view)' showing the classic Zabbix UI with a left-side host tree expanded ('Templates / Linux by Zabbix agent / Apache by HTTP / PostgreSQL 16 by Zabbix agent' with 187 hosts), top-center search bar and a tab strip 'Global view · Geomap · System status', main area shows a 'Problems' table with severity colors (Disaster red 'pg-prod-01: replication lag > 60s', High orange 'web-04: filesystem /var > 90%', Average yellow 'lb-01: CPU > 70%', Warning teal, Info blue), four small graphs in a 2x2 grid: CPU 'avg(system.cpu.util) 5m' / Memory 'vm.memory.util' / Disk 'vfs.fs.size /var pused' / Network 'net.if.in eth0' with multi-host series, footer '4,217 items polled · 187 hosts · Zabbix server 7.0.4'; right half labeled 'Nagios XI 2024 Dashboard' showing the green/red service status grid with host names (db-prod-01, db-prod-02, web-01..web-08, lb-prod-01) and check states columns 'PING/HTTP/SSH/Disk/Load' (OK green / WARNING yellow / CRITICAL red), a hosts up/down donut chart top-right '184 UP · 2 DOWN · 1 PENDING', a tactical overview strip 'Outages 2 · Unhandled Problems 5 · Acknowledged 3', a small SNMP trap log strip; thin teal vertical divider; clean editorial UI mockup style, teal #00b894 and purple #6c5ce7 accents, 16:9"
📸 NMS 대시보드 reference - Zabbix 공식 데모 — zabbix.com/demo - Nagios XI Dashboard — nagios.com/products/nagios-xi - SolarWinds NPM 스크린샷 — solarwinds.com/network-performance-monitor - PRTG 데모 — paessler.com/prtg/demo - ManageEngine OpManager — manageengine.com/network-monitoring

NMS — Network Management System 카탈로그
🎨 이미지 프롬프트: "Editorial APM console mockup illustration on dark navy background — left half labeled 'Pinpoint 3.x APM (Naver, oss)' showing the signature transaction servermap (Service Tree) with circular service nodes labeled 'USER → NGINX-LB → tomcat-web (Tomcat 10.1) → was-api (Spring Boot 3.3) → postgres-primary (PG16) → External Pay API (KG이니시스)', nodes connected by directional arrows with TPS/avg-elapsed labels ('1,245 TPS / 412ms', '980 TPS / 380ms'), node sizes proportional to traffic and a red border + warning triangle on the slow
postgres-primarynode showing 'Slow query rate 8.2%'; below it a scatter chart of response times (x=last 5min, y=elapsed ms 0~5000) with thousands of green dots and several red dots clustered around 3,500ms marking slow transactions, side panel 'Real-time Active Thread 23 · TPS 1,245 · Heap 6.4/8.0 GB · Old GC 187ms'; right half labeled 'Scouter Suite 2.x APM (LG CNS, oss) + Jennifer 6 sidebar' showing a real-time XLog scatter chart (x=time, y=elapsed ms 0~10s) with thousands of green dots and a few red outliers clustered at 6s, plus a top metric bar 'TPS 423 · Active 17 · Heap 64% · CPU 58% · GC count 12/min · DB Pool 87%', a small lower panel 'Stack Sample of slowest TX (Thread-42): java.sql.PreparedStatement.executeQuery() at OrderRepository.findRecent() 4,823ms', a Jennifer 6 X-View 비교 strip on the right showing same workload but on Jennifer console; clean editorial UI mockup style, teal #00b894 and purple #6c5ce7 accents, 16:9"
📸 APM 콘솔 reference - Pinpoint (Naver) — github.com/pinpoint-apm/pinpoint (스크린샷 풍부) - Scouter (LG CNS) — github.com/scouter-project/scouter - Jennifer (제니퍼소프트) — jennifersoft.com - Datadog APM Service Map — docs.datadoghq.com/tracing/services/service_map - Dynatrace Smartscape — dynatrace.com/platform

APM — Application Performance Monitoring
2026 추세: 비용 부담 큰 ELK·Splunk → Loki + Grafana 또는 Vector + ClickHouse 이전.
🎨 이미지 프롬프트: "Editorial log-tool dashboard mockup illustration on dark navy background — left half labeled 'Splunk Enterprise 9.x — Search & Reporting' showing a dark-theme SPL search bar with full query
index=web sourcetype=access_combined status>=500 earliest=-1h | stats count by host status | sort -countand the time-picker 'Last 60 minutes', below a results table (rows: web-04 / 500 / 4,182 · web-07 / 502 / 1,247 · web-04 / 504 / 318) + a bar chart of error counts by host with web-04 spiking, sidebar shows 'Selected Fields: host, status, uri_path, response_time, useragent' and 'Interesting Fields: src_ip, bytes', top-right indexed volume meter '420 GB/day · 18 days retention' and a small Splunk green-orange logo; bottom strip a hand-typedlogcli query '{job=\"postgres\"} |= \"ERROR\" |= \"deadlock\"' --since=1h --limit=200(Grafana Loki CLI) showing matched lines stream; right half labeled 'Kibana 8.x Discover (Elastic Stack 8.x ELK)' showing the green-on-dark Kibana interface with a left field-list panel (host, agent, status, response_time, kubernetes.pod_name, trace.id) and a right hits panel listing 5xx errors with JSON expansion (timestamp, _source, http.response.status_code: 503, error.message: 'upstream connect timeout', service.name: 'payment-svc', trace.id: 'a3f...'), top KQL barhttp.response.status_code >= 500 and kubernetes.namespace : \"prod\", top-right histogram of hits per 1m over last 60m with a tall red spike at -12min; clean editorial UI mockup style, teal #00b894 and purple #6c5ce7 accents, 16:9"
📸 로그 통합 콘솔 reference - Splunk Search & Reporting — splunk.com/en_us/products/splunk-enterprise.html - Kibana Discover — elastic.co/kibana - Grafana Loki + Explore — grafana.com/oss/loki - Graylog — graylog.org - Datadog Logs Explorer — docs.datadoghq.com/logs

로그 통합 — ELK · Splunk · Loki · Fluentd
🎨 이미지 프롬프트: "Editorial Grafana 11.x dashboard mockup illustration on dark navy background — full-screen Grafana 'Node Exporter Full (rev 39)' dashboard layout with 8 panels arranged in a 4x2 grid, top time-picker 'Last 6 hours · refresh 30s', datasource 'Prometheus 2.55 (Thanos sidecar)', variable dropdown 'job=node · instance=db-prod-01..db-prod-03' visible: top row 'CPU Usage % (stacked area chart, multi-host, PromQL
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100), current 68%, 70% margin line drawn)', 'Memory Used / Free (gauge + line, 75% margin line, current 62/96 GB)', 'Disk I/O Read/Write MB/s (line, sda 412/187, nvme0n1 1,820/940)', 'Network bps in/out (line, 8.2/3.1 Gbps with 70% margin line on 10Gbps NIC)'; bottom row 'Disk Usage by mountpoint (table with progress bars: / 42% · /var 78% near 80% margin · /pgdata 64% · /backup 51%)', 'Load Average 1/5/15 (line, 12.4/11.8/10.2 on 32-core host)', 'Filesystem Inode Usage (percent bars per mount)', 'Top Processes by CPU (table: postgres 18.2% · patroni 4.1% · node_exporter 0.4% · prometheus 0.2%)'; top-right shows a red 'Alerting' badge with 2 firing alerts 'HighCPUUsage db-prod-01 for 7m', 'DiskFull /var web-04 for 12m'; left sidebar shows the Grafana orange-flower logo, folder tree 'Observability / Infra / Node Exporter Full · DB · K8s · LB · App'; bottom strip CLI overlaypromtool check rules /etc/prometheus/alerts.yml'SUCCESS: 47 rules found' andpromtool query instant http://localhost:9090 'rate(node_cpu_seconds_total[5m])'; clean editorial UI mockup style, teal #00b894 and purple #6c5ce7 accents, 16:9"
🎨 이미지 프롬프트: "Editorial console mockup illustration on dark navy background — top half labeled 'Prometheus Alertmanager 0.27 UI (Alerts view)' showing the silenced/active alerts list grouped by route, with group labels chips (
job=node,severity=critical,cluster=prod-seoul,team=infra), filter pills at top 'severity!=info team=infra', three currently firing alert cards 'HighCPUUsage instance=db-prod-01 (firing 7m, value 92%)', 'DiskFull instance=web-04 mountpoint=/var (firing 12m, value 94%)', 'ServiceDown job=patroni-exporter instance=pg-03 (firing 2m)', each with 'Silence' / 'Inhibit' / 'Source' buttons, left nav 'Alerts · Silences · Status · Inhibitions', top-rightReload Configbutton; bottom half labeled 'PagerDuty Incident View (PD Modern UI)' showing a red P1 incident card 'INC-4823 · PROD-DB-01 DiskFull · /var 94% · Triggered 18:42 KST' with timeline events 'Triggered (Alertmanager webhook) 18:42 → Acknowledged by 박수현 18:44 → Note: log rotate 수동 실행 18:46 → Escalated to 이지훈 (escalation policy: Infra L2 → L3) 18:52 → Resolved 19:03', responder avatars on a side panel, on-call schedule strip on the right with rotating engineer avatars '이번 주 박수현 → 다음 주 이지훈 → 그 다음 윤서아' (Primary / Secondary lanes), small Slack #incidents channel preview at bottom 'PagerDuty Bot: INC-4823 acknowledged'; thin teal horizontal divider; clean editorial UI mockup style, teal #00b894 and purple #6c5ce7 accents, 16:9"
📸 메트릭·알람·APM 대시보드 reference - Grafana 공식 dashboards — grafana.com/grafana/dashboards - Prometheus Alertmanager UI — prometheus.io/docs/alerting/latest/alertmanager - PagerDuty Incident Console — pagerduty.com/platform/incident-management - Datadog APM Service Map — docs.datadoghq.com/tracing/services/service_map - Dynatrace Smartscape (Davis AI) — dynatrace.com/platform - New Relic One — newrelic.com/platform - VictoriaMetrics — victoriametrics.com

메트릭 — Prometheus · Grafana · InfluxDB · Thanos
모든 시스템은 결국 망가진다. 얼마나 빨리 회복하고 배우는가가 TA의 진짜 실력.

장애 5종 wheel (삽화)
v$session·pg_stat_activity·sp_who2🎨 이미지 프롬프트: "Editorial terminal screenshot illustration on dark navy background — single wide dark terminal window (zsh on RHEL 9.4 jumpbox, prompt
[park@bastion ~]$) titled 'kubectl logs -f deploy/payment-svc -n prod --tail=200 (Kubernetes v1.31, cluster=prod-seoul-rke2)' showing color-coded streaming log output: timestamps, INFO (green), WARN (yellow), ERROR (red) levels, log messages like '2026-05-30T03:42:11.182Z ERROR [HikariPool-1] could not acquire connection from pool (timeout 5000ms, active=50/50, idle=0, pending=18) — exhausted', '2026-05-30T03:42:12.041Z WARN [orderRepo] slow query detected: 4823ms SELECT o.* FROM orders o JOIN payments p ON p.order_id=o.id WHERE o.created_at > $1 — missing index on (created_at, status)', '2026-05-30T03:42:13.118Z ERROR [tx-mgr] org.springframework.transaction.CannotCreateTransactionException', '2026-05-30T03:42:14.012Z INFO [actuator] health check ok (db=UP redis=UP rabbit=UP)'; below it a second terminal titled 'kubectl describe pod payment-svc-7d8c4f9-xz9k2 -n prod' showing 'Status: Running (Last Probe Failed)', Conditions table 'Initialized=True ContainersReady=False PodScheduled=True', container restart count 3, 'Last State: Terminated · Reason: OOMKilled · Exit Code: 137 · Started: ... · Finished: 03:40:17Z', Events list 'Warning Unhealthy 2m kubelet Liveness probe failed: HTTP 503 / Warning BackOff 1m kubelet Back-off restarting failed container / Normal Pulled 30s kubelet Container image registry.lg-cns.com/payment-svc:v2.14.7 pulled'; bottom-right small third terminalkubectl get pods -A --field-selector=status.phase!=Runningshowing 4 non-Running pods (1 CrashLoopBackOff red, 2 Pending yellow, 1 Evicted); clean editorial terminal style with monospace JetBrains Mono font feel, teal #00b894 accents, 16:9"

DB 장애 — Lock · Slow Query · Replication Lag
sysstat·Dell solutions enablershow interface·ethtoolshow mac addres6-tablearp -anshow ip routeping -M do -s 8972dig·chronyc·ntpqtcpdump·SPAN📚 NIST SP 800-61 6단계 (Preparation·Detection·Containment·Eradication·Recovery·Lessons Learned) 본문은 Session 7
## 침해사고 대응참조 — KISA 72시간 신고 등 한국 절차 포함.
탐지 → 격리 → 조사 → 복구 → 회고의 사이클. 회고에서 도출된 개선이 다음 사이클의 탐지 역량으로 환류된다.

장애 대응 5단계 흐름 (삽화)

장애 대응 콘솔 사이클 (삽화)
격언: "장애 원인의 80%는 직전 변경" — Change Analysis가 가장 빠른 RCA.
한 번 손으로 한 작업은 두 번부터 자동화한다 — Toil은 SRE의 적.
| 도구 | 언어 | Agent | 학습 |
|---|---|---|---|
| Ansible | YAML | Agentless (SSH) | 쉬움 |
| Puppet | DSL | Agent | 중간 |
| Chef | Ruby DSL | Agent | 어려움 |
| SaltStack | YAML | Agent (ZeroMQ) | 중간 |
🎨 이미지 프롬프트: "Editorial terminal screenshot illustration on dark navy background — a single wide terminal window with title 'ansible-playbook site.yml -i inventories/prod --check --diff (Ansible Automation Platform 2.5 / ansible-core 2.17)' showing typical color-coded output: green 'PLAY [webservers] ***', yellow 'TASK [common : install nginx 1.26 LTS]', cyan 'ok: [web-01.prod.lg-cns.com]', 'ok: [web-02.prod.lg-cns.com]', yellow 'changed: [web-03.prod.lg-cns.com]', then 'PLAY RECAP' formatted in columns with three host lines
web-01 : ok=12 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0,web-02 : ok=12 changed=2 unreachable=0 failed=0 skipped=1,web-03 : ok=11 changed=3 unreachable=0 failed=0 skipped=1, footer hints 'Vault: ansible-vault edit group_vars/prod/secrets.yml'; below it a second terminalkubectl get pods -n prod -o wide (Kubernetes v1.31, rke2)with tabular columns NAME / READY / STATUS / RESTARTS / AGE / IP / NODE, rows 'payment-svc-7d8c-xz9k2 1/1 Running 0 4h12m 10.42.1.18 worker-03', 'payment-svc-7d8c-mnp4q 0/1 CrashLoopBackOff 7 12m 10.42.2.41 worker-05 (red)', 'order-svc-9bf6-qq2t8 2/2 Running 0 2d 10.42.3.7 worker-08', plus another terminalkubectl get nodesshowing 5 control-plane + 12 worker nodes with Ready status; third small terminalhelm upgrade --install lms-app ./chart -f values-prod.yaml --namespace prod --atomic --timeout 5m (Helm 3.15)showing Release info 'NAME: lms-app · LAST DEPLOYED: 2026-05-30 · NAMESPACE: prod · STATUS: deployed · REVISION: 14 · TEST SUITE: None'; bottom stripdocker ps --format \"table {{.ID}}\\t{{.Image}}\\t{{.Status}}\\t{{.Names}}\" (Docker 27.x)showing CONTAINER ID, IMAGE (registry.lg-cns.com/payment-svc:v2.14.7, postgres:16.4, redis:7.4-alpine), STATUS (Up 4 hours, Restarting 32s ago), Names; clean editorial terminal style, teal #00b894 accents, 16:9"
🎨 이미지 프롬프트: "Editorial dark-theme console mockup illustration on dark navy background — Red Hat Ansible Automation Platform 2.5 (formerly Ansible Tower) Job Output view: top header 'Job #4823 · Template: prod-os-patch-monthly · site.yml · Running · Started 02:00 KST · Elapsed 04:12 · Triggered by Schedule (CRON: 0 2 1 * *)', left sidebar with navigation items 'Templates · Job Templates · Workflow Templates · Projects (Git: gitlab.lg-cns.com/infra/playbooks main@a3f912b) · Inventories (prod_inventory 187 hosts) · Hosts · Credentials (HashiCorp Vault 1.16 lookup) · Schedules · Notifications (Slack #ops + PagerDuty)', main pane shows real-time Playbook execution output with green/yellow/red task status lines: 'PLAY [webservers] · TASK [common : update yum cache] ok: [web-01] ok: [web-02] · TASK [common : install kernel-5.14.0-427.13.1.el9_4] changed: [web-03] (yellow) · TASK [security : apply CIS Benchmark RHEL 9 Level 1] ok: [web-01] failed: [web-04] (red error msg: sshd_config PermitRootLogin enforce failed)', ok/changed/failed counters '147/12/1' at top right; right pane shows host list with per-host status pills (green ok, yellow changed, red failed) — web-01 ok · web-02 ok · web-03 changed · web-04 failed · db-01 ok · db-02 ok, with a 'Re-launch on failed hosts' button; small live timeline at top with ramp-up of completed tasks per minute; Red Hat logo top-left, user avatar '박수현 (Org: Infra)' top-right; clean editorial UI mockup style, teal #00b894 accents, 16:9"
📸 Ansible·kubectl·Helm·docker CLI / 콘솔 reference
- Ansible 공식 문서 — docs.ansible.com
- Red Hat Ansible Automation Platform (구 Tower) / AWX — ansible.com/products/automation-platform
- kubectl Cheat Sheet — kubernetes.io/docs/reference/kubectl/cheatsheet (kubectl get pods · kubectl describe pod · kubectl logs -f)
- Helm — helm.sh (helm install · helm upgrade · helm list)
- Docker / Docker Compose — docs.docker.com (docker ps · docker-compose up)
- Rundeck Runbook UI — rundeck.com

구성 관리 — Ansible · Puppet · Chef · SaltStack
🎨 이미지 프롬프트: "Editorial split mockup illustration on dark navy background — left half labeled 'HashiCorp Terraform 1.10 / OpenTofu 1.8 — terraform plan -out=tfplan' showing a terminal with workspace context 'workspace = prod · backend: s3 (s3://lg-cns-tfstate/prod/lms.tfstate · DynamoDB lock) · provider aws ~> 5.70' and color-coded diff output: green '+ aws_instance.web[0] (t3.xlarge, ami-0c9c942bd7bf113a2)', '+ aws_instance.web[1]', yellow '~ aws_lb.web (1 to change: idle_timeout 60 → 120)', red '- aws_security_group.legacy_ssh (will be destroyed)', followed by 'Plan: 2 to add, 1 to change, 1 to destroy. Saved the plan to: tfplan', then on a second line
terraform apply -auto-approve tfplanshowing rolling apply output 'aws_instance.web[0]: Creating... · aws_instance.web[0]: Still creating... [10s elapsed] · aws_instance.web[0]: Creation complete after 42s [id=i-0a1b2c3d]' and final 'Apply complete! Resources: 2 added, 1 changed, 1 destroyed.', tiny bottom strip CLI 'vault kv get -mount=kv prod/aws/access_key' (HashiCorp Vault 1.16 secret lookup); right half labeled 'Argo CD 2.13 Application Tree (GitOps)' showing the signature Argo CD topology DAG (Git repogitlab.lg-cns.com/infra/argocd-apps @ main→ Applicationprod-lms→ Namespaceprod→ Deploymentlms-web→ ReplicaSetlms-web-7d8c4f→ 6 Pods green) with sync-status icons (green check on synced, yellow circular arrow on out-of-synclms-batch), top header 'prod-lms · Synced · Healthy · Last sync 2026-05-30 02:14 KST · Auto-sync ✓ · Self-heal ✓ · Prune ✓ · Revision: a3f912b', sidebar with Applications list (prod-lms ✓, prod-payment ✓, prod-batch ⚠ degraded, dev-lms ✓), Argo CD octopus logo top-left, footer 'Crossplane v1.18 + Argo CD = K8s native IaC pipeline'; clean editorial UI mockup style, teal #00b894 and purple #6c5ce7 accents, 16:9"
📸 IaC·GitOps 콘솔 reference
- Terraform / OpenTofu CLI — developer.hashicorp.com/terraform/cli · opentofu.org (terraform plan · terraform apply -auto-approve)
- HashiCorp Terraform Cloud UI — app.terraform.io
- Argo CD UI — argo-cd.readthedocs.io
- Flux CD — fluxcd.io
- Spinnaker — spinnaker.io
- HashiCorp Vault UI (시크릿 관리 참조) — vaultproject.io

프로비저닝 — Terraform · Pulumi · CloudFormation
관계: DevOps는 문화, SRE는 그 문화를 구현하는 직무, 운영팀은 전통 모델. SRE = 코드로 운영을 자동화하는 DevOps의 한 형태.

IaC 도구 매트릭스 (삽화)
이 세션이 끝나면 TA는 12개 결정 포인트와 6대 산출물을 정리해 두어야 한다.
| 시스템 | 등급 | HA 패턴 | DR | SLA |
|---|---|---|---|---|
| 결제 코어 | 1 | 2N+1 | Hot | 99.99% |
| LMS | 2 | Active-Active | Warm | 99.9% |
| 내부 위키 | 4 | 단일 | Backup | 99% |
| 가용성 | 9 개수 | 연간 | 분기 | 월간 | 주간 | 일일 |
|---|---|---|---|---|---|---|
| 90% | 1 | 36.5일 | 9.13일 | 3.04일 | 16.8시간 | 2.4시간 |
| 95% | 1.5 | 18.25일 | 4.56일 | 1.52일 | 8.4시간 | 1.2시간 |
| 99% | 2 | 3.65일 | 21.9시간 | 7.2시간 | 1.68시간 | 14.4분 |
| 99.5% | 2.5 | 1.83일 | 10.95시간 | 3.6시간 | 50.4분 | 7.2분 |
| 99.9% | 3 | 8.76시간 | 2.19시간 | 43.8분 | 10.1분 | 1.44분 |
| 99.95% | 3.5 | 4.38시간 | 1.10시간 | 21.9분 | 5.04분 | 43.2초 |
| 99.99% | 4 | 52.6분 | 13.15분 | 4.38분 | 1.01분 | 8.64초 |
| 99.995% | 4.5 | 26.3분 | 6.57분 | 2.19분 | 30.2초 | 4.32초 |
| 99.999% | 5 | 5.26분 | 1.31분 | 26.3초 | 6.05초 | 0.86초 |
| 99.9999% | 6 | 31.5초 | 7.88초 | 2.63초 | 0.6초 | 0.09초 |
TA의 기준값 외우기: 99.9% = 월 43분·99.99% = 월 4.38분·99.999% = 월 26초.
[장애 발생] {시스템명} 일부 영향
- 발생 시각: YYYY-MM-DD HH:MM
- 영향 범위: {서비스명·기능}
- 상태: 조사 중
- 다음 업데이트: 30분 후
- 담당자: {이름·연락처}
[장애 업데이트] {시스템명}
- 원인 가설: {1차 가설}
- 임시 조치: {차단·우회}
- 영향: {업무·사용자}
- ETA: 복구 예상 {시각}
- 다음 업데이트: 1시간 후
[장애 복구] {시스템명}
- 복구 시각: YYYY-MM-DD HH:MM
- 다운타임: {합계}
- 원인: {요약}
- 조치: {요약}
- 사후 분석: Postmortem 작성 중
- 보고서: 1주 이내
| 자원 | 경고 | 위험 | 조치 |
|---|---|---|---|
| CPU 5분 평균 | 70% | 85% | 부하 분산·증설 |
| Memory | 80% | 90% | 누수 조사 |
| Disk Used | 80% | 90% | 회수·증설 |
| Disk IO Wait | 20% | 40% | IO 병목 분석 |
| NW 대역 | 70% | 85% | 트래픽 분석 |
| NW 패킷 손실 | 0.1% | 1% | NW 진단 |
| 항목 | 경고 | 위험 | 조치 |
|---|---|---|---|
| 응답시간 p95 | 1초 | 3초 | APM 트레이스 |
| 에러율 | 0.5% | 2% | 로그 분석 |
| DB Connection % | 70% | 90% | Pool 조사·증설 |
| Slow Query | 1초 | 3초 | 인덱스·튜닝 |
| Replication Lag | 30초 | 60초 | 복제 점검 |
| GC Pause | 1초 | 3초 | JVM 튜닝 |
- name: Install Nginx
hosts: webservers
become: yes
tasks:
- name: Install Nginx package
apt:
name: nginx
state: present
update_cache: yes
- name: Start Nginx service
service:
name: nginx
state: started
enabled: yes
- name: Deploy config
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reload Nginx
handlers:
- name: Reload Nginx
service:
name: nginx
state: reloaded
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "web" {
count = 2
ami = "ami-0c9c942bd7bf113a2"
instance_type = "t3.medium"
tags = {
Name = "web-${count.index}"
Env = "prod"
}
}
resource "aws_lb" "web" {
name = "web-lb"
load_balancer_type = "application"
subnets = var.subnets
tags = {
Env = "prod"
}
}
groups:
- name: infrastructure
interval: 30s
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU on {{ $labels.instance }}"
description: "CPU usage is {{ $value }}% (>85%) for 5min"
- alert: DiskFull
expr: 100 - ((node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100) > 90
for: 10m
labels:
severity: critical
annotations:
summary: "Disk almost full on {{ $labels.instance }}"
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Service {{ $labels.job }} is down"
# Postmortem: [장애 제목] (YYYY-MM-DD)
## 1. 요약
- 장애 시점: YYYY-MM-DD HH:MM ~ HH:MM (총 X분)
- 영향: {서비스·사용자 수·매출 영향}
- 등급: P1·P2·P3
- 책임자: {이름}
## 2. 타임라인
- HH:MM — 알람 발생
- HH:MM — 1차 대응 시작
- HH:MM — 원인 파악
- HH:MM — 임시 조치
- HH:MM — 영구 복구
- HH:MM — 정상화 확인
## 3. 근본 원인 (RCA)
- 직접 원인: {기술적 원인}
- 기여 요인: {프로세스·모니터링·문화}
- 5 Why 결과
## 4. 잘 된 점
- {탐지 빠름·협업 원활 등}
## 5. 잘못된 점
- {알람 누락·문서 부족 등}
## 6. Action Items
| 항목 | 담당자 | 기한 | 우선순위 |
|---|---|---|---|
| 알람 임계 조정 | A | 1주 | High |
| Runbook 추가 | B | 2주 | Medium |
## 7. 재발 방지
- {구조적 개선 사항}
Blameless 원칙: "누가 잘못했나" 대신 "어떤 시스템·프로세스가 이 실수를 가능케 했나" — 학습 조직의 핵심.
5
HA 패턴
N+1·N+M·2N·2N+1·A/A
6
SLA 등급
99~99.9999%
5
클러스터 계층
App·DB·OS·Storage·NW
5
용량 산정 단계
요구→TPS→자원→마진→검증
3
관찰성 축
Metrics·Logs·Traces
5
장애 대응 단계
Detect·Contain·Invest·Recov·Post
12
TA 결정 카탈로그
6
산출물 6대 문서
다섯 축(HA·용량·관찰성·장애·자동화)을 한 묶음의 운영 시스템으로 정리했다.
HA · 용량 · 관찰성 · 장애 대응 · IaC/SRE — 다섯 축의 운영 시스템
다섯 축은 따로가 아니라 한 묶음의 운영 시스템. TA의 12 결정 · 6대 산출물이 모두 정리됐다.