본문 바로가기
쿠버네티스

[쿠버네티스] Pod Resource 할당(Request, Limit)

by woo0doo 2025. 3. 2.

Pod의 Resource를 제한하지 않을 경우 발생할 수 있는 문제

1) starvation

리소스를 제한하지 않으면 해당 노드에 할당된 컨테이너는 노드의 리소스를 전부 다 사용할 수 있습니다. 따라서 만약 리소스 제한을 두지 않고 특정 호스트에 Pod를 두 개 이상 띄웠을 경우, 하나의 Pod가 노드의 모든 리소스를 사용한다면 새로운 Pod가 스케줄링될 수 없습니다.

 

2) 보안 관련 이슈

만약 특정 Pod에 보안 관련 버그가 발생해서 해커가 해당 Pod에 디도스 공격을 주어 노드의 모든 리소스를 사용하게 된다면, 다른 Pod들은 스케줄링될 수 없다.

 

** 따라서 Pod 하나를 띄우더라도 해당 Pod가 리소스를 얼마나 사용할지를 결정하여 limit를 적절하게 걸어주어야 합니다.

 

 

1. 리소스 요청 (Requests)

  • 정의:
    컨테이너가 안정적으로 실행되기 위해 "예약"하는 최소 자원의 양을 지정합니다.
  • 스케줄링 역할:
    스케줄러는 Pod를 노드에 할당할 때 각 컨테이너의 요청 값만큼의 자원이 해당 노드에 존재하는지를 확인합니다. 예를 들어, CPU 요청이 100m, 메모리 요청이 128Mi로 설정되었다면, 스케줄러는 이 노드에 최소한 이 정도의 여유 자원이 있는지를 확인합니다.

ex)

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: resource-demo-ctr
    image: nginx:1.14
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      requests:
        cpu: 100m
        memory: 125Mi

2. 리소스 제한 (Limits)

  • 정의:
    컨테이너가 사용할 수 있는 최대 자원의 양을 지정합니다.
  • 실행 중 관리:
    만약 컨테이너가 제한을 초과하는 자원을 사용하려고 하면, CPU의 경우에는 CFS 스케줄러에 의해 throttling(사용량 제한)이 발생하고, 메모리의 경우 제한을 초과하면 OOM(Out Of Memory) 상황이 발생해 컨테이너가 종료될 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: resource-demo-ctr
    image: nginx:1.14
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        cpu: 1
        memory: 500Mi

 

 

 

주의해야할 점

- 조건 별 추가되는 할당

Request 조건만 추가 : Request

Limit 조건만 추가: Request + Limit

Request, Limit 추가 : Request + Limit

Limit 조건만 달았을 시에는 Request, Limit이 동시에 생깁니다. Limit에 설정한 CPU와 memory가 Request에도 자동으로 추가되어 설정이 됩니다.

 

- Request 용량을 모든 노드들이 할당할 수 없다면?

Pending 상태로 한 노드가 할당 가능한 자원을 확보할때까지 대기하게 됩니다.