컨테이너에 CPU와 메모리를 얼마나 줄지 정하는 설정은 크게 두 가지입니다. request는 최소 보장을 위한 값이고 limit은 최대 상한선입니다. 이 둘을 어떻게 설정하느냐에 따라 스케줄링과 런타임 동작이 달라집니다


Request는 최소 이만큼은 보장해줘

스케줄러는 pod를 노드에 배치할 때 request를 기준으로 자원을 예약합니다. 즉 이 컨테이너는 최소 이만큼 필요하다는 의미이며, 노드에 request만큼의 여유가 없으면 해당 노드에는 올라가지 못합니다. 또한 request만큼의 자원은 다른 pod가 아무리 바빠도 최소한으로는 확보된다고 이해하면 됩니다

Limit은 최대 이만큼까지만 써라

limit은 컨테이너가 넘을 수 없는 상한입니다. limit을 초과하려고 하면

  • CPU는 쓰로틀링되어 처리량이 제한될 수 있습니다
  • 메모리는 OOM Kill로 컨테이너가 강제 종료될 수 있습니다

비유로 감 잡기

사무실 비유로 보면 request는 예약석이고 limit은 상한선입니다. request 이하에서는 최소 보장이 되므로 문제가 생길 가능성이 낮습니다. request부터 limit 사이에서는 노드에 여유가 있으면 더 사용할 수 있습니다. limit을 넘으면 CPU는 제한될 수 있고 메모리는 OOM Kill로 종료될 수 있습니다

실제 예시 YAML

resources:
  requests:
    cpu: "500m"      # 0.5코어는 보장해줘
    memory: "512Mi"  # 512MiB는 보장해줘
  limits:
    cpu: "1000m"     # 최대 1코어까지만
    memory: "1Gi"    # 최대 1GiB까지만

왜 요즘은 CPU limit을 안 거는 쪽이 많나

요즘은 CPU limit을 제거하고 request만 설정하는 방식을 선호하는 경우가 많습니다. CPU limit을 없애면 노드에 여유가 있을 때 컨테이너가 그 여유분까지 사용할 수 있어, 불필요한 CPU 쓰로틀링을 줄일 수 있습니다. 다만 메모리는 예외로, 메모리 limit을 두는 편이 안전합니다. 메모리 초과는 OOM Kill로 이어질 수 있기 때문입니다


CPU limit 없으면 어떻게 되나

핵심은 request가 스케줄링과 최소 보장에 관여한다는 점입니다. 예를 들어 노드 CPU가 8코어이고 각 pod의 request가 1코어인 상황을 생각해볼 수 있습니다

노드 여유 있을 때

대부분의 시간에는 노드에 여유가 있어서 한 pod가 request보다 더 많이 사용할 수 있습니다. 예를 들어 Pod A가 3코어, Pod B가 0.5코어, Pod C가 0.2코어 정도를 사용해도 전체 합이 8코어를 넘지 않으면 문제 없이 동작합니다

모든 pod가 동시에 폭주하면

모든 pod가 동시에 CPU를 많이 쓰고 싶어지면 커널과 cgroup이 자원을 조정합니다. 이때 각 pod는 request 비율을 기준으로 더 많은 CPU를 배분받을 수 있습니다. 예시에서는 Pod A, Pod B, Pod C가 각각 약 2.67코어씩 받는 형태가 될 수 있으며, request인 1코어보다 더 사용할 수도 있습니다

정리하면 request는 최소 보장을 의미하고, 경쟁이 생겨도 각 pod는 자기 request만큼은 확보됩니다. 남는 자원은 request 비율에 따라 분배된다고 이해하면 됩니다

Limit을 걸었을 때 vs 없을 때

CPU limit을 걸면 노드에 여유가 있어도 pod는 limit 지점에서 멈출 수 있어 CPU throttling이 발생할 수 있습니다. 반대로 CPU limit이 없으면 노드 여유가 있을 때 pod가 그 여유분까지 사용할 수 있어 쓰로틀링이 줄어드는 방향이 됩니다


그럼 진짜 위험한 경우는?

표로 정리하면 pod가 CPU를 독점하는 걱정은 request 기반으로 대부분 완화됩니다. 노드 과부하가 생기더라도 CPU는 대체로 느려짐으로 끝나고, 다른 pod에 미치는 영향도 request가 최소 보장 역할을 하므로 제한적입니다

반면 실제로 더 위험해질 수 있는 지점은 메모리 limit을 설정하지 않는 경우입니다. CPU 초과는 느려짐으로 끝날 수 있지만, 메모리 초과는 OOM Kill로 컨테이너가 종료될 수 있습니다. 그래서 보통은 CPU는 request만 두고 limit은 빼며, 메모리는 반드시 limit을 두는 형태로 정리합니다

resources:
  requests:
    cpu: "500m"       # ✅ 최소 보장
    memory: "512Mi"   # ✅ 최소 보장
  limits:
    # cpu: 안 건다     # ✅ 쓰로틀링 방지
    memory: "1Gi"     # ✅ 반드시 건다 (OOM 방지)