๋ชฉ์ฐจ
1. ๊ฐ์
โข
ํ๋ก์ ํธ๋ช
: COME2US (Sprint #3)
โข
๋ชฉํ:
โฆ
ECS ๊ธฐ๋ฐ 2์ฐจ ์ํคํ
์ฒ๋ฅผ Kubernetes(EKS) ๊ธฐ๋ฐ์ผ๋ก ํ์ฅ
โฆ
GitOps ๊ธฐ๋ฐ ์ ์ธ์ ๋ฐฐํฌ ๊ตฌ์กฐ ์ ๋ฆฝ (GitHub Actions + ArgoCD)
โฆ
์๋น์ค ๋ฉ์์ Istio ๋์
ํ์ฌ ๋ณด์(mTLS)ยทํธ๋ํฝ ์ ์ดยท๊ด์ฐฐ์ฑ ํ๋ฆฝ
โฆ
Helm ๊ธฐ๋ฐ Kubernetes Manifest ํ
ํ๋ฆฟํ
โฆ
Kafka(MSK) ๊ธฐ๋ฐ ์ด๋ฒคํธ ์์คํ
์ ๊ฒฐ์ (Payment) ์๋น์ค ์ค์ฌ์ผ๋ก ๋ถ๋ถ ๋์
โฆ
์ธํ๋ผ ์๋ํ๋ Terraform ์ค์ฌ์ผ๋ก ์ ์ง
โฆ
Istio๋ฅผ ํ์ฉํ Canary ๋ฐฐํฌ ์ ๋ต ๋์
โฆ
Karpenter ๊ธฐ๋ฐ ์๋ ๋
ธ๋ ํ๋ก๋น์ ๋ ๋์
โข
ํต์ฌ ๊ตฌ์ฑ ๊ณ์ธต
๊ณ์ธต | ์ฃผ์ ๊ตฌ์ฑ ์์ |
Network Layer | VPC, Subnet(Public/App/Data), NAT, LB, Route53 |
Compute Layer | EKS, NodeGroup, Karpenter |
Service Layer | Spring Boot Microservices, Istio, Envoy Sidecar, Helm |
Data Layer | RDS(PostgreSQL), Redis, MSK(Kafka), S3 |
DevOps Layer | GitHub Actions(CI), ArgoCD(CD), Terraform, Helm |
Observability Layer | CloudWatch, Prometheus, Grafana, Loki, Tempo(Tracing) |
2. ์์คํ ์ํคํ ์ฒ ์์ฝ
์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ
์ฃผ์ ๋ณ๊ฒฝ์ ์์ฝ (ECS โ EKS ์ ํ)
์์ญ | 2์ฐจ ํ๋ก์ ํธ (๊ธฐ์กด) | 3์ฐจ ํ๋ก์ ํธ (๋ณ๊ฒฝ ๋ฒ์ ) |
์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ด์
| ECS Fargate | EKS + Karpenter |
๋ฐฐํฌ ์ฒด๊ณ | Jenkins + Terraform | GitHub Actions(CI) + ArgoCD(CD) |
์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ | Eureka | K8s Service + Istio Mesh |
ํธ๋ํฝ ๋ผ์ฐํ
| Spring Cloud Gateway | Istio Ingress Gateway + Envoy |
App ์ค์ ๊ด๋ฆฌ | Config Server | Helm Values + ConfigMap/Secret |
์ด๋ฒคํธ ์์คํ
| - | Kafka(MSK) ๋์
(๊ฒฐ์ ์๋น์ค, ๋ก๊ทธ ํ์ดํ๋ผ์ธ) |
๊ด์ฐฐ์ฑ | CloudWatch ์ค์ฌ | Prometheus + Grafana + Loki + Tempo |
๋ฐฐํฌ ์ ๋ต | Blue/Green | Canary Deployment (Istio ๊ธฐ๋ฐ) |
3. ๋คํธ์ํฌ ๊ตฌ์กฐ
โข
2์ฐจ ํ๋ก์ ํธ์ ๋์ผํ 2-AZ ๊ตฌ์ฑ
โข
Public, Private(Application), Private(Database) Subnet์ ๋ถ๋ฆฌํ์ฌ ํธ๋ํฝ ๋ฐ ๋ณด์ ๊ณ์ธตํ
โฆ
๊ธฐ์กด๊ณผ ๋์ผ
โข
Istio Ingress Gateway๋ LoadBalancer Service์ด๋ฉฐ, AWS NLB ์์ฑ
โข
๋ชจ๋ ์๋น์ค ๊ฐ ํต์ ์ Envoy Sidecar๋ฅผ ํตํด ์ฒ๋ฆฌ
๊ตฌ๋ถ | ์ญํ | ๊ตฌ์ฑ ๊ณํ |
Public Subnet | ์ธ๋ถ ๋
ธ์ถ์ฉ ๋ฆฌ์์ค | - ALB(Grafana, ArgoCD)
- NLB(Istio Ingress Gateway)
- NAT |
Private Subnet(Application) | ๋ด๋ถ ์๋น์ค | EKS Worker Node |
Private Subnet(Database) | ๋ฐ์ดํฐ ๋ฆฌ์์ค | RDS, Redis, MSK |
Routing | IGW / NAT | Outbound โ NAT |
DNS | Route53 + ACM | HTTPS ํต์ ๊ธฐ๋ฐ ์ธ์ฆ์ ๊ด๋ฆฌ |
4. ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต
๊ตฌ์ฑ ์์
์์ | ์ค๋ช
|
EKS Cluster | ๋ชจ๋ MSA ์๋น์ค์ ๋ฐํ์ ํ๊ฒฝ |
NodeGroup + Karpenter Autoscaling | On-demand ์ต์ ๊ตฌ์ฑ + Karpenter ํตํ Autoscaling |
Pod / Deployment / Service | ๋ด๋ถ ์๋น์ค๋ค์ ClusterIP๋ฅผ ํตํด ๋
ธ์ถ |
Istio (Service Mesh) | mTLS, Traffic Splitting, Routing, Circuit Breaker |
Envoy Sidecar | Pod ๊ฐ ํต์ ํ๋ก์ |
Helm Charts | Microservice ํ
ํ๋ฆฟ ๊ด๋ฆฌ |
ArgoCD | GitOps ๊ธฐ๋ฐ ์ง์์ ๋ฐฐํฌ(CD) |
์๋น์ค ํ๋ฆ
Client โ Route53 โ Istio Ingress Gateway โ Envoy Sidecar
โ K8s Service โ Microservice Pod
โ RDS / Redis / MSK(Kafka)
โ Envoy Sidecar โ Istio Ingress Gateway โ Client ์๋ต
Plain Text
๋ณต์ฌ
5. ๋ฐ์ดํฐ ๊ณ์ธต
โข
๊ธฐ์กด๊ณผ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์งํ๋ฉฐ, MSK(Kafka)๋ฅผ ๋์
ํ์ฌ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฉ์์ง ์ฒ๋ฆฌ
๊ตฌ์ฑ์์ | ์ค๊ณ ์๋ |
RDS (PostgreSQL) | Multi-AZ ๊ตฌ์ฑ (Writer: AZ-a, Standby: AZ-b, Reader ๋ค์ค ๊ตฌ์ฑ) |
Redis (ElastiCache) | - Session Redis (์ธ์
+ ๋น์์ ๋ฐ์ดํฐ ์ ์ฅ์)
- Cache Redis (์บ์ ์ ์ฅ์) |
MSK (Kafka) | - ๊ฒฐ์ (Payment) ์๋น์ค ์ ์ฉ
- ๋ก๊ทธ ํ์ดํ๋ผ์ธ ์ ์ฉ |
S3 | - ์ด๋ฏธ์ง ์ ์ฅ์ ๋ฐ ์ ์ ์ค๋ธ์ ํธ ์ ์ฅ
- VPC Endpoint ํตํ ์ฌ์ค ์ฐ๊ฒฐ ๊ตฌ์ฑ |
6. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ - MSK
MSK(Kafka)๋ ๊ฒฐ์ ์น์ธ ๊ฒฐ๊ณผ๋ฅผ ๋น๋กฏํ ์ฃผ๋ฌธยท์ํยท์ฟ ํฐ ์๋น์ค ๊ฐ SAGA ๋ณด์ ํธ๋์ญ์
์ ๊ตฌํํ๊ธฐ ์ํ ํต์ฌ ๋ฉ์์ง ํ๋ซํผ์ผ๋ก ์ฌ์ฉํ๋ค.
๋ณธ ํ๋ก์ ํธ์์๋ ๊ฒฐ์ ์๋น์ค ์ค์ฌ์ ๋ถ๋ถ ๋์
์ ์์์ผ๋ก, ์ ์ง์ ์ผ๋ก EDA๋ฅผ ํ์ฅํ๋ค.
6.1 ๋์ ๋ฐฐ๊ฒฝ
๋ชฉ์ | ์ค๋ช
|
SAGA ๋ณด์ ํธ๋์ญ์
์ฒ๋ฆฌ | ๊ฒฐ์ ์น์ธ ์คํจ ์ ์ฃผ๋ฌธ/์ฌ๊ณ /์ฟ ํฐ ์๋ณต ์ฒ๋ฆฌ |
์๋น์ค ๊ฐ ๊ฐ๊ฒฐํฉ ์ ๊ฑฐ | ๋๊ธฐ HTTP ํธ์ถ ์ ๊ฑฐ โ ๋น๋๊ธฐ ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ |
์ฅ์ ์ ํ ์ฐจ๋จ | ์ธ๋ถ ์๋น์ค ์คํจ๊ฐ ์ฃผ๋ฌธ ์๋น์ค๊น์ง ์ ํ๋์ง ์๋๋ก ๊ฒฉ๋ฆฌ |
6.2 ์ด๋ฒคํธ ํ๋ฆ
๊ฒฐ์ ์น์ธ ์ฑ๊ณต ํ๋ฆ
1.
payment-service โ payments-paid ๋ฐํ
2.
order-service consume โ ์ฃผ๋ฌธ ์ํ PREPARING ๋ก ๋ณ๊ฒฝ
๊ฒฐ์ ์น์ธ ์คํจ(๋ณด์ ํ๋ฆ)
1.
payment-service โ payments-failed ๋ฐํ
2.
order-service consume โ ์ฃผ๋ฌธยท์ฟ ํฐ ์๋ณต (idempotent)
3.
order-service โ orders-failed ๋ฐํ
4.
product-service consume โ ์ฌ๊ณ ๋กค๋ฐฑ
6.3 Topic ์ค๊ณ
์ด๋ฒคํธ | Topic ๋ช
| ๋ฐํ ์ฃผ์ฒด | ์๋น ์ฃผ์ฒด |
๊ฒฐ์ ์น์ธ ์ฑ๊ณต | payments-paid | payment-service | order-service |
๊ฒฐ์ ์น์ธ ์คํจ | payments-failed | payment-service | order-service |
์ฃผ๋ฌธ ๋ณด์ ์คํจ | orders-failed | order-service | product-service |
6.4 Kafka ํด๋ฌ์คํฐ ๊ตฌ์ฑ
ํญ๋ชฉ | ๊ฐ | ์ด์ |
Broker ๊ฐ์ | 3๊ฐ | Quorum(2) ํ๋ณด, ๊ณ ๊ฐ์ฉ์ฑ |
Partition ์ | 3๊ฐ | Broker ์์ ๋ฐฐ์ โ Leader ๋ถ์ฐ |
Replica ์ | 3๊ฐ | ์ฅ์ ์์๋ ๋ฉ์์ง ์ ์ค ๋ฐฉ์ง |
๋ณด๊ด ๊ธฐ๊ฐ | 7์ผ | ๋น์ ์ ์ด๋ฒคํธ ์ฌ์ฒ๋ฆฌ ๋๋น |
6.5 Consumer Group ์ ๋ต
โข
์๋น์ค๋ณ 1 Consumer Group
โฆ
์ฃผ๋ฌธ(Rebalancing) ๋ฌธ์ ๋ฅผ ์ค์ด๊ณ ์์ ์ ์ธ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ์ํด
order-service-group, product-service-group ํํ๋ก ๊ตฌ์ฑ
โข
๊ฐ์ ๊ทธ๋ฃน ๋ด์์๋ ๋ฉ์์ง ๋ณ๋ ฌ์ฑ = Partition ์
โฆ
ํ์ฌ Partition=3 โ 3๊ฐ ์ธ์คํด์ค๊น์ง ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
โข
Exactly Once ๋ณด์ฅ
โฆ
Consumer๋ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌ ์ฑ๊ณต ์ ๋ช
์์ ์ผ๋ก Commit
โฆ
์คํจ ์ Commitํ์ง ์๊ณ DLQ๋ก ์ด๋ โ ์ฌ์ฒ๋ฆฌ ๊ฐ๋ฅ
6.6 DLT (Dead Letter Topic)
Kafka์์ Consumer๊ฐ ๋ฉ์์ง ์ฒ๋ฆฌ์ ์คํจํ ๊ฒฝ์ฐ, ํด๋น ๋ฉ์์ง๋ DLT(Dead Letter Topic)
์ผ๋ก ์ด๋ํ๋ฉฐ ์ฌ์ฒ๋ฆฌ ๋๋ ์๋ ๋ณต๊ตฌ๋ฅผ ์ํ ๊ทผ๊ฑฐ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋๋ค.
DLT ์ ์ฉ ํฌ์ธํธ
์คํจ ์์น | DLT ํ์ฉ ์ด์ |
order-service (payments-failed ์ฒ๋ฆฌ ์คํจ) | ์ฃผ๋ฌธ/์ฟ ํฐ ์๋ณต ์คํจ ์ ๋ฐ๋์ ์ฌ์ฒ๋ฆฌ ํ์ |
product-service (orders-failed ์ฒ๋ฆฌ ์คํจ) | ์ฌ๊ณ ์๋ณต ์คํจ ์ ๋น์ฆ๋์ค ์ฅ์ ์ ๋ฐ |
DLT ๋ฉ์์ง ์คํค๋ง
1) payments.failed ์ฒ๋ฆฌ ์คํจ ์ด๋ฒคํธ
ํ๋ | ๋ด์ฉ |
orderId | ์ฃผ๋ฌธ ID |
paymentKey | PG ๊ฒฐ์ ํค |
errorSource | order-service or product-service |
errorCode | ๋ด๋ถ ์๋ฌ ์ฝ๋ |
errorMessage | ์ค๋ฅ ๋ฉ์์ง2) orders-failed ์ฒ๋ฆฌ ์คํจ |
timestamp | ์คํจ ๋ฐ์ ์๊ฐ |
2) orders.failed ์ฒ๋ฆฌ ์คํจ ์ด๋ฒคํธ
ํ๋ | ๋ด์ฉ |
orderDetailId | ์ฃผ๋ฌธ ์์ธ ID |
optionValueId | ์ต์
ID |
quantity | ์๋ณตํด์ผ ํ๋ ์๋ |
paymentKey | PG ๊ฒฐ์ ํค |
errorSource | order-service or product-service |
errorCode | ๋ด๋ถ ์๋ฌ ์ฝ๋ |
errorMessage | ์ค๋ฅ ๋ฉ์์ง |
DLT ํ์ฉ ์ ๋ต
1.
DLT Consumer๋ฅผ ํตํ ์๋ ์ฌ์ฒ๋ฆฌ
โข
์ผ์์ ์ฅ์ (์ ๊น์ DB ๋ฝ, ๋คํธ์ํฌ ์ง์ฐ ๋ฑ)๋ ์ฌ์ฒ๋ฆฌ ์ ์ฑ๊ณต ๊ฐ๋ฅ
โข
์ฃผ๋ฌธ/์ฌ๊ณ ์์คํ
๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ํด ๋ฐ๋์ ํ์
2.
์ด์์ ์๋ ์ฌ์ฒ๋ฆฌ
โข
๊ตฌ์กฐ์ ์ฅ์ (๋
ผ๋ฆฌ์ ์ค๋ฅ, ์คํค๋ง ๋ฌธ์ ๋ฑ)๋ ์๋ ์กฐ์น ํ์
3.
DLT ๋ชจ๋ํฐ๋ง
โข
Grafana / CloudWatch์์ DLT ์ ์ฌ๋์ ๋ชจ๋ํฐ๋งํด ์ด์ ์ฅ์ ์กฐ๊ธฐ ๊ฐ์ง
โข
ํน์ Topic์ DLT ์ฆ๊ฐ = ํน์ ์๋น์ค ์ฅ์ ๋ก ๋ณผ ์ ์์
6.7 ๋ฉฑ๋ฑ์ฑ(Idempotency) ์ ๋ต
์ค๋ณต ๋ฉ์์ง ์ฒ๋ฆฌ ๋ฐ ์ค๋ณต ๊ฒฐ์ ์คํ ๋ฐฉ์ง๋ฅผ ์ํ ๋ฉฑ๋ฑ์ฑ ์ฒ๋ฆฌ ์ ๋ต.
1) ๊ฒฐ์ ํ๊ธฐ API ๋ฉฑ๋ฑ์ฑ โ Toss Idempotency-Key
โข
ํด๋ผ์ด์ธํธ์์ UUIDv4 ๊ธฐ๋ฐ ๋ช
๋ฑํค Idempotency-Key ์์ฑ ๋ฐ ์ ๋ฌ
โข
ํ ์คํ์ด๋จผ์ธ ๊ฐ ์๋ฒ ๋ด๋ถ์ ์ผ๋ก ๋ฉฑ๋ฑ ์ฒ๋ฆฌ
โข
ALREADY_PROCESSED_PAYMENT ์๋ต ์ โ ๋ณด์ ํธ๋์ญ์
์คํ ๊ธ์ง
2) Consumer ๋ฉฑ๋ฑ์ฑ
โข
Kafka ๋ฉ์์ง๋ At-Least-Once๊ฐ ๊ธฐ๋ณธ์ด๋ฏ๋ก ๋์ผ ๋ฉ์์ง๊ฐ ์ค๋ณต ์ ๋ฌ๋ ๊ฐ๋ฅ์ฑ ์กด์ฌ
โข
Consumer๋ DB ์ํ ๊ธฐ๋ฐ ๋ฉฑ๋ฑ์ฑ ์ฒดํฌ ํ์
์์ (order-service):
if (order.status == FAILED) return
if (order.status == PREPARING) return
Java
๋ณต์ฌ
6.8 Producer ๋ฐํ ์คํจ ์ฒ๋ฆฌ
๋ฐฉ์ 1) Transactional Outbox Pattern
DB ์
๋ฐ์ดํธ + Event ์ ์ฅ์ ํ๋์ ํธ๋์ญ์
์ผ๋ก ๋ฌถ์ด ์์์ฑ ๋ณด์ฅ
์ฅ์ :
โข
Kafka ์ฅ์ ์๋ ๋ฐ์ดํฐ ์ ์ค ์์
โข
์ฌ์ฒ๋ฆฌ ๊ฐ๋ฅ
๋ฐฉ์ 2) ๋ฐํ ์คํจ ์ฌ์๋ ํ ์ด๋ธ + ์ค์ผ์ค๋ฌ
โข
publishStatus = FAILED ๋งํน
โข
์ค์ผ์ค๋ฌ๊ฐ 1๋ถ ๊ฐ๊ฒฉ ์ฌ์๋
โข
Exponential Backoff ์ ์ฉ ๊ฐ๋ฅ
6.9 PENDING ์ฅ๊ธฐ ์ฒด๋ฅ ์ฃผ๋ฌธ ์ค์ผ์ค๋ฌ
๊ฒฐ์ ์ง์ฐยท์ธ๋ถ ์๋น์ค ์ค๋ฅ๋ก ์ธํด 5๋ถ ์ด์ PENDING ์ํ๋ก ๋จ์์๋ ์ฃผ๋ฌธ ์ ๋ฆฌ ๋ก์ง
์คํ ์ ๋ต
โข
์ค์ผ์ค ์ฃผ๊ธฐ: 1๋ถ
โข
ํ์์์ ๊ธฐ์ค: 5๋ถ
์ฒ๋ฆฌ ๋ฐฉ์
1.
5๋ถ ์ด์ PENDING ์ฃผ๋ฌธ ์กฐํ
2.
์ฃผ๋ฌธ ์ํ FAILED๋ก ๋ณ๊ฒฝ
3.
์ฟ ํฐ / ์ฌ๊ณ ๋กค๋ฐฑ ์์ฒญ ๋ฐํ
4.
DB ์
๋ฐ์ดํธ ํ Kafka์ ๋ณด์ ์ด๋ฒคํธ ๋ฐํ
๊ฐ์ ๋ฐฉ์
1.
์ธ๋ถ ์์คํ
ํธ์ถ์ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์ ํ (์ต์ ๋ฐฉ์)
โข
์ฃผ๋ฌธ ์๋น์ค๋ DB ์
๋ฐ์ดํธ + Kafka ์ด๋ฒคํธ ๋ฐํ์ผ๋ก ์์
์ข
๋ฃ
โข
product/payment ์๋น์ค๊ฐ ํ ํฝ์ ๊ตฌ๋
ํ์ฌ ์์ฒด์ ์ผ๋ก ๋กค๋ฐฑ ์คํ
โข
์๋ต ๋๊ธฐ ์๊ฐ์ด ์์ผ๋ฏ๋ก ์์ ์ฑ + ์ฑ๋ฅ ๊ฐ์
2.
์ฒญํฌ ์ฒ๋ฆฌ (๋๋ ์ฃผ๋ฌธ ๋๋น)
โข
PENDING ์ฃผ๋ฌธ์ ์ ์ฒด ์กฐํํ์ง ์๊ณ chunk ๋จ์๋ก ์ฒ๋ฆฌ
โข
์์คํ
๋ถํ ๊ฐ์
โข
์คํจ ์ ํน์ chunk๋ง ์ฌ์ฒ๋ฆฌ ๊ฐ๋ฅ
7. CI/CD ํ์ดํ๋ผ์ธ
GitOps ํ์ดํ๋ผ์ธ ๋ค์ด์ด๊ทธ๋จ
GitHub Actions (CI)
โข
Lint โ Build โ Test โ Docker Build โ ECR Push
โข
Helm values ์
๋ฐ์ดํธ
ArgoCD (CD)
โข
GitOps Repo ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก EKS ์ํ ์๋ ๋๊ธฐํ
โข
Health/Sync ์๋ ๊ด๋ฆฌ
โข
Helm-Based Release ๊ด๋ฆฌ
โข
๋ฐ์ดํฐ ๋ณด์กด์ ์ํ EBS Volume ๋๋ EFS Volume ๋ง์ดํธ ๊ณ ๋ ค
โฆ
ArgoCD๋ GitOps ๊ธฐ๋ฐ์ stateless ์ด์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฏ๋ก ๋ณ๋์ EBS/EFS ๋ง์ดํธ ๋ถํ์
โฆ
ArgoCD๋ Kubernetes ๋ฆฌ์์ค๋ฅผ Git ์ ์ฅ์๋ฅผ ํตํด ์ฌ์์ฑํ ์ ์์ผ๋ฏ๋ก,
EKS ํด๋ฌ์คํฐ ์ฌ์์ฑ ์์๋ Git ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ฒด ์ํ ๋ณต๊ตฌ ๊ฐ๋ฅ
8. ๋ฐฐํฌ ์ ๋ต - Canary
์ฐ์ ์ ์ผ๋ก๋ Istio VirtualService ๊ธฐ๋ฐ์ ์๋ Canary ๋ฐฉ์์ผ๋ก ์ด์
๋์ ๋ฐฐ๊ฒฝ
โข
Blue/Green ๋๋น ๋ ์์ ํ ์ ์ง์ ๋ฐฐํฌ ์ ๊ณต
โข
Istio VirtualService ๊ธฐ๋ฐ ํธ๋ํฝ ๋ถํ ๊ฐ๋ฅ
โข
์๋น์ค ์์ ์ฑ ํ๋ณด๋ฅผ ์ํ ์ ์ง์ ๊ฒ์ฆ
โข
GitOps ๊ธฐ๋ฐ ๋ฐฐํฌ ์ด๋ ฅ ๋ณด์กด
8.1 ๋ฐฐํฌ ํ๋ฆ
1.
์ ๊ท ๋ฒ์ ๋ฐฐํฌ
2.
DestinationRule์ ํตํ v1/v2 Subset ์ ์
3.
VirtualService ๊ธฐ๋ฐ Canary ํธ๋ํฝ ์ค์
โข
v1: 90%, v2: 10%
4.
Grafana + Tempo + Loki ๊ธฐ๋ฐ ๋ชจ๋ํฐ๋ง
โข
Latency/Error, Log, Trace
5.
์ค๋ฅ ์ Rollback
โข
v1 = 100%
6.
์ ์ ๋์ ์ ํธ๋ํฝ ํ๋
โข
10 โ 30 โ 50 โ 100
8.2 Canary ๋ฐฐํฌ ๋จ๊ณ
๋จ๊ณ | ํธ๋ํฝ ๋น์จ | ์ํ ํญ๋ชฉ | ์ฑ๊ณต ๊ธฐ์ค |
Phase 0 | 0% โ 10% | ์ ๊ท ๋ฒ์ (v2) ๋ฐฐํฌ, VirtualService weight 10% ์ ์ฉ | Pod Ready 100%, ์ค๋ฅ ์์ |
Phase 1 | 10% โ 30% | ์ฃผ์ API ์๋ต ๊ฒ์ฆ | Latency ์ฆ๊ฐ < 200ms, Error Rate < 1% |
Phase 2 | 30% โ 50% | ์ค์ ์ฌ์ฉ์ ํธ๋ํฝ ์ ์ง์ ๋ฐ์ | 5xx < 0.3%, Business Error < 1% |
Phase 3 | 50% โ 100% | ์ ์ฒด ํธ๋ํฝ ์ ํ | Pod ์์ ํ, ๋ก๊ทธ ์ด์ ์์ |
8.3 Canary ์คํจ ๊ธฐ์ค (Rollback ์กฐ๊ฑด)
Rollback์ ์ฆ์ VirtualService๋ฅผ Stable(v1)๋ก ์ ํํ์ฌ ์ฒ๋ฆฌํ๋ค.
๋ถ๋ฅ | ์กฐ๊ฑด |
HTTP ์ค๋ฅ์จ | 5xx ๋น์จ 3% ์ด์ (1๋ถ ํ๊ท ) |
Latency ์ฆ๊ฐ | ํ๊ท ์๋ต์๋ 200ms ์ด์ ์ฆ๊ฐ |
์ ํ๋ฆฌ์ผ์ด์
์ค๋ฅ์จ | Business Error 1% ์ด์ |
Readiness ์คํจ | ์ ๊ท Pod Ready ์คํจ |
๋ฆฌ์์ค ์๊ณ์น | CPU > 80%, Memory > 85% |
8.4 ๊ตฌ์ฑ ์์
์์ | ์ญํ |
Deployment (v1/v2) | ๋ฒ์ ๋ณ Pod |
DestinationRule | Subset ์ ์ (labels ๊ธฐ๋ฐ) |
VirtualService | ํธ๋ํฝ ๋น์จ ์กฐ์ |
Envoy Sidecar | ์ค์ ํธ๋ํฝ ๋ถ๋ฐฐ ์ํ |
ArgoCD Sync | GitOps ๊ธฐ๋ฐ ์๋ ๋ฐฐํฌ |
8.5 ๊ณ ๋ ค์ฌํญ (Manual Canary ์ด์ ๊ด์ )
ํญ๋ชฉ | ์ค๋ช
|
Observability | Grafana / Loki / Tempo ํตํฉ ํ์ |
Sticky Session | ์ธ์
์ผ๊ด์ฑ ํ๋ณด๊ฐ ํ์ํ API์ ๋ํ Session Redis ํธํ์ฑ ๊ฒ์ฆ ํ์ |
ํ
์คํธ ์๋ํ ํ์์ฑ | Canary ๋จ๊ณ๋ณ ๊ฒ์ฆ์ ์ํ k6/JMeter ๋ฑ์ API Test ๊ตฌ์ฑ ๊ณ ๋ ค |
Resource Impact | v1/v2 ๋์ ์ด์์ผ๋ก ์ธํ Pod ์ ์ฆ๊ฐ โ HPA/Karpenter |
ํฅํ ํ์ฅ์ฑ | ํ์ฌ๋ ํ๋ก์ ํธ ๊ธฐ๊ฐ ๊ณ ๋ คํ์ฌ ์๋ Canary ์ด์ ๋ฐฉ์ ์ ์ฉ
ํฅ์ Auto Rollback์ ๋์
ํ ๊ฒฝ์ฐ Argo Rollouts + AnalysisTemplate ๊ธฐ๋ฐ ํ์ฅ |
9. ์คํ ์ค์ผ์ผ๋ง ์ ๋ต
9.1 Pod Autoscaling (HPA)
9.1.1 HPA ์ ์ฑ ๊ธฐ์ค
โข
CPU ์ฌ์ฉ๋ฅ > 70%
โข
Memory ์ฌ์ฉ๋ฅ > 75%
โข
Target Metric ๊ธฐ๋ฐ ์๋ ํ์ฅ
โข
Canary ๋ฐฐํฌ์ v1 + v2 Pod ๋์ ์กด์ฌ ๊ณ ๋ ค
โข
Karpenter Node ์์ฑ ์๊ฐ์ ๊ณ ๋ คํ ์ต์ Replica ๋ฒํผ ์ ๋ต ์ ์ฉ
9.1.2 ์๋น์ค๋ณ HPA minReplicas ๋ฒํผ ์ ๋ต
Karpenter์ Node Provisioning ์๊ฐ๋์ ๊ธฐ์กด Pod๊ฐ ๊ณผ๋ถํ๋์ง ์๋๋ก ์ต์ Replica๋ฅผ ์ฌ์ ์๊ฒ ์ ์งํ๋ค.
์๋น์ค ์ ํ | ํธ๋ํฝ ํน์ฑ | ์ด๊ธฐ ๊ตฌ์ฑ minReplica ๋ฒํผ |
Gateway (Ingress) | ์ธ๋ถ ์์ฒญ ์ง์ค, Latency ๋ฏผ๊ฐ | ํ์ Pod์ 150% |
Order / Payment | Latency ๋ฏผ๊ฐ, ์ฅ์ ์ํฅ ํผ | 130~150% |
Product | ๋์ ์กฐํ ๋น๋ | 120~130% |
User | ์ผ๋ฐ API | 120% |
AI | ์ค์๋ ๋ฎ์, ์ฌ์ฉ๋ ์ ์ | 100~110% |
9.1.3 ์๋น์ค๋ณ HPA ์ค์
์๋น์ค | Min~Max | ํน์ง |
Gateway (Ingress) | 3~6 | ์์ฒญ ์ง์ค ๊ตฌ๊ฐ, ์์ ์ฑ ์ค์ |
User/Product | 2~10 | ์กฐํ ์ค์ฌ, ํธ๋ํฝ ๋ณ๋ํญ ํผ |
Order/Payment | 2~5 | ์ฃผ๋ฌธ/๊ฒฐ์ ์ค์ฌ, ์์ ์ฑ ์ค์ |
AI | 1~2 | ์ต์ ์ ์ง |
9.1.4 Requests / Limits
โข
์์ - GPT ์ถ์ฒ๊ฐ / ์ถํ ๋ชจ๋ํฐ๋ง ๋ฐ์ ์กฐ์
์๋น์ค | CPU Request | CPU Limit | Memory Request | Memory Limit |
Gateway | 250m | 500m | 512Mi | 1Gi |
User/Product | 200m | 400m | 256Mi | 512Mi |
Order | 200m | 500m | 512Mi | 1Gi |
Payment | 300m | 600m | 512Mi | 1Gi |
AI | 100m | 300m | 256Mi | 512Mi |
9.2 NodeAutoscaling (Karpenter)
โข
Karpenter๋ฅผ ๋์
ํ์ฌ ์๋ Node Provisioning์ ๋ชฉํ๋ก ํจ
9.2.1 Karpenter ๋์ ๋ฐฐ๊ฒฝ
๋ฌธ์ | ์ค๋ช
|
ECS / ๊ธฐ์กด EKS์ ํ๊ณ | Pod ์ฆ๊ฐ ์ NodeGroup์ scale-out ์๋๊ฐ ๋๋ฆผ |
๊ณ ์ ๋
ธ๋ ๋น์ฉ ๋ฐ์ | ํญ์ Node๋ฅผ ์ ์งํด์ผ ํด์ ๋น์ฉ ์ฆ๊ฐ |
Canary ๋ฐฐํฌ ์ Pod ์ผ์ ์ฆ๊ฐ | Canary ์คํ ์ v1+v2 Pod ๋์ ์ด์ โ ๋
ธ๋ ๋ถ์กฑ ๋ฐ์ |
ํธ๋ํฝ ๋ณ๋์ฑ | Product, Order ์๋น์ค์ ํธ๋ํฝ ๋ณ๋ ํญ์ด ํผ |
9.2.2 Karpenter ๋์ ํ๋ฆ
HPA๊ฐ Pod ์ฆ๊ฐ
โ ๊ธฐ์กด Node capacity ๋ถ์กฑ โ Pod Pending ๋ฐ์
โ Node Provisioning (Karpenter)
โ Pod Scheduling ์๋ฃ
โ ํธ๋ํฝ ๊ฐ์ โ Idle Node ๋ฐ์
โ Idle Node ์๋ ์ ๊ฑฐ (Consolidation)
Plain Text
๋ณต์ฌ
9.2.3 Autoscaling ๊ณ ๋ ค์ฌํญ
โข
Karpenter Provisioning ์๊ฐ๋์ ๊ธฐ์กด Pod์ ๊ณผ๋ถํ ๋ฐฉ์ง๋ฅผ ์ํ minReplicas ๋ฒํผ ์ ์ฉ
โข
Canary ๋ฐฐํฌ ์ v1/v2 Replica ๋์ ์ฆ๊ฐ โ Karpenter ์ฆ๊ฐ ํ์ฅ ํ์
โข
ํธ๋ํฝ ๊ฐ์ ์ Consolidation์ ํตํด ๋น์ฉ ์ต์ํ
โข
Pod ์์ฒญ(Request)์ด ๋ฎ๊ฒ ์กํ๋ฉด ๊ณผ๋ํ ํ์ฅ ๋ฐ์ํ๋ฏ๋ก ์ ์ ํ Request ํ์
โข
Spot Instance ์ฌ์ฉ ๊ณ ๋ ค
10. Observability
10.1 ๊ตฌ์ฑ์์
๊ณ์ธต | ๊ตฌ์ฑ ์์ | ์ญํ |
Metrics | Prometheus | ์ ํ๋ฆฌ์ผ์ด์
ยทIstioยทNode ๋ฉํธ๋ฆญ ์์ง |
Logs | Fluentbit โ Loki | stdout ๋ก๊ทธ ์์ง ๋ฐ ์ ์ฅ |
Tracing | Envoy / Spring Boot OTel โ OTel Collector โ Tempo | ๋ถ์ฐ ํธ๋ ์ด์ฑ ์ ์ฅ |
Dashboard | Grafana | Metrics / Logs / Tracing ์๊ฐํ |
Infra Logs | CloudWatch Logs | Node, Control Plane, EKS Infra ๋ก๊ทธ ์ ์ฅ |
10.2 Metrics ์์ง ํ๋ฆ
10.2.1 ์ ํ๋ฆฌ์ผ์ด์ / ์๋น์ค ๋ฉํธ๋ฆญ
โข
Spring Boot Actuator์ /actuator/prometheus ํ์ฉ
โข
Prometheus Operator๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํธ๋ฆญ ์์ง
โข
์๋น์ค๋ณ ServiceMonitor๋ฅผ ํตํด Scrape
๋ฐ์ดํฐ ํ๋ฆ:
Application Pod (/actuator/prometheus)
โ ServiceMonitor
โ Prometheus
โ Grafana
Plain Text
๋ณต์ฌ
10.2.2 Istio (Envoy) ๋ฉํธ๋ฆญ
โข
Istio Telemetry v2 ํ์ฑํ
โข
Prometheus๊ฐ Istio์ Envoy Proxy๋ฅผ Scrape
โข
ServiceMonitor ํ์ฉ
Envoy SideCar
โ Prometheus (ServiceMonitor)
โ Grafana (Istio Dashboard)
Plain Text
๋ณต์ฌ
10.2.3 Node / ์์คํ ๋ฉํธ๋ฆญ
โข
๊ตฌ์ฑ์์
โฆ
kube-state-metrics
โฆ
node-exporter (PodMonitor ํ์ฉ)
โข
์์ง ์งํ
โฆ
CPU / Memory
โฆ
Pod ์ํ
โฆ
Node ์ํ / Disk I/O
โฆ
๋คํธ์ํฌ ๋ฑ ์ธํ๋ผ ์์ ์ํ ๋ชจ๋ํฐ๋ง
10.3 Logs ์์ง ํ๋ฆ
๊ตฌ์ฑ ์์
โข
FluentBit DaemonSet
โข
Loki
โข
S3
๋ก๊ทธ ํ๋ฆ
Container stdout/stderr
โ Fluentbit
โ Loki โ S3
โ Grafana
Plain Text
๋ณต์ฌ
Fluentbit ์ฃผ์ ํํฐ
โข
JSON Log Parser
โข
Level ํํฐ
10.4 Tracing ์์ง ํ๋ฆ
Tracing์ Envoy(๋คํธ์ํฌ ๋ ๋ฒจ) + Application(๋น์ฆ๋์ค ๋ ๋ฒจ) ๋ชจ๋ ์์งํ๋ฉฐ, OTel Collector๋ฅผ ๊ฑฐ์ณ Tempo์ ์ ์ฅ
10.4.1 Envoy โ Tempo(Zipkin)
1.
Envoy๊ฐ Zipkin ํฌ๋งท์ผ๋ก Trace ์์ฑ
โข
Istio Proxy(Envoy)๋ Zipkin ํฌ๋งท Trace๋ฅผ ๊ธฐ๋ณธ ์ง์
โข
Ingress Gateway, Sidecar ๋ชจ๋ Span ์์ฑ
2.
OTel Collector๊ฐ Zipkin ํฌ๋งท ์์
โข
Collector์ Zipkin Receiver๊ฐ Envoy์์ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ์์
โข
๋ด๋ถ์ ์ผ๋ก OTLP๋ก ๋ณํ โ Tempo๋ก Export
3.
Collector์์ Tempo๋ก Export
๋ฐ์ดํฐ ํ๋ฆ
Envoy (Zipkin)
โ OTel Collector (zipkin receiver)
โ OTel Collector (otlp exporter)
โ Tempo
โ Grafana
Plain Text
๋ณต์ฌ
10.4.2 Application โ Tempo (OTLP)
Java ์๋น์ค๋ฅผ OpenTelemetry Java Agent๋ก ๊ตฌ์ฑํ์ฌ OTLP/gRPC๋ก Trace ์ ์ก
Application (OTLP โ grpc)
โ OTel Collector (otlp receiver)
โ Tempo (otlp exporter)
โ Grafana
Plain Text
๋ณต์ฌ
10.4.3 End-to-End ํธ๋ ์ด์ฑ
Envoy Span๊ณผ Application Span์ ๋์ผ Trace ID๋ฅผ ๊ณต์ ํ์ฌ ํ๋์ ์ ์ฒด ํธ๋์ญ์
ํ๋ฆ์ผ๋ก ๊ฒฐํฉ๋๋ค.
11. ๊ณ ๊ฐ์ฉ์ฑ & ์ฅ์ ๋ณต๊ตฌ ์ ๋ต
โข
EKS Multi-AZ NodeGroup ์ด์
โข
RDS Multi-AZ Failover
โข
Redis Multi-AZ
โข
ArgoCD Rollback
โข
S3 Versioning
โข
Terraform ๊ธฐ๋ฐ ์ธํ๋ผ re-provision
12. ๋น์ฉ ๊ด๋ฆฌ ์ ๋ต
ํญ๋ชฉ | ์ ๋ต |
EKS | NodeGroup ์จ๋๋งจ๋ ์ต์ ์ ์ง + Karpenter ์๋ ํ์ฅ |
Node | Consolidation์ผ๋ก Idle Node ์ต์ํ |
NAT Gateway | Dev/Stage ์ต์ ๊ตฌ์ฑ |
CloudWatch Logs | 15์ผ ๋ณด๊ด |
Redis | ClusterMode Off |
MSK | ๊ฒฐ์ ์๋น์ค ์ค์ฌ ์ต์ ๊ตฌ์ฑ |
ECR | Private ECR ์ฌ์ฉ |




