1. 개요
클라우드 환경에서 서비스의 안정성과 성능을 측정하고 보장하는 것은 매우 중요하다. 이를 위해 SLA(Service Level Agreement), SLI(Service Level Indicator), SLO(Service Level Objective) 개념이 사용된다.
Kubernetes에서 이러한 개념을 어떻게 적용하고 관리할 수 있는지 알아보자.
2. SLA, SLI, SLO 개념
2.1. SLA(Service Level Agreement, 서비스 수준 계약)
SLA는 제공자가 고객에게 보장하는 서비스의 품질 수준이다.
주요 특징
- 보통 계약서(Agreement) 형태로 제공
- 서비스 가용성, 응답 시간, 처리량 등에 대한 최소 보장 기준 포함
- SLA를 충족하지 못하면 금전적 보상(크레딧 지급 등) 발생 가능
예시
- AWS EC2 SLA: 월간 가동 시간 99.99% 보장
- Google Kubernetes Engine(GKE) SLA: 99.5% 이상의 가용성 제공
SLA 예제
“본 서비스는 월간 99.95%의 가용성을 보장하며, 이를 충족하지 못할 경우 서비스 크레딧을 제공합니다.”
2.2. SLI(Service Level Indicator, 서비스 수준 지표)
SLI는 서비스의 품질을 측정하는 핵심 지표이다.
주요 특징
- SLA에서 정의한 서비스 품질을 수량화하여 측정
- 보통 **백분율(%)**로 표현됨
- Kubernetes에서 메트릭 기반 모니터링을 통해 측정 가능
대표적인 SLI 예시
SLI 지표 | 설명 |
---|---|
가용성 | 시스템이 정상적으로 응답하는 비율 (%) |
응답 시간 | 요청이 일정 시간 내에 처리되는 비율 (%) |
오류율 | 요청 중 실패한 비율 (%) |
처리량(Throughput) | 초당 처리되는 요청 수 (RPS, QPS) |
SLI 예제
“지난 30일 동안의 요청 중 99.9%가 500ms 이내에 응답을 완료했다.”
2.3. SLO(Service Level Objective, 서비스 수준 목표)
SLO는 서비스가 달성해야 하는 목표 수준으로, SLI에 기반하여 설정된다.
주요 특징
- SLA의 핵심 지표를 내부적으로 관리하기 위한 목표
- 보통 SLA보다 엄격하게 설정하여 여유 공간 확보
- Kubernetes에서는 HPA, 리소스 할당, 모니터링 등을 통해 관리 가능
대표적인 SLO 예시
SLO 목표 | 설명 |
---|---|
가용성 99.9% | 1,000번 중 1번 이하의 장애 허용 |
응답 시간 200ms 이하 (99%) | 99%의 요청이 200ms 이내에 응답 |
오류율 0.1% 이하 | 전체 요청 중 0.1% 미만이 오류 |
SLO 예제
“99.95% 이상의 요청이 300ms 이내에 응답해야 한다.”
3. Kubernetes에서 SLA, SLI, SLO 적용
3.1. SLI 모니터링: Prometheus & Grafana 활용
Prometheus는 Kubernetes에서 SLI 지표를 수집하는 주요 도구이다.
설정 방법
- Prometheus 설치bash복사편집
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus prometheus-community/prometheus
- SLI 측정 쿼리 예시
- 가용성 (HTTP 200 응답 비율)promql복사편집
sum(rate(http_requests_total{status=~"2.."}[5m])) / sum(rate(http_requests_total[5m]))
- 응답 시간 (p95, 95% 요청의 응답 시간)promql복사편집
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
- 가용성 (HTTP 200 응답 비율)promql복사편집
- Grafana 대시보드 설정
- Prometheus 데이터를 시각화하여 SLA/SLO 관리
3.2. SLO 유지: Kubernetes HPA 및 리소스 조정
Kubernetes에서 SLO를 유지하려면 오토스케일링 및 리소스 관리가 필요하다.
1. HPA(Horizontal Pod Autoscaler) 적용
응답 시간이 일정 기준 이상 증가하면 자동으로 Pod를 확장한다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # CPU 사용률 50% 이상이면 확장
2. 리소스 제한 설정
SLO를 초과하는 과부하를 방지하기 위해 리소스를 제한할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-container
image: my-app:latest
resources:
requests:
cpu: "500m" # 최소 0.5 vCPU
memory: "256Mi" # 최소 256Mi 메모리
limits:
cpu: "1000m" # 최대 1 vCPU
memory: "512Mi" # 최대 512Mi 메모리
3.3. SLA 위반 감지 및 알림 설정
SLI가 SLO를 초과하면 알림을 받을 수 있도록 설정해야 한다.
- Prometheus Alertmanager 설정
- SLA 위반 감지 시 Slack 또는 이메일 알림
groups:
- name: SLA
alerts:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.01
for: 5m
labels:
severity: critical
annotations:
summary: "서비스 오류율 증가"
description: "5분 동안의 오류율이 1%를 초과함"
- Alertmanager 알림 설정
receivers:
- name: "slack"
slack_configs:
- channel: "#alerts"
send_resolved: true
text: "{{ .CommonAnnotations.description }}"
4. 결론
- SLA: 서비스 제공자가 고객과 맺는 계약
- SLI: 서비스 품질을 측정하는 지표
- SLO: 목표 수준을 설정하여 SLI를 관리
Kubernetes에서는 Prometheus로 SLI를 측정하고, HPA로 SLO를 유지하며, Alertmanager로 SLA 위반을 감지할 수 있다. 이를 통해 안정적인 서비스 운영이 가능하다.