1.2. Pod 및 컨테이너의 리소스 관리
Pod를 지정하면 컨테이너에 필요한 각 리소스의 양을 지정할 수 있습니다. 지정할 가장 일반적인 리소스는 CPU 및 메모리(RAM)입니다.
Pod에서 컨테이너에 대한 리소스 요청을 지정하면 kubernetes-scheduler에서 이 정보를 사용하여 Pod를 배치할 노드를 할당합니다.
컨테이너, kubelet 또는 노드 에이전트에 대한 리소스 제한을 지정하면 실행 중인 컨테이너가 설정한 제한보다 더 많은 리소스를 사용할 수 없도록 해당 제한을 적용합니다. kubelet은 특히 해당 컨테이너가 사용할 수 있도록 요청된 시스템 리소스 양을 예약합니다.
1.2.1. 요청 및 제한
Pod가 실행 중인 노드에 사용 가능한 리소스가 충분한 경우 컨테이너에서 해당 리소스에 대한 요청보다 더 많은 리소스를 사용할 수 있습니다. 그러나 컨테이너는 리소스 제한을 초과하여 사용할 수 없습니다.
예를 들어 컨테이너에 256MiB의 메모리 요청을 설정하고 해당 컨테이너가 8GiB 메모리가 있는 노드에 예약된 Pod에 있고 다른 Pod가 없는 경우 컨테이너에서 더 많은 RAM을 사용하려고 시도할 수 있습니다.
해당 컨테이너에 메모리 제한을 4GiB로 설정하면 kubelet 및 컨테이너 런타임에서 제한을 적용합니다. 런타임에서는 컨테이너가 구성된 리소스 제한보다 더 많은 것을 사용하지 못하도록 합니다.
컨테이너의 프로세스에서 허용된 메모리 양보다 많은 메모리를 사용하려고 하면 시스템 커널은 할당을 시도한 프로세스를 종료하며 OOM( Out Of Memory ) 오류가 발생합니다.
제한은 다음 두 가지 방법으로 구현할 수 있습니다.
- Reactively: 시스템이 위반을 감지하면 개입합니다.
- 적용: 시스템에서 컨테이너가 제한을 초과하지 않도록 합니다.
런타임마다 동일한 제한을 구현하는 다양한 방법이 있을 수 있습니다.
리소스에 대한 제한을 지정하지만 요청을 지정하지 않고 승인 시간 메커니즘에서 해당 리소스에 대한 기본 요청을 적용하지 않은 경우 Kubernetes는 지정한 제한을 복사하고 해당 리소스에 대해 요청된 값으로 사용합니다.
1.2.2. 리소스 유형
CPU와 메모리는 모두 리소스 유형입니다. 리소스 유형에는 기본 단위가 있습니다. CPU는 컴퓨팅 처리를 나타내며 Kubernetes CPU 단위로 지정됩니다. 메모리는 바이트 단위로 지정됩니다.
CPU 및 메모리는 전체적으로 컴퓨팅 리소스 또는 리소스라고 합니다. 컴퓨팅 리소스는 요청, 할당 및 소비할 수 있는 측정 가능한 양입니다. API 리소스와 다릅니다. Pod 및 서비스와 같은 API 리소스는 Kubernetes API 서버를 통해 읽고 수정할 수 있는 오브젝트입니다.
1.2.3. Pod 및 컨테이너에 대한 리소스 요청 및 제한 지정
각 컨테이너에 다음을 포함하여 리소스 제한 및 요청을 지정할 수 있습니다.
spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containers[].resources.requests.cpu spec.containers[].resources.requests.memory
개별 컨테이너에 대한 요청 및 제한만 지정할 수 있지만 Pod의 전체 리소스 요청 및 제한을 생각하는 것도 유용합니다. 특정 리소스의 경우 Pod 리소스 요청 또는 제한은 Pod의 각 컨테이너에 대한 리소스 요청 또는 제한의 합계입니다.
1.2.4. Kubernetes의 리소스 단위
CPU 리소스 단위
CPU 리소스에 대한 제한 및 요청은 CPU 단위로 측정됩니다. Kubernetes에서 하나의 CPU 단위는 노드가 물리적 호스트인지 아니면 물리적 머신 내에서 실행되는 가상 머신인지에 따라 하나의 물리적 프로세서 코어 또는 하나의 가상 코어와 동일합니다.
소수 요청은 허용됩니다. spec.containers[].resources.requests.cpu
를 0.5
로 설정하여 컨테이너를 정의할 때 1.0 CPU를 요청한 경우와 비교하여 절반의 CPU를 요청합니다. CPU 리소스 단위의 경우 양 표현식 0.1은 100m 식과 동일합니다. 100m은 100m로 읽을 수 있으며 100밀리코어 또는 100밀리코어로 읽을 수 있습니다. millicpu 및 millicores는 동일한 것을 의미합니다. CPU 리소스는 항상 상대 양이 아닌 절대적인 리소스로 지정됩니다. 예를 들어 500m CPU는 컨테이너가 단일 코어, 듀얼 코어 또는 48코어 시스템에서 실행되는지와 동일한 양의 컴퓨팅 성능을 나타냅니다.
CPU 단위가 1.0 또는 1000m 미만을 지정하려면 milliCPU 형식을 사용해야 합니다. 예를 들어 0.005 CPU가 아닌 5m을 사용합니다.
메모리 리소스 단위
메모리에 대한 제한 및 요청은 바이트 단위로 측정됩니다. E, P, T, G, M, k 중 하나를 사용하여 메모리를 일반 정수 또는 고정 소수점 숫자로 나타낼 수 있습니다. Ei, Pi, Ti, Gi, Mi, Ki와 같은 Power-of-two를 사용할 수도 있습니다. 예를 들어 다음은 대략 동일한 값을 나타냅니다.
128974848, 129e6, 129M, 128974848000m, 123Mi
접미사가 있는 경우 주의하십시오. 400m의 메모리를 요청하는 경우 400 메가바이트 (400Mi) 또는 400 메가바이트 (400M)가 아닌 0.4 바이트에 대한 요청입니다.
CPU 및 메모리 사양의 예
다음 클러스터에는 전용 100m CPU 및 250Mi로 작업 Pod를 예약할 수 있는 충분한 여유 리소스가 있습니다. 클러스터는 또한 2000m CPU 및 2Gi 메모리 전용 용도로 버스트에 견딜 수 있습니다.
spec: task_resource_requirements: requests: cpu: 100m memory: 250Mi limits: cpu: 2000m memory: 2Gi
자동화 컨트롤러는 제한 세트보다 더 많은 리소스를 사용하는 작업을 예약하지 않습니다. 작업 Pod에서 제한 세트보다 많은 리소스를 사용하는 경우 컨테이너는 Kubernetes에서 OOMKilled하고 재시작됩니다.
1.2.5. 리소스 요청에 대한 크기 권장 사항
컨테이너 그룹을 사용하는 모든 작업은 동일한 Pod 사양을 사용합니다. Pod 사양에는 작업을 실행하는 Pod에 대한 리소스 요청이 포함됩니다.
모든 작업은 동일한 리소스 요청을 사용합니다. Pod 사양에서 특정 작업에 대해 지정된 리소스 요청은 Kubernetes가 작업자 노드에서 사용 가능한 리소스를 기반으로 작업 Pod를 예약하는 방법에 영향을 미칩니다. 이는 기본값입니다.
-
하나의 포크에는 일반적으로 100Mb의 메모리가 필요합니다.
system_task_forks_mem
을 사용하여 설정됩니다. 작업에 포크 5개가 있는 경우 작업 Pod 사양에서 500Mb의 메모리를 요청해야 합니다. - 특히 높은 포크 값이 있거나 대규모 리소스 요청이 필요한 작업 템플릿의 경우 더 큰 리소스 요청을 나타내는 다른 Pod 사양으로 별도의 컨테이너 그룹을 생성해야 합니다. 그런 다음 작업 템플릿에 할당할 수 있습니다. 예를 들어 포크 값이 50인 작업 템플릿은 5GB 메모리를 요청하는 컨테이너 그룹과 페어링되어야 합니다.
- 단일 Pod가 작업을 포함할 수 없을 만큼 작업의 포크 값이 높은 경우 작업 분할 기능을 사용합니다. 이렇게 하면 개별 작업 "슬라이스"가 컨테이너 그룹에서 프로비저닝한 자동화 Pod에 적합하도록 인벤토리가 분할됩니다.