[Cloud Ops Lab #1] 프로젝트 소개와 학습 목표

2026. 8. 16. 18:38ㆍPROJECT/Toy Project

[Cloud Ops Lab #1] 프로젝트 소개와 학습 목표

1. 시작하며

Playback Gate에서는 하나의 API에 많은 요청이 들어왔을 때 발생하는 Latency, Connection Pool, Cache, 동시성 문제를 다뤘다.

Live Event Stream에서는 Kafka를 이용해 많은 Event를 비동기로 처리하면서 Consumer Lag, Partition, Idempotency, Retry, Replay 같은 문제를 직접 확인했다.

ContentOps Agent에서는 RAG와 Tool Calling을 이용하면서 Retrieval, Generation, Grounding, Tool Selection을 Evaluation했다.

LLM Router에서는 여러 Model을 비교하면서 Quality, Cost, Latency, Routing Decision을 확인했다.

지금까지 프로젝트에서는 주로 Application 내부에서 발생하는 문제를 다뤘다.

이번에는 조금 다른 영역을 다뤄보려고 한다.

Backend Application을 실제 운영 환경에 올리면 코드가 정상적으로 동작하는 것만으로는 충분하지 않다.

예를 들어 다음과 같은 상황이 발생할 수 있다.

Traffic이 갑자기 증가하면 어떻게 될까?

Pod 하나가 죽으면 서비스는 계속 동작할까?

Application Process는 살아 있지만
Request를 정상 처리하지 못하면 어떻게 될까?

CPU나 Memory가 부족하면 어떤 문제가 발생할까?

Replica를 늘리면 실제 처리량과 Latency가 좋아질까?

HPA는 언제 Pod를 늘리고 언제 줄일까?

배포 중 일부 Pod가 준비되지 않으면
Traffic은 어디로 갈까?

장애가 발생했을 때
어떤 Metric을 보고 원인을 찾아야 할까?

로컬에서 Application을 실행할 때는 잘 보이지 않았던 문제들이다.

하지만 실제 운영 환경에서는:

Application

Container

Kubernetes

Network

Resource

Monitoring

Cloud

가 모두 연결되어 있다.

이번 프로젝트에서는 Backend Application을 Kubernetes 환경에서 실제로 운영하면서 이런 문제를 직접 만들어보고 확인해보려고 한다.

프로젝트 이름은 Cloud Ops Lab으로 정했다.


2. Cloud Ops Lab이란?

Cloud Ops Lab은 Backend Application을 Kubernetes 환경에 배포하고 부하와 장애 상황에서 서비스가 어떻게 동작하고 복구되는지를 직접 실험하는 프로젝트다.

기본적인 구조는 다음과 같다.

Client
   ↓
Service
   ↓
Kubernetes
   ↓
Pod
   ↓
Backend Application

그리고 Application과 Kubernetes의 상태를 관찰하기 위해:

Prometheus
+
Grafana

를 사용한다.

최종적으로는 로컬 Kubernetes 환경에서 확인한 실험을 AWS 환경까지 확장해보려고 한다.

이번 프로젝트에서 보고 싶은 것은 단순히:

Pod가 실행됐다.

Deployment가 생성됐다.

Grafana Dashboard가 보인다.

HPA가 설정됐다.

가 아니다.

예를 들어 Pod가 하나 죽었다면:

Pod Failure
     ↓
Replica 감소
     ↓
Kubernetes가 새 Pod 생성
     ↓
새 Pod Ready
     ↓
Replica 복구

과정에서 실제 서비스에는 어떤 영향이 있었는지 확인한다.

Error Rate는 증가했는가?

p95 / p99 Latency는 변했는가?

남아 있는 Pod의 CPU는 증가했는가?

새 Pod가 Ready가 되기까지 얼마나 걸렸는가?

사용자가 장애를 느낄 정도였는가?

같은 질문까지 확인해보려고 한다.

즉 이번 프로젝트에서는 Kubernetes를 단순히 배포 도구로 사용하는 것에서 끝내지 않고,

Application이 실제 운영 환경에서 어떤 상태인지 관찰하고, 부하와 장애에 어떻게 대응하는지를 직접 확인하는 과정

까지 다뤄보려고 한다.


3. 이번 프로젝트에서 중요한 것

이번 프로젝트의 목표는:

Docker Image 생성

↓

Kubernetes 배포

↓

HPA 설정

↓

Prometheus 연결

↓

Grafana 연결

↓

AWS 배포

↓

"Cloud 프로젝트 만들었다."

로 끝내는 것이 아니다.

이전 프로젝트에서 사용했던 방식과 동일하게 진행한다.

기본 구조 구현
      ↓
Baseline 측정
      ↓
문제 재현
      ↓
Metric 확인
      ↓
원인 분석
      ↓
개선 후보 비교
      ↓
구조 / 운영 설정 변경
      ↓
동일 조건 재측정

다만 이번에는 이전 프로젝트와 측정 대상이 조금 다르다.

Playback Gate에서는:

RPS

p95

p99

DB Connection

Cache Hit

등을 봤고,

Live Event Stream에서는:

Events/sec

Consumer Lag

Processing Latency

를 봤다면,

Cloud Ops Lab에서는 Application Metric뿐 아니라 운영 환경의 상태도 함께 보게 된다.

예를 들면:

Request Rate

Error Rate

p95 / p99 Latency

CPU Usage

Memory Usage

Ready Pod 수

Replica 수

Pod Restart

HPA 상태

Scale-out 시간

Recovery 시간

등이다.

즉 이번 프로젝트의 핵심은:

운영 문제도 재현하고 측정할 수 있는 대상으로 보는 것

이다.


4. 가장 단순한 구조부터 시작한다

처음부터 복잡한 Cloud Architecture를 만들지 않는다.

초기 구조는 최대한 단순하게 시작한다.

Client
   ↓
Kubernetes Service
   ↓
Deployment
   ↓
Pod
   ↓
Spring Backend

우선 하나의 Application을 Container로 만들고 Kubernetes에 배포한다.

처음에는 고정된 Replica로 시작한다.

예를 들어:

Deployment

Replica = 1

상태에서 정상 Request가 처리되는지 확인한다.

이 상태를 첫 번째 Baseline으로 사용한다.

처음부터 다음 기능을 모두 넣지는 않는다.

HPA

복잡한 Auto Scaling 정책

Service Mesh

Argo CD

Multi Cluster

Chaos Engineering Platform

복잡한 Alert Rule

분산 Tracing

대규모 Logging Stack

먼저 단순한 Kubernetes 환경에서 어떤 문제가 발생하는지 확인한다.


5. 먼저 Kubernetes의 기본 동작을 직접 확인한다

Kubernetes를 공부하면 다음 개념을 쉽게 접할 수 있다.

Pod

Deployment

ReplicaSet

Service

ConfigMap

Secret

문서로 개념을 이해하는 것과 실제 서비스가 동작하는 모습을 보는 것은 조금 다르다.

예를 들어 Deployment에:

replicas: 3

을 설정하면 Pod 세 개가 생성된다.

하지만 이번 프로젝트에서 확인하고 싶은 것은:

Pod 3개 생성

에서 끝나지 않는다.

Pod 하나를 직접 종료했을 때:

Pod 3개
   ↓
Pod 1개 종료
   ↓
Pod 2개
   ↓
새 Pod 생성
   ↓
다시 Pod 3개

로 돌아오는 과정을 직접 확인한다.

이를 통해 Kubernetes의 Desired State가 실제로 어떻게 유지되는지 이해한다.


6. 학습 목표

6.1 Container와 Kubernetes의 관계 이해

먼저 Backend Application을 Container Image로 만든다.

Spring Application
       ↓
Container Image
       ↓
Container
       ↓
Pod

이를 통해 다음 관계를 실제로 확인한다.

Application

Container

Pod

Deployment

Container가 실행되는 것과 Kubernetes에서 Pod가 관리되는 것은 같은 개념이 아니다.

Application을 Container로 만드는 과정부터 Kubernetes가 해당 Container를 어떻게 실행하고 관리하는지까지 직접 확인한다.


6.2 Pod, Deployment, Service 이해

Kubernetes의 기본적인 Application 배포 구조를 직접 만든다.

Client
   ↓
Service
   ↓
Pod A
Pod B
Pod C

Deployment는 원하는 Replica를 유지하고,

Service는 여러 Pod에 접근할 수 있는 Endpoint 역할을 한다.

이번 프로젝트에서는 단순히 YAML을 작성하는 것보다:

Deployment를 수정하면 Pod는 어떻게 바뀌는가?

Replica를 변경하면 어떤 순서로 Pod가 생성되는가?

Pod가 새로 생성되어도 Service는 계속 같은 주소로 접근할 수 있는가?

같은 동작을 직접 확인한다.


6.3 Resource Request와 Limit 이해

Container에는 CPU와 Memory Resource를 설정할 수 있다.

CPU Request

CPU Limit

Memory Request

Memory Limit

처음부터 적당해 보이는 값을 넣고 끝내지는 않는다.

먼저 Application의 Resource 사용량을 관찰한다.

Load 증가
   ↓
CPU 증가

Load 증가
   ↓
Memory 변화

그리고 Resource 설정을 변경했을 때 실제 Application의 상태가 어떻게 달라지는지 확인한다.

예를 들어 CPU Resource가 부족한 상태에서:

Traffic 증가
   ↓
CPU 사용
   ↓
처리 지연
   ↓
Latency 증가

가 실제로 발생하는지 확인할 수 있다.

Memory Limit 역시 너무 작게 설정하면 어떤 Failure가 발생하는지 직접 확인한다.

목표는 Resource YAML 값을 외우는 것이 아니라:

Resource 설정이 Application의 동작과 서비스 품질에 어떤 영향을 주는지를 이해하는 것

이다.


6.4 Liveness와 Readiness 이해

Application Process가 살아 있다는 것과 사용자의 Request를 받을 준비가 되어 있다는 것은 다를 수 있다.

예를 들어:

Application Process
→ 실행 중

하지만

Dependency 문제
→ Request 처리 불가

상태가 존재할 수 있다.

Kubernetes에서는 이를 구분하기 위해 Health Check를 사용할 수 있다.

Liveness Probe

Readiness Probe

이번 프로젝트에서는 정상 상태만 확인하지 않는다.

가능하면 다음 상태를 직접 만들어본다.

정상

Startup 중

Readiness 실패

Liveness 실패

그리고 각 상태에서:

Pod가 Restart되는가?

Service에서 제외되는가?

Request Error가 발생하는가?

를 확인한다.

이를 통해:

살아 있는가?

와:

Traffic을 받을 준비가 됐는가?

의 차이를 실제 운영 관점에서 이해한다.


6.5 Pod Failure와 Self-Healing 이해

Kubernetes의 장점 중 하나로 Self-Healing을 자주 이야기한다.

하지만:

Pod가 다시 생성됐다.

만 확인하고 끝내지는 않는다.

Pod를 강제로 종료하고 다음 흐름을 관찰한다.

정상 상태
   ↓
Pod 강제 종료
   ↓
Replica 감소
   ↓
Kubernetes 감지
   ↓
새 Pod 생성
   ↓
Readiness 통과
   ↓
정상 Replica 복구

그리고 Application Metric도 같이 확인한다.

Error Rate

Latency

CPU

Ready Pod

Recovery Time

이를 통해:

Infrastructure가 복구된 것과 서비스가 정상 상태를 유지한 것은 같은가?

를 확인한다.


6.6 Traffic 증가와 Scale Out 이해

Application Traffic이 항상 일정한 것은 아니다.

평상시에는 하나의 Pod로 충분할 수 있다.

Traffic
↓
Pod 1
↓
정상 처리

하지만 Traffic이 증가하면:

Traffic 증가
      ↓
Pod 1
      ↓
CPU 증가
      ↓
Latency 증가

같은 문제가 발생할 수 있다.

먼저 고정 Replica 상태에서 부하를 발생시킨다.

그리고 다음을 확인한다.

어느 수준의 Traffic부터 Latency가 증가하는가?

CPU는 얼마나 사용하는가?

Error는 언제 발생하는가?

Replica를 늘리면 실제로 개선되는가?

단순히:

Pod 수 증가
=
성능 향상

이라고 가정하지 않는다.

동일한 부하 조건에서 실제 결과를 비교한다.


6.7 HPA 이해

고정 Replica의 한계를 확인한 뒤 HPA를 실험한다.

기본적인 흐름은 다음과 같다.

Traffic 증가
      ↓
Resource Metric 증가
      ↓
HPA
      ↓
Desired Replica 증가
      ↓
새 Pod 생성
      ↓
Service Capacity 증가

하지만 이번 프로젝트에서 확인하려는 것은:

HPA가 Replica를 늘렸다.

가 아니다.

다음 값을 같이 본다.

Scale-out 전 p95 / p99

Scale-out 후 p95 / p99

CPU Usage

Replica Count

Scale-out 시작 시점

새 Pod Ready 시점

Error Rate

그리고:

HPA가 실제 사용자 관점의 Latency와 Error를 줄였는가?

를 확인한다.


6.8 Scale In과 과도한 Scaling 문제 이해

Auto Scaling은 Pod를 늘리는 것만 있는 것이 아니다.

Traffic이 감소하면 다시 줄어들 수 있다.

Traffic 감소
      ↓
Resource 사용 감소
      ↓
HPA
      ↓
Replica 감소

이 과정에서도 생각해볼 문제가 있다.

너무 빨리 줄어들지는 않는가?

Traffic이 다시 증가하면 바로 부족해지지 않는가?

Scale Out / Scale In이 반복되지는 않는가?

즉 Auto Scaling을:

Traffic 많음
→ Pod 증가

정도의 기능으로만 보지 않고 실제 운영 정책의 관점에서 확인한다.


7. Prometheus를 이용해 Metric을 수집한다

운영 문제를 분석하려면 먼저 상태를 관찰할 수 있어야 한다.

Application에 문제가 발생했을 때:

느려졌다.

정도로만 알고 있다면 원인을 찾기 어렵다.

Prometheus를 이용해 Application과 Kubernetes의 Metric을 수집한다.

예를 들면:

Request Rate

Error Rate

Request Latency

CPU Usage

Memory Usage

Pod 상태

Replica 상태

등이다.

중요한 것은 Metric을 많이 수집하는 것이 아니다.

각 Experiment에서:

무슨 일이 발생했는가?

를 확인할 수 있는 Metric을 선택한다.


8. Grafana를 이용해 상태 변화를 본다

Prometheus에서 수집한 Metric을 Grafana에서 확인한다.

하지만 이번 프로젝트의 목표는:

예쁜 Dashboard 만들기

가 아니다.

예를 들어 Traffic을 증가시켰을 때:

Traffic
   ↑

CPU
   ↑

Latency
   ↑

Replica
   ↑

Latency
   ↓

같은 흐름이 실제로 보이는지 확인한다.

Pod Failure Experiment라면:

Ready Pod 감소

↓

Error / Latency 변화

↓

새 Pod 생성

↓

Ready Pod 복구

가 Metric에서 어떻게 나타나는지 확인한다.

즉 Dashboard는 결과물이 아니라:

운영 상황을 이해하기 위한 관찰 도구

로 사용한다.


9. Monitoring과 Observability의 차이를 직접 경험한다

Monitoring만으로도 다음 값은 볼 수 있다.

CPU 80%

Memory 70%

Pod 3개

하지만 실제 장애에서는 조금 다른 질문이 생긴다.

"왜 갑자기 p99가 증가했지?"

이 질문에 답하려면 여러 신호를 같이 봐야 할 수 있다.

예를 들어:

p99 증가
   ↓
CPU 증가 확인
   ↓
Replica 수 확인
   ↓
HPA 상태 확인
   ↓
새 Pod Ready 시간 확인

처럼 원인을 좁혀갈 수 있다.

이번 프로젝트에서는:

Application Metric

Kubernetes 상태

Pod 상태

Event

Log

등을 이용해 장애의 원인을 설명해보려고 한다.

즉 Observability를:

Monitoring Tool을 설치했다.

로 이해하는 것이 아니라,

현재 시스템 내부에서 무슨 일이 발생하고 있는지 관측 데이터를 이용해 설명할 수 있는 상태

로 이해하는 것이 목표다.


10. 장애를 직접 만들어본다

운영 프로젝트라면 정상 상태만 확인해서는 부족하다.

실제 장애가 우연히 발생하기를 기다리지 않고 직접 Failure Scenario를 만든다.

예를 들면:

Pod 강제 종료

Application Crash

Readiness 실패

Resource 부족

Memory Limit 초과

Traffic Spike

같은 상황이다.

각 실험에서는 가능한 한 다음 순서를 유지한다.

정상 Baseline
      ↓
Failure Injection
      ↓
Metric 변화
      ↓
서비스 영향 확인
      ↓
Kubernetes 동작 확인
      ↓
Recovery

그리고 다음 질문에 답한다.

장애를 감지할 수 있었는가?

어떤 Metric이 먼저 변했는가?

Request Error가 발생했는가?

Latency는 얼마나 변했는가?

Kubernetes가 자동으로 복구했는가?

정상 상태로 돌아오기까지 얼마나 걸렸는가?

11. Recovery Time을 직접 확인한다

장애 대응에서 단순히:

결국 복구됐다.

만 보는 것은 부족하다.

예를 들어 Pod Failure가 발생했다면:

Failure 발생
      ↓
Kubernetes 감지
      ↓
새 Pod 생성
      ↓
Application Startup
      ↓
Readiness PASS
      ↓
정상 Traffic 처리

까지 시간이 필요하다.

따라서 이번 프로젝트에서는 가능한 경우:

Failure 시점

새 Pod 생성 시점

Ready 시점

서비스 정상화 시점

을 구분해서 확인한다.

이를 통해 Recovery가 실제 서비스에 어떤 영향을 주는지 본다.


12. Rolling Update와 배포 과정 이해

운영 환경에서는 새로운 Version을 배포하는 순간도 중요한 상태 변화다.

Deployment를 이용해 Rolling Update를 직접 확인한다.

예를 들면:

Version A
Pod 3개

↓

Version B 배포

↓

A / B 혼재

↓

B Pod Ready

↓

A Pod 종료

↓

Version B
Pod 3개

과정이다.

이때 다음 질문을 확인한다.

배포 중 Request Error가 발생하는가?

새 Pod가 Ready되기 전에 Traffic을 받는가?

배포 중 Latency는 달라지는가?

잘못된 Version을 배포하면 어떻게 되는가?

단순히:

kubectl apply 성공

을 배포 성공으로 판단하지 않는다.

실제 서비스 관점에서 배포 과정의 영향을 확인한다.


13. Application Metric과 Infrastructure Metric을 같이 본다

Application만 보면:

p99 증가

라는 결과만 보일 수 있다.

Kubernetes만 보면:

CPU 90%

라는 결과만 보일 수 있다.

하지만 둘을 연결하면:

Traffic 증가

↓

CPU 증가

↓

Pod Saturation

↓

p99 증가

↓

HPA Scale Out

↓

Replica 증가

↓

p99 감소

같은 흐름을 확인할 수 있다.

Cloud Ops Lab에서는 Application과 Infrastructure를 별개의 시스템처럼 보지 않고:

Application 상태와 운영 환경의 상태를 같이 관찰하는 것

을 중요하게 다룬다.


14. AWS 환경으로 확장한다

로컬 Kubernetes 환경에서도 기본적인 실험은 가능하다.

하지만 최종적으로는 AWS 환경까지 확장해보려고 한다.

목적은 AWS 서비스를 최대한 많이 사용하는 것이 아니다.

확인하고 싶은 것은:

Application
      ↓
Container
      ↓
Kubernetes
      ↓
Cloud Infrastructure

가 실제 환경에서 어떻게 연결되는가이다.

AWS 환경에서는 로컬과 비교해 다음 요소들도 실제 운영 조건에 가까워진다.

Compute Resource

Network

Load Balancing

Cloud Resource 사용량

운영 비용

다만 처음부터 AWS에 복잡한 Architecture를 만들지 않는다.

먼저 로컬 환경에서:

배포

부하

Scaling

Failure

Monitoring

Recovery

실험을 반복할 수 있는 상태를 만든 뒤 Cloud 환경으로 확장한다.


15. 성능과 Resource의 Trade-off도 확인한다

Replica를 늘리면 처리 Capacity가 증가할 수 있다.

예를 들어:

Replica 1
↓
p99 증가

Replica 3
↓
p99 감소

라는 결과가 나올 수 있다.

하지만 Replica가 늘어나면 Resource 사용량도 증가한다.

Replica 증가

↓

CPU Resource 증가

Memory Resource 증가

Cloud Resource 증가

따라서:

Pod가 많다
=
좋은 운영

이라고 판단하지 않는다.

이번 프로젝트에서는 가능한 범위에서:

성능

Resource

운영 비용

사이의 Trade-off도 같이 확인한다.


16. 장애 대응도 기능이 아니라 결과로 판단한다

Kubernetes에서:

Replica 설정

Health Probe 설정

HPA 설정

을 했다고 해서 장애 대응이 완료된 것은 아니다.

예를 들어:

Pod Failure
↓
자동 복구

가 발생했더라도 그 사이 Request가 계속 실패했다면 사용자 입장에서는 장애가 발생한 것이다.

따라서 장애 대응은 다음처럼 본다.

Failure
   ↓
서비스 영향
   ↓
Detection
   ↓
Recovery
   ↓
정상화

그리고 가능한 경우:

Error Rate

Latency

Recovery Time

Restart Count

같은 값을 기준으로 판단한다.


17. 실험이 이번 프로젝트의 핵심이다

Cloud Ops Lab에서도:

Kubernetes 배포

↓

HPA 추가

↓

Grafana 확인

↓

"잘 동작한다."

로 끝내지 않는다.

대신:

Baseline 생성
      ↓
부하 / Failure Scenario 실행
      ↓
Metric 기록
      ↓
현재 문제 확인
      ↓
원인 분석
      ↓
운영 설정 변경
      ↓
동일 Scenario 재실행
      ↓
Before / After 비교

방식으로 진행한다.

예를 들어:

Replica = 1
p99 = 측정값

↓

Replica 변경

↓

Replica = 3
p99 = 측정값

또는:

HPA 없음
Scale-out 없음

↓

HPA 적용

↓

Scale-out Time = 측정값
p99 = 측정값
Error Rate = 측정값

처럼 실제 결과를 비교한다.

물론 HPA를 적용했다고 반드시 결과가 좋아질 것이라고 가정하지 않는다.

Scale-out이 너무 늦어 Spike Traffic을 막지 못할 수도 있다.

Replica가 늘었지만 Database가 병목이라 Latency가 거의 달라지지 않을 수도 있다.

그 역시 정상적인 Experiment 결과로 남긴다.


18. 이전 프로젝트와 다른 점

지금까지 프로젝트의 중심 문제를 비교하면 다음과 같다.

프로젝트 핵심 문제
Playback Gate 많은 동기 요청을 빠르고 정확하게 처리
Live Event Stream 많은 Event를 안정적으로 비동기 처리
ContentOps Agent 내부 데이터에서 올바른 정보를 찾아 근거 있는 AI 답변 생성
LLM Router 요청에 적절한 Model을 선택하고 Quality / Cost / Latency 비교
Cloud Ops Lab Kubernetes 환경에서 서비스를 운영하고 부하 / 장애 / 복구를 관찰

측정하는 값도 달라진다.

Playback Gate Live Event Stream ContentOps Agent LLM Router Cloud Ops Lab
RPS Events/sec Hit Rate@K Quality Request Rate
p95 / p99 Consumer Lag MRR Cost Error Rate
DB Query Processing Latency Retrieval Latency Latency p95 / p99
Connection Pool Retry / DLT Tool Selection Routing Decision CPU / Memory
Race Condition Duplicate Event Grounding Provider Failure Replica / HPA
Lock Idempotency Hallucination Token Pod Restart
Cache Partition Reranking Model 비교 Recovery Time

지금까지는 주로:

Application 내부

에서 문제를 찾았다면,

이번에는:

Application
+
Container
+
Kubernetes
+
Cloud

까지 관찰 범위를 넓힌다.


19. 이번 프로젝트에서도 기술을 미리 정답으로 두지 않는다

이번 프로젝트에서는 Kubernetes 자체가 학습 대상이기 때문에 다음과 같은 기본 기술은 처음부터 사용한다.

Container

Kubernetes

Deployment

Service

Prometheus

Grafana

그리고 처음 계획한 핵심 학습 대상인:

HPA

장애 대응

Observability

AWS

도 프로젝트 과정에서 직접 확인한다.

하지만 다음 기술까지 처음부터 모두 넣지는 않는다.

Terraform

Helm

Argo CD

Istio

Service Mesh

KEDA

OpenTelemetry

ELK / EFK

Chaos Mesh

Multi Cluster

실제 문제와 현재 학습 목표에 필요성이 생겼을 때만 후보로 검토한다.

예를 들어 HPA만으로 현재 Scaling 문제를 충분히 실험할 수 있다면 KEDA를 추가할 이유는 없다.

Prometheus와 Grafana만으로 현재 장애 원인을 확인할 수 있다면 처음부터 복잡한 Observability Stack을 만들 필요도 없다.

이번에도:

기술 사용 여부가 아니라 문제를 실제로 확인하고 설명할 수 있는지를 기준으로 판단한다.


20. 이번 프로젝트에서 확인하고 싶은 질문

Cloud Ops Lab을 진행하면서 다음 질문에 직접 답해보고 싶다.

Pod가 하나 죽었을 때 Kubernetes는 실제로 어떻게 복구하는가?

Pod Failure가 발생하는 동안 Request Error와 Latency는 어떻게 변하는가?

Liveness와 Readiness는 실제 서비스에서 어떤 차이를 만드는가?

CPU와 Memory Request / Limit은 Application에 어떤 영향을 주는가?

Replica를 늘리면 처리 Capacity가 실제로 증가하는가?

Traffic이 증가하면 HPA는 언제 Scale Out하는가?

Scale Out이 완료되기 전까지 서비스에는 어떤 영향이 있는가?

HPA를 적용하면 p95 / p99와 Error Rate가 실제로 좋아지는가?

Traffic이 줄었을 때 Scale In은 어떻게 동작하는가?

Rolling Update 중에도 Request를 안정적으로 처리할 수 있는가?

장애가 발생했을 때 Prometheus와 Grafana를 이용해 원인을 좁혀갈 수 있는가?

Application Metric과 Kubernetes Metric은 어떤 식으로 연결되는가?

Resource를 더 사용하는 만큼 실제 성능 이득이 있는가?

로컬 Kubernetes에서 확인한 동작이 AWS 환경에서도 어떻게 이어지는가?

이 질문들에 실제 Experiment 결과를 이용해 답하는 것이 이번 프로젝트의 중요한 학습 목표다.


21. 최종 목표

Cloud Ops Lab을 통해 단순히 AWS와 Kubernetes를 사용해보는 것이 아니라,

Backend Application을 Kubernetes 환경에 배포하고, Traffic 증가와 Resource 부족, Pod Failure, Health Check 실패 같은 운영 문제를 직접 재현한 뒤 Prometheus와 Grafana를 이용해 상태를 관찰하고, HPA와 Kubernetes의 복구 동작이 실제 서비스의 Latency·Error·Recovery에 어떤 영향을 주는지를 Metric과 Experiment로 설명할 수 있는 경험

을 만드는 것이 최종 목표다.

프로젝트가 끝났을 때:

Kubernetes를 사용했다.

HPA를 적용했다.

Prometheus를 붙였다.

Grafana Dashboard를 만들었다.

AWS에 배포했다.

라고 말하는 것보다 다음을 설명할 수 있었으면 한다.

어떤 부하에서 현재 Replica의 한계가 나타났는가?

어떤 Metric에서 문제를 확인했는가?

HPA가 언제 동작했고
실제 서비스 Metric은 어떻게 변했는가?

Pod Failure가 사용자 Request에 어떤 영향을 주었는가?

Recovery에는 얼마나 걸렸는가?

Readiness가 Traffic 보호에 어떤 역할을 했는가?

Resource 설정을 바꾼 뒤
성능과 안정성은 어떻게 달라졌는가?

장애가 발생했을 때
어떤 관측 데이터를 이용해 원인을 찾았는가?

결국 이번 프로젝트에서도 같은 방식으로 진행하려고 한다.

Baseline
   ↓
부하 / Failure 재현
   ↓
Metric 측정
   ↓
원인 분석
   ↓
대안 비교
   ↓
변경
   ↓
동일 조건 재측정

Cloud Ops Lab의 목표는 Kubernetes 기능을 많이 사용하는 것이 아니다.

실제 운영 환경에서 서비스가 어떤 상태인지 관찰하고, 부하와 장애에 어떻게 대응하며, 그 결과를 측정값으로 설명할 수 있게 되는 것

이 이번 프로젝트의 핵심이다.

반응형