Search

[CKA] 20. Resource Requests and Limits

Date
2024/11/28
Category
Devops
Tag
Kubernetes
CKA
Scheduling
๋ชฉ์ฐจ

ย Resource Requests

Pod๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š” CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” container์— ๋Œ€ํ•œ resource request์ด๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์†Œ CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์š”์ฒญ์ด๋‹ค.
Resource Request๋ฅผ ์ง€์ •ํ•˜๋ฉด ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ทธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  Pod๋ฅผ Node์— ๋ฐฐ์น˜์‹œํ‚ฌ ๋•Œ ๊ฐ€์šฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง„ node๋ฅผ ์‹๋ณ„ํ•ด ๋ฐฐ์น˜ํ•œ๋‹ค.
# pod-definition.yaml apiVersion: v1 kind: Pod metadata: name: simple-webapp-color labels: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 resources: requests: memory: "4Gi" cpu: 2
YAML
๋ณต์‚ฌ

ย CPU

Resource Request์—์„œ Pod๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ CPU ์–‘์„ ์ •์˜ํ•œ๋‹ค.
CPU๋Š” vCPU(๊ฐ€์ƒ CPU)์™€ ๋™์ผ์‹œ๋œ๋‹ค, CPU๋Š” 1m ์ด์ƒ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
1CPU๋Š” 1000m์— ํ•ด๋‹นํ•˜๋ฉฐ, โ€˜mโ€™์€ mili๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

ย Memory

Resource Request์—์„œ Pod๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ Memory ์–‘์„ ์ •์˜ํ•œ๋‹ค.
Mi, Gi ๊ฐ™์€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ด์šฉํ•ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง์ ‘์ ์œผ๋กœ ๋ฐ”์ดํŠธ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
1 G (Gigabyte)
1,000,000,000 bytes
1 M (Megabyte)
1,000,000 bytes
1 K (Kilobyte)
1,000 bytes
1 Gi (Gibibyte)
1,073,741,824 bytes
1 Mi (Mebibyte)
1,048,576 bytes
1 Ki (Kibibyte)
1,024 bytes

ย Resource Limits

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋Š” Node์—์„œ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ limit๊ฐ€ ์—†๋‹ค.
Pod์˜ ์ผ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์˜ ์‚ฌ์šฉ CPU๋‚˜ Memory๊ฐ€ ๋ฌดํ•œ์ • ๋Š˜์–ด๋‚˜๋ฉด Node๋‚˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ผ ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ Pod์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์— ๋Œ€ํ•œ Limit์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
# pod-definition.yaml apiVersion: v1 kind: Pod metadata: name: simple-webapp-color labels: name: simple-webapp-color spec: containers: - name: simple-webapp-color image: simple-webapp-color ports: - containerPort: 8080 resources: requests: memory: "1Gi" cpu: 1 limits: memory: "2Gi" cpu: 2
YAML
๋ณต์‚ฌ

ย Exceed Limits

Exceeding CPU

โ€ข
Pod๊ฐ€ CPU ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•ด ์ž์›์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์ด CPU๋ฅผ ์กฐ์ ˆํ•ด ์ง€์ • ํ•œ๋„๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
โ€ข
๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ๋Š” Limit ์ด์ƒ์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค

Exceeding Memory

โ€ข
CPU์™€ ๋‹ฌ๋ฆฌ Memory๋Š” Limit์„ ์ดˆ๊ณผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
Pod๊ฐ€ ์ง€์†์ ์œผ๋กœ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด Pod๋Š” ์ข…๋ฃŒ(terminated)๋œ๋‹ค.
โ€ข
describe ๋ช…๋ น์–ด๋‚˜ log๋ฅผ ํ™•์ธํ•˜๋ฉด OOM(Out Of Memory) error๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ย Behavior

ย Default Behavior

โ€ข
๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” CPU, Memory์— ๋Œ€ํ•œ Request, Limit๊ฐ€ ์—†๋‹ค
โ†’ ์–ด๋–ค Pod๋“  ์•„๋ฌด Node์—์„œ ์›ํ•˜๋Š”๋งŒํผ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ Pod๋ฅผ ์งˆ์‹์‹œํ‚ค๋Š” ํ˜„์ƒ์„ ๋ถˆ๋Ÿฌ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

ย Behavior - CPU

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ CPU ๋ฆฌ์†Œ์Šค๋ฅผ ๋‘๊ณ  ๊ฒฝ์Ÿํ•˜๋Š” ๋‘ ๊ฐœ์˜ Pod๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • (์‹ค์ œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ)

ย No Requests & No Limits

โ€ข
Pod ํ•˜๋‚˜๊ฐ€ ๋…ธ๋“œ์˜ ๋ชจ๋“  CPU ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Œ
โ—ฆ
2๋ฒˆ Pod์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋ง‰์Œ

ย No Requests & Limits

โ€ข
Pod๊ฐ€ ์ž๋™์œผ๋กœ Request๋ฅผ Limit๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•จ
โ€ข
Pod๋งˆ๋‹ค ์ •ํ•ด์ง„ Limit์— ๋งž๋Š” vCPU๊ฐ€ ๋ณด์žฅ๋จ

ย Requests & Limits

โ€ข
๊ฐ Pod์—๋Š” Request์— ๋งž๋Š” vCPU๊ฐ€ ๋ณด์žฅ๋จ
โ€ข
๊ฐ Pod์˜ ์ตœ๋Œ€ ์‚ฌ์šฉ CPU๋Š” ์ •์˜๋œ Limit๊นŒ์ง€๋กœ ์ œํ•œ๋จ
โ€ข
์ด์ƒ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋ณด์ด์ง€๋งŒ Pod 1์€ CPU ์‚ฌ์ดํด์„ ๋” ์†Œ๋น„ํ•˜๋ คํ•˜๊ณ , Pod 2๋Š” CPU ์‚ฌ์ดํด์„ ๊ทธ๋งŒํผ ์†Œ๋น„ํ•˜๋ คํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

ย Requests & No Limits

โ€ข
์‹œ์Šคํ…œ์— ์ถฉ๋ถ„ํ•œ CPU ์‚ฌ์ดํด์ด ์žˆ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ Limit์„ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Œ
โ€ข
Request๊ฐ€ ์žˆ์–ด ์ตœ์†Œ vCPU๋Š” ๋ณด์žฅ๋ฐ›์Œ๊ณผ ๋™์‹œ์— Limit์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Pod๋งˆ๋‹ค CPU ์‚ฌ์ดํด์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ย Summary
๋ชจ๋“  Pod๋Š” Limit์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์ง€๋งŒ, Request๋Š” ์ •์˜๋˜์–ด์•ผ ์‹คํ–‰์„ ๋ณด์žฅ๋ฐ›๋Š”๋‹ค.

ย Behavior - Memory

ย No Requests & No Limits

โ€ข
Pod ํ•˜๋‚˜๊ฐ€ ๋…ธ๋“œ์˜ ๋ชจ๋“  Memory ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Œ
โ—ฆ
2๋ฒˆ Pod์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋ง‰์Œ

ย No Requests & Limits

โ€ข
Pod๊ฐ€ ์ž๋™์œผ๋กœ Request๋ฅผ Limit๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•จ
โ€ข
Pod๋งˆ๋‹ค ์ •ํ•ด์ง„ Limit์— ๋งž๋Š” Memory๊ฐ€ ๋ณด์žฅ๋จ

ย Requests & Limits

โ€ข
๊ฐ Pod์—๋Š” Request์— ๋งž๋Š” Memory๊ฐ€ ๋ณด์žฅ๋จ
โ€ข
๊ฐ Pod์˜ ์ตœ๋Œ€ ์‚ฌ์šฉ Memory๋Š” ์ •์˜๋œ Limit๊นŒ์ง€๋กœ ์ œํ•œ๋จ

ย Requests & No Limits

โ€ข
๊ฐ Pod๋Š” ์ •์˜๋œ Request์— ๋”ฐ๋ฅธ Memory๊ฐ€ ๋ณด์žฅ๋จ
โ€ข
์–ด๋–ค Pod๋“  Node์˜ ๊ฐ€์šฉํ•œ Memory๋ฅผ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Œ
โ—ฆ
Pod 1์ด Pod 2๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์š”์ฒญํ•˜๋ฉด Pod 2๋ฅผ ์ฃฝ์ด๋Š” ์ˆ˜๋ฐ–์— ์—†์Œ
โ—ฆ
Memory๋Š” CPU์™€ ๋‹ฌ๋ฆฌ ์กฐ์ ˆํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ

ย LimitRange

โ€ข
LimitRange๋ฅผ ์ •์˜ํ•˜๋ฉด Request๋‚˜ Limit์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
Namespace ๋ ˆ๋ฒจ์—์„œ๋„ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์˜ค๋ธŒ์ ํŠธ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
โ€ข
Pod๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ LimitRange์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฉฐ, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ Pod๋Š” ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
# limit-range-cpu.yaml apiVersion: v1 kind: LimitRange metadata: name: cpu-resource-constraint spec: limits: - default: # limit cpu: 500m defaultRequest: # request cpu: 500m max: # limit cpu: "1" min: # request cpu: 100m type: Container
YAML
๋ณต์‚ฌ
# limit-range-memory.yaml apiVersion: v1 kind: LimitRange metadata: name: memory-resource-constraint spec: limits: - default: # limit memory: 1Gi defaultRequest: # request memory: 1Gi max: # limit memory: 1Gi min: # request memory: 500Mi type: Container
YAML
๋ณต์‚ฌ

ย Resource Quotas

โ€ข
๋ชจ๋“  Pod๊ฐ€ ํŠน์ • ์–‘์˜ CPU๋‚˜ Memory๋ฅผ ์†Œ๋น„ํ•ด์„  ์•ˆ๋œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด Namespace ๋ ˆ๋ฒจ์—์„œ Quotas๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค
โ€ข
Resource Quota๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ ˆ๋ฒจ ๊ฐ์ฒด๋กœ, ์š”์ฒญ๊ณผ ํ•œ๊ณ„์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์ œํ•œ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.
# resource-quota.yaml apiVersion: v1 kind: ResourceQuota metadata: name: my-resource-quota spec: hard: requests.cpu: 4 requests.memory: 4Gi limits.cpu: 10 limits.memory: 10Gi
YAML
๋ณต์‚ฌ

ย ์ฐธ๊ณ 

kube-scheduler๋Š” Pod์˜ ์š”๊ตฌ ๋ฆฌ์†Œ์Šค์™€ Node์— ๊ฐ€์šฉํ•œ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ Pod๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. ๋งŒ์•ฝ Node์— ๊ฐ€์šฉํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋ฉด scheduler๋Š” Pod๋ฅผ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๊ณ  Pending ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. kubectl describe pod ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋ฉด CPU ๋ถ€์กฑ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.