설명
컨테이너의 메모리 request는 Kubernetes 스케줄러가 노드 배치를 결정하는 기준입니다. 실제 필요한 양보다 낮으면 노드에 워크로드가 과밀 배치되어 메모리 부족 위험이 커질 수 있습니다.
명시적인 request가 없어도 LimitRange가 기본값을 제공할 수 있으며, 별도 기본값이 없고 memory limit만 있으면 Kubernetes는 그 limit을 request로 사용합니다. 선언의 생략과 실제 request 부재를 구분하세요.
잠재적 영향
- 실제 사용량보다 낮은 request는 노드 메모리 경쟁과 성능 저하로 이어질 수 있습니다.
- 메모리 압박으로 파드가 축출되거나 프로세스가 종료될 수 있습니다.
해결 방법
- 각 컨테이너의 실제 사용량과 초기화·최대 부하를 고려해
resources.requests.memory를 정하고 limit과 함께 조정하세요. - LimitRange의 기본값과 ResourceQuota를 검토하고 배포된 파드의 실제 request를 확인하세요. 예제 수치를 모든 워크로드에 그대로 적용하지 마세요.
예시
기존 예제 수치는 설명용이며 실제 배포에는 유지보수되는 이미지를 사용하세요. 별도 request 기본값이 없다는 전제에서 변경 전 memory limit 512Mi는 request에도 사용됩니다.
변경 전
hcl
resource "kubernetes_pod" "pod" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
resources {
limits = {
cpu = "0.5"
memory = "512Mi"
}
}
}
}
}
변경 후
hcl
resource "kubernetes_pod" "pod" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
resources {
limits = {
cpu = "0.5"
memory = "512Mi"
}
requests = {
cpu = "250m"
memory = "50Mi"
}
}
}
}
}
설명:
- 변경 전: 명시적 request가 없지만 memory limit에서 512Mi가 request로 적용될 수 있습니다.
- 변경 후: memory request를 50Mi로 명시합니다. 더 작은 값이 항상 적절한 것은 아니므로 실제 요구량을 확인해야 합니다.