파드가 배치되는 노드는 k8s-scheduler가 결정한다.
스케줄러는 파드가 필요로 하는 리소스의 양과 노드에서 사용 가능한 리소스를 고려하여 파드를 배치할 가장 적합한 노드를 찾아낸다.
노드에 충분한 리소스가 없는 경우, 스케줄러는 노드에 파드르 배치하지 않고 충분한 리소스가 있는 노드에 파드를 배치한다.
모든 노드에 충분한 리소스가 없는 경우 스케줄러는 파드를 스케줄링 하지 않고 대기 상태로 놔둔다.
k8s에서 다루는 리소스는 CPU와 메모리이다.
1000m
100m
(100 밀리코어)400Mi
, 400M
컨테이너가 요청한 최소 CPU, Memory를 의미함
스케줄러가 파드를 배치할 때 이 값을 기준으로 리소스가 충분한 노드를 찾는다.
컨테이너가 사용할 수 있는 CPU, Memory 제한
기본적으로 컨테이너가 사용하는 리소스에 대한 제한이 없으나 limit를 설정해서 제한 할 수 있음
k8s 기본적으로는 request, limit 설정이 없다.
필요하다면 definition 파일 중 아래의 부분에 명시한다.
이 설정은 파드 내의 각 컨테이너에 대해 적용된다.
spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
예시)
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
CPU
시스템은 CPU limit제한을 초과하지 않도록 조절한다.
그래서 컨테이너는 제한된 CPU 보다 더 많은 리소스를 사용할 수 없다.
Memory
컨테이너는 Memory limit보다 더 많은 메모리를 사용할 수 있다.
제한된 메모리보다 더 많이 사용하려는 경우, 파드는 OOM(Out Of Memory 메모리 부족) 에러를 발생하며 종료된다.
위에서 말한 것 처럼, 기본적으로는 request와 limit 설정이 없다.
파드가 애플리케이션이 요구하는 만큼의 리소스를 얼마든지 많이 사용할 수 있다는 의미이다.
그러나 리소스를 많이 사용하는 특정 파드 때문에 다른 파드가 리소스를 쓸 수 없는 상황이 발생할 수 있다.
이럴 경우 request와 limit를 적절히 설정해야한다.
일반적으로 cpu에 대해 request는 설정, limit는 설정하지 않는 것이 이상적이라고 한다.
하지만 절대적인 것은 아니며 상황과 조건에 따라 적절한 설정을 할 수 있는 능력이 필요한 것 같다.
(노드의 리소스, 애플리케이션이 요구하는 리소스 등등 상황 봐가면서)
파드의 definition 파일에 request, limit 설정이 지정되지 않았더라도 리소스 사용량을 제한할 수 있는 방법
이 정책을 생성하면 네임스페이스namespace 내에서 설정이 적용된다.
이 정책은 파드를 새로 생성할 때 적용되며, 기존에 실행 중인 파드에는 영향을 주지 않는다.
예시)
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default: # 이 섹션에서는 기본 한도를 정의한다
cpu: 500m
defaultRequest: # 이 섹션에서는 기본 요청을 정의한다
cpu: 500m
max: # max와 min은 제한 범위를 정의한다
cpu: "1"
min:
cpu: 100m
리소스 쿼터 객체는 네임스페이스별 총 리소스 사용을 제한하는 정책을 설정한다.
네임스페이스a가 사용할 수 있는 리소스는 이만큼, 네임스페이스b가 사용할 수 있는 리소스는 이만큼 이라고 경계를 그어놓는 것
예시)
apiVersion: v1
kind: ResourceQuota
metadata:
name: my-resource-quota
spec:
hard:
requests.cpu: 4
requests.memory: 4Gi
limit.cpu: 10
limit.memory: 10Gi
request cpu와 memory를 각각 4, 4Gi로 제한하고
limit cpu와 memory를 각각 10, 10Gi로 제한한다.