파드를 지정할 때, 컨테이너에 필요한 각 리소스의 양을 선택적으로 지정할 수 있다. 지정할 가장 일반적인 리소스는 CPU와 메모리(RAM) 그리고 다른 것들이 있다.
파드에서 컨테이너에 대한 리소스 요청을 지정하면, 스케줄러는 이 정보를 사용하여 파드가 배치될 노드를 결정한다. 컨테이너에 대한 리로스 제한을 지정하면, kubelet은 실행 중인 컨테이너가 설정한 제한보다 많은 리소스를 사용할 수 없도록 해당 제한을 적용한다. 또한 kubelet은 컨테이너가 사용할 수 있도록 해당 시스템 리소스의 최소 요청량을 예약한다.
파드의 각 컨테이너는 다음 중 하나 이상을 지정할 수 있다.
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.limits.hugepages-<size>
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
spec.containers[].resources.requests.hugepages-<size>
요청과 제한은 개별 컨테이너에서만 지정할 수 있지만, 파드 리소스 요청 및 제한에 대해 이야기하는 것이 편리하다. 특정 리소스 타입에 대한 파드 리소스 요청 제한은 파드의 각 컨테이너에 대한 해당 타입의 리소스 요청/제한의 합이다.
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: nginx
resources: ## requests로 cpu:0.1m, memory: 10M을 설정했다.
requests:
cpu: 0.1m
memory: 10M
$ kubectl describe pod pod1
...
Containers:
pod1:
Container ID:
Image: nginx
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Requests: ## 설정된 값을 describe 명령어를 통해서 확인할 수 있다.
cpu: 1m
memory: 10M
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: nginx
resources: ## cpu를 10m, memory를 10M로 제한
limits: ## 제한만 설정하는 경우 requests가 limits만큼 설정됨
cpu: 10m
memory: 10
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: nginx
resources: ## limits와 requests 둘 다 설정 가능
limits:
cpu: 10m
memory: 10M
requests:
cpu: 5m
memory: 5M
이런식으로 리소스를 관리할 수 있다.
그런데 만약 리소스 requests 값 설정을 내가 실행하고 있는 가상환경자원보다 크게 설정할 경우 pod 생성이 되지 않는다.
직접 만들어보면
apiVersion: v1
kind: Pod
metadata:
name: pod4
spec:
containers:
- name: pod4
image: nginx
resources:
requests:
cpu: 2000m
memory: 3000M
$ kubectl create -f pod4.yaml
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pod4 0/1 Pending 0 42s ## Pending에서 진행되지 않는다.