Resource Requirements

zuckerfrei·2023년 7월 1일
0

Kubernetes

목록 보기
23/63

공식문서

파드가 배치되는 노드는 k8s-scheduler가 결정한다.

스케줄러는 파드가 필요로 하는 리소스의 양과 노드에서 사용 가능한 리소스를 고려하여 파드를 배치할 가장 적합한 노드를 찾아낸다.

노드에 충분한 리소스가 없는 경우, 스케줄러는 노드에 파드르 배치하지 않고 충분한 리소스가 있는 노드에 파드를 배치한다.

모든 노드에 충분한 리소스가 없는 경우 스케줄러는 파드를 스케줄링 하지 않고 대기 상태로 놔둔다.

Resource

k8s에서 다루는 리소스는 CPU와 메모리이다.


리소스 단위

  • CPU
    • 1 CPU은 1 physical CPU core 또는 1 vCPU을 의미한다.
    • 1 CPU = 1000m
    • 0.1 CPU = 100m (100 밀리코어)
  • Memory
    • 바이트 단위로 측정
    • E, P, T, G, M, k 같은 접미사를 사용하여 표현함.
    • 400Mi, 400M

Request

컨테이너가 요청한 최소 CPU, Memory를 의미함
스케줄러가 파드를 배치할 때 이 값을 기준으로 리소스가 충분한 노드를 찾는다.


Limit

컨테이너가 사용할 수 있는 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는 설정하지 않는 것이 이상적이라고 한다.
하지만 절대적인 것은 아니며 상황과 조건에 따라 적절한 설정을 할 수 있는 능력이 필요한 것 같다.
(노드의 리소스, 애플리케이션이 요구하는 리소스 등등 상황 봐가면서)


LimitRange

공식문서 참조

파드의 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

ResourceQuota

공식문서

리소스 쿼터 객체는 네임스페이스별 총 리소스 사용을 제한하는 정책을 설정한다.
네임스페이스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로 제한한다.

profile
무설탕 음료를 좋아합니다

0개의 댓글