Pod는 배치된 Node의 CPU, MEM, 디스크 등의 리소스를 소비하기 때문에, 쿠버네티스 스케쥴러는 Pod에서 요구하는 리소스 양과 Node에서 사용할 수 있는 리소스 양을 고려하여 Pod를 배치한다. Pod가 배치된 Node에 리소스가 충분하지 않으면 Pod는 Pending 상태에 머무르며, 이 부분은 describe 명령어 출력 결과의 event 란에서 확인할 수 있다.
Resource Requirement
컨테이너가 필요로 하는 최소 CPU/MEM 등의 리소스
쿠버네티스 스케쥴러는 이 값을 바탕으로 Pod를 배치할 수 있을 만큼 리소스가 충분한 Node를 식별한다.
Pod 배포 정의 파일에 아래와 같이 정의할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
labels:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
resources:
requests:
memory: "1Gi"
cpu: 1
CPU의 경우, 1 CPU는 1 vCPU와 같고 0.1 CPU는 100m(밀리) CPU와 같다. CPU의 최솟값은 1m이다.
Resource Limit
리소스에 대한 제한 없이 필요한 만큼의 리소스를 소비할 수 있는 도커 컨테이너와 다르게 쿠버네티스는 Pod에서 사용할 수 있는 리소스 양을 제한할 수 있다. 리소스 제한은 Pod 배포 정의 파일에 설정할 수 있으며, 별도로 지정하지 않은 경우 기본값이 세팅된다.
Limit 기본값
CPU : 1
메모리 : 512MB
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
labels:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
resources:
requests:
memory: "1Gi"
cpu: 1
limits:
memory: "2Gi"
cpu: 2
requests와 limits는 컨테이너 각각에 설정해야 한다.
사용 리소스 양이 제한값을 초과하는 경우,
- CPU는 사용량을 조절하기 때문에 컨테이너는 설정된 limit 초과하여 사용할 수 없다.
- MEM는 사용량을 조절하지 않고 limit 초과하여 사용할 수 있다.
Pod가 지속적으로 limit 초과하여 MEM를 사용하는 경우, Pod가 종료된다.
Default Resource Setting
Pod가 리소스를 기본적으로 설정할 수 있기 위해서는 Pod가 생성되는 네임스페이스에 관련 설정이 있어야 한다.
그 정의 파일은 아래와 같다.
- CPU
apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: memory: 512Mi defaultRequest: memory: 256Mi type: Container
- MEM
apiVersion: v1 kind: LimitRange metadata: name: cpu-limit-range spec: limits: - default: cpu: 1 defaultRequest: cpu: 0.5 type: Container