파드 수준 CPU·메모리 리소스 할당하기

파드 수준 CPU·메모리 리소스 할당하기

이 페이지는 컨테이너 수준 리소스 사양에 추가로 파드 수준에서 파드에 CPU와 메모리 리소스를 지정하는 방법을 보여줘요. Kubernetes 노드는 파드의 리소스 요청을 기반으로 파드에 리소스를 할당해요. 이 요청은 파드 수준 또는 파드 안의 컨테이너별로 정의될 수 있어요. 둘 다 있으면 파드 수준 요청이 우선해요.

비슷하게, 파드의 리소스 사용량은 파드 수준 또는 파드 안의 컨테이너별로 설정될 수 있는 한도(limits)로 제한돼요. 역시 둘 다 있으면 파드 수준 한도가 우선시돼요. 이는 유연한 리소스 관리를 가능하게 해, 파드 수준과 컨테이너 수준 모두에서 리소스 할당을 제어할 수 있게 해줘요.

파드 수준에서 리소스를 지정하려면 PodLevelResources 기능 게이트를 활성화해야 해요.

파드 수준 리소스의 경우:

  • 우선순위 (Priority): 파드 수준과 컨테이너 수준 리소스가 모두 지정되면 파드 수준 리소스가 우선해요.
  • QoS: 파드 수준 리소스는 파드의 QoS 클래스에 영향을 주는 데 우선해요.
  • OOM 점수: OOM 점수 조정 계산은 파드 수준과 컨테이너 수준 리소스를 모두 고려해요.
  • 호환성 (Compatibility): 파드 수준 리소스는 기존 기능과 호환되도록 설계되었어요.

출처: 문서

본문

시작하기 전에

Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.

버전을 확인하려면 kubectl version을 입력해요. 컨트롤 플레인과 클러스터의 모든 노드에서 PodLevelResources 기능 게이트가 활성화되어 있어야 해요.

제한 사항 (Limitations)

Kubernetes 1.37에서 파드 수준 리소스에는 다음 제한이 있어요.

  • 리소스 종류: CPU, 메모리, hugepages 리소스만 파드 수준에서 지정할 수 있어요.
  • 운영체제: 파드 수준 리소스는 Windows 파드에서 지원되지 않아요.
  • 리소스 매니저: Topology Manager, Memory Manager, CPU Manager는 PodLevelResourceManagers 기능 게이트가 활성화되면 파드 수준 리소스를 지원해요. 자세한 내용은 파드 수준 리소스 매니저를 참고해요. 이 기능 게이트가 없으면 파드 수준 리소스에 따라 파드와 컨테이너를 정렬하지 않아요.
  • 제자리 크기 조정 (In-Place Resize): 파드 수준 리소스의 제자리 크기 조정은 Kubernetes 1.37에서 알파인 InPlacePodLevelResourcesVerticalScaling 기능 게이트를 요구해요. 자세한 내용은 파드 CPU·메모리 리소스 크기 조정을 참고해요.

네임스페이스 생성

이 연습에서 만든 리소스를 클러스터의 나머지와 격리하도록 네임스페이스를 만들어요.

kubectl create namespace pod-resources-example

파드 수준 메모리 요청과 한도가 있는 파드 생성

파드 수준에서 메모리 요청을 지정하려면 Pod spec 매니페스트에 resources.requests.memory 필드를 포함해요. 메모리 한도를 지정하려면 resources.limits.memory를 포함해요.

이 연습에서 컨테이너 하나가 있는 파드를 만들어요. 파드는 100 MiB 메모리 요청과 200 MiB 메모리 한도를 가져요. 다음은 파드의 구성 파일이에요.

apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: pod-resources-example
spec:
  resources:
    requests:
      memory: "100Mi"
    limits:
      memory: "200Mi"
  containers:
  - name: memory-demo-ctr
    image: nginx
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

매니페스트의 args 섹션은 컨테이너가 시작될 때의 인자를 제공해요. "--vm-bytes", "150M" 인자는 컨테이너가 150 MiB 메모리 할당을 시도하도록 지시해요.

파드를 만들어요.

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-memory-request-limit.yaml --namespace=pod-resources-example

파드가 실행 중인지 확인해요.

kubectl get pod memory-demo --namespace=pod-resources-example

파드에 대한 상세 정보를 확인해요.

kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example

출력은 파드가 100 MiB 메모리 요청과 200 MiB 메모리 한도를 가짐을 보여줘요.

...
spec:
  containers:
  ...
  resources:
    requests:
      memory: 100Mi
    limits:
      memory: 200Mi
...

kubectl top으로 파드의 메트릭을 가져와요.

kubectl top pod memory-demo --namespace=pod-resources-example

출력은 파드가 약 162,900,000바이트, 즉 약 150 MiB의 메모리를 사용 중임을 보여줘요. 이것은 파드의 100 MiB 요청보다 크지만, 파드의 200 MiB 한도 안에 있어요.

NAME                        CPU(cores)   MEMORY(bytes)
memory-demo                 <something>  162856960

파드 수준 CPU 요청과 한도가 있는 파드 생성

파드에 CPU 요청을 지정하려면 Pod spec 매니페스트에 resources.requests.cpu 필드를 포함해요. CPU 한도를 지정하려면 resources.limits.cpu를 포함해요.

이 연습에서 컨테이너가 하나 있는 파드를 만들어요. 파드는 0.5 CPU 요청과 1 CPU 한도를 가져요. 다음은 파드의 구성 파일이에요.

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: pod-resources-example
spec:
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: "0.5"
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    args:
    - -cpus
    - "2"

구성 파일의 args 섹션은 컨테이너가 시작될 때의 인자를 제공해요. -cpus "2" 인자는 컨테이너가 CPU 2개를 사용하도록 시도하게 해요.

파드를 만들어요.

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-cpu-request-limit.yaml --namespace=pod-resources-example

파드가 실행 중인지 확인해요.

kubectl get pod cpu-demo --namespace=pod-resources-example

파드에 대한 상세 정보를 확인해요.

kubectl get pod cpu-demo --output=yaml --namespace=pod-resources-example

출력은 파드가 500 milliCPU CPU 요청과 1 CPU CPU 한도를 가짐을 보여줘요.

spec:
  containers:
  ...
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m

kubectl top으로 파드의 메트릭을 가져와요.

kubectl top pod cpu-demo --namespace=pod-resources-example

이 예시 출력은 파드가 974 milliCPU를 사용 중임을 보여줘요. 이것은 파드 구성에 지정된 1 CPU 한도보다 약간 적어요.

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

-cpu "2"를 설정함으로써 컨테이너가 CPU 2개를 사용하도록 구성했지만, 컨테이너는 약 1 CPU만 사용하도록 허용되고 있음을 기억해요. 컨테이너가 파드 CPU 한도보다 더 많은 CPU 리소스를 사용하려 하고 있으므로, 컨테이너의 CPU 사용이 조절(throttling)되고 있기 때문이에요.

파드 수준과 컨테이너 수준 모두에 리소스 요청·한도가 있는 파드 생성

파드에 CPU와 메모리 리소스를 할당하려면 파드 수준과 컨테이너 수준 모두에서 지정할 수 있어요. 파드 전체의 리소스를 정의하려면 Pod spec에 resources 필드를 포함해요. 추가로 파드의 매니페스트에서 컨테이너의 spec 안에 resources 필드를 포함해 컨테이너별 리소스 요구 사항을 설정해요.

이 연습에서는 파드 수준과 컨테이너 수준 리소스 사양의 상호작용을 살펴보기 위해 두 컨테이너가 있는 파드를 만들어요. 파드 자체는 정의된 CPU 요청과 한도를 갖고, 두 컨테이너 중 하나만 자체 명시적인 리소스 요청·한도를 가져요. 다른 컨테이너는 파드 수준 설정의 리소스 제약을 상속해요. 다음은 파드의 구성 파일이에요.

apiVersion: v1
kind: Pod
metadata:
  name: pod-resources-demo
  namespace: pod-resources-example
spec:
  resources:
    limits:
      cpu: "1"
      memory: "200Mi"
    requests:
      cpu: "1"
      memory: "100Mi"
  containers:
  - name: pod-resources-demo-ctr-1
    image: nginx
    resources:
      limits:
        cpu: "0.5"
        memory: "100Mi"
      requests:
        cpu: "0.5"
        memory: "50Mi"
  - name: pod-resources-demo-ctr-2
    image: fedora
    command:
    - sleep
    - inf

파드를 만들어요.

kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-resources.yaml --namespace=pod-resources-example

파드 컨테이너가 실행 중인지 확인해요.

kubectl get pod pod-resources-demo --namespace=pod-resources-example

파드에 대한 상세 정보를 확인해요.

kubectl get pod pod-resources-demo --output=yaml --namespace=pod-resources-example

출력은 파드의 컨테이너 하나가 50 MiB 메모리 요청과 0.5 코어 CPU 요청, 100 MiB 메모리 한도와 0.5 코어 CPU 한도를 가짐을 보여줘요. 파드 자체는 100 MiB 메모리 요청과 1 코어 CPU 요청, 200 MiB 메모리 한도와 1 코어 CPU 한도를 가져요.

...
  containers:
  -
    name: pod-resources-demo-ctr-1
    resources:
      limits:
        cpu: 500m
        memory: 100Mi
      requests:
        cpu: 500m
        memory: 50Mi
...
  -
    name: pod-resources-demo-ctr-2
    resources: {}
...
  resources:
    limits:
      cpu: "1"
      memory: 200Mi
    requests:
      cpu: "1"
      memory: 100Mi
...

파드 수준 요청과 한도가 지정되었으므로, 파드 안 두 컨테이너의 요청 보장은 모두 1 코어 CPU와 100Mi 메모리와 같게 돼요. 추가로 두 컨테이너가 함께 파드 수준 한도에 지정된 것보다 더 많은 리소스를 사용할 수는 없는데, 이는 합쳐서 200 MiB 메모리와 1 코어 CPU를 초과할 수 없음을 보장해요.

정리

네임스페이스를 삭제해요.

kubectl delete namespace pod-resources-example

다음 단계

애플리케이션 개발자용

클러스터 관리자용

더 알아보기 (Learn more)