๐ ๊ฐ์ - QOS
๐ณ๏ธโ๐ [๊ถ๊ธํ์ ]
๐[๋ชฉ์ฐจ]
- QoS (Quality of Service) ๊ฐ์
- QoS ํ์์ฑ
- QoS ์ด์ ์ ์ฉ ๊ฐ์ด๋๋ผ์ธ
- ResourceQuota ๊ฐ์
- ResourceQuota์ QoS ๋น๊ต
- ์ด ์ธ ๋ฆฌ์์ค ์ ํ ๋จ์
- LimitRange (๋ค์์คํ์ด์ค ๋ด Pod/Container ๋จ์ ๊ธฐ๋ณธ๊ฐ ๋ฐ ์ํ ์ค์ )
- Pod-level ๋ฆฌ์์ค ์ ํ (resources.requests / resources.limits)
- Node ์์ค ์์ ์ ํ
- PriorityClass + Pod Disruption + Preemption
- Cgroups + RuntimeClass (๋ ธ๋ ์ด์์ฒด์ ์์ค ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ, advanced)
- ๋ฆฌ์์ค ์ ํ ๋ฐฉ๋ฒ ์์ฝ
์ฟ ๋ฒ๋คํฐ์ค(Kubernetes)์ QoS(Quality of Service) ๋ Pod์ ๋ฆฌ์์ค ์์ฒญ/์ ํ ์ค์ ์ ๋ฐ๋ผ ๋ ธ๋์์์ ์ฐ์ ์์์ ์์ ํ๋ณด ์ ๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค. ์ด๋ ๋ฆฌ์์ค ๋ถ์กฑ ์ํฉ์์ ์ด๋ค Pod์ด ๋จผ์ ์ ๊ฑฐ๋๊ฑฐ๋ ์ ํ๋ ์ง๋ฅผ ํ๋จํ๋ ๊ธฐ์ค์ด ๋๋ค. QoS๋ ๋ ธ๋์ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ๋, Eviction (์ถ์ถ) ์์์ ์ํฅ์ ์ค๋ค. Pod ์ฑ๋ฅ ๋ฐ ์์ ์ฑ ๋ณด์ฅ์ ์ํด ์ ์ ํ QoS ๋ฑ๊ธ ์ค์ ์ด ํ์ํ๋ค.
| QoS ํด๋์ค | CPU/๋ฉ๋ชจ๋ฆฌ ์ค์ ๊ธฐ์ค | ์ค๋ช |
|---|---|---|
| Guaranteed | ๋ชจ๋ ์ปจํ
์ด๋์ ๋ํด requests == limits ๊ฐ ๋ช
์๋จ | ๋ฆฌ์์ค๋ฅผ ๊ฐ์ฅ ์์ ์ ์ผ๋ก ๋ณด์ฅ๋ฐ์ผ๋ฉฐ, ๋ ธ๋ ๋ฆฌ์์ค ๋ถ์กฑ ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ์ถ(evict) ๋ฉ๋๋ค. |
| Burstable | ์ผ๋ถ ๋๋ ์ ๋ถ ์ปจํ
์ด๋์ requests โ limits, ๋๋ ์ผ๋ถ๋ง ๋ช
์๋จ | ๊ธฐ๋ณธ ๋ณด์ฅ๋์ requests์ด๊ณ , ์ํฉ์ ๋ฐ๋ผ limits๊น์ง ์ฌ์ฉํ ์ ์์. ์ค๊ฐ ์ฐ์ ์์์
๋๋ค. |
| BestEffort | requests์ limits๊ฐ ๋ชจ๋ ์ค์ ๋์ง ์์ | ๋ฆฌ์์ค๊ฐ ๋จ๋ ํ ์ฌ์ฉํ ์ ์์ง๋ง, ๊ฐ์ฅ ๋จผ์ ์ถ์ถ๋๋ฉฐ ์์ ์ฑ ๋ฎ์. ์คํ์ ์ํฌ๋ก๋์ ์ ํฉ. |
| ํญ๋ชฉ | Guaranteed | Burstable | BestEffort |
|---|---|---|---|
| ์์ ์ฑ | ์ต๊ณ | ์ค๊ฐ | ์ต์ |
| ๋ฆฌ์์ค ๋ณด์ฅ | ์์ ๋ณด์ฅ | ์ผ๋ถ ๋ณด์ฅ | ์์ |
| ์ถ์ถ ์ฐ์ ์์ | ๊ฐ์ฅ ๋ฎ์ | ์ค๊ฐ | ๊ฐ์ฅ ๋์ |
| ์กฐ๊ฑด | requests == limits | ์ผ๋ถ๋ง ์ค์ or ๋ค๋ฅด๊ฑฐ๋ ์์ | ๋ ๋ค ์์ |
| ๋ฆฌ์์ค ์ค์ ๋ฐฉ์ | QoS ๋ฑ๊ธ | ์ค๋ช |
|---|---|---|
requests == limits (๋ชจ๋ ๋ช
์) | Guaranteed | ๊ฐ์ฅ ๋์ ๋ณด์ฅ, ์ ๋ ๋จผ์ ์ข ๋ฃ ์ ๋จ |
์ผ๋ถ requests ์ง์ , limits๋ ๋ค๋ฅด๊ฑฐ๋ ์์ | Burstable | ๋ณดํต ์์ค์ ๋ณด์ฅ |
requests, limits ๋ ๋ค ์์ | BestEffort | ๊ฐ์ฅ ๋ฎ์ ๋ณด์ฅ, ์์ ๋ถ์กฑ ์ ๊ฐ์ฅ ๋จผ์ ์ข ๋ฃ |
์ฃผ์ ์ฉ๋: eviction(๊ฐ์ ์ข ๋ฃ), scheduling, ๋ฆฌ์์ค ์ถฉ๋ ์ ์ฐ์ ์์ ํ๋จ
QoS ํ์์ฑ
QoS๋ ๋จ์ํ ๋ถ๋ฅ๊ฐ ์๋๋ผ ํด๋ฌ์คํฐ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ํต์ฌ ์์น์ด๋ค. QoS๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฆฌ์์ค๊ณผ๋ค ์ฌ์ฉํ์์ด ๋ฐ์ํ์ฌ ํต์ฌ ์๋น์ค๊ฐ ๋จผ์ ์ฃฝ๋ ์ฌ๊ณ ๊ฐ ๋ฐ์ํ๋ค.
ํด๋ฌ์คํฐ์์ CPU๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด, kubelet์ ์ผ๋ถ Pod์ ๊ฐ์ ๋ก ์ข ๋ฃ(Eviction) ์์ผ์ผ ํ๋ค. ์ด๋, ์ด๋ค Pod์ ๋จผ์ ์ฃฝ์ผ์ง ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ด QoS๋ค.
์์ ์ ์๋น์ค ์ ์ง๋ฅผ ์ํด ์ค์ ์๋น์ค๋ Guaranteed๋ก ์ด์ํด์ผ ํจ
QoS๋ requests์ limits ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ์ ๋๋ค. ์ด๋ฅผ ํตํด Pod์ด ์ผ๋ง๋ ์์์ ๋ณด์ฅ๋ฐ๊ณ , ์ต๋ ์ผ๋ง๊น์ง ์ฌ์ฉํ ์ ์๋์ง ์ ์ด ๊ฐ๋ฅํ๋ค. CPU ์ค๋กํ๋ง, ๋ฉ๋ชจ๋ฆฌ OOM ๋ฑ ์์ธก ๋ถ๊ฐ ๋ฌธ์ ๋ฅผ ์ค์ธ๋ค.
์ด์์๊ฐ ์์ ๋ญ๋น ์์ด ํจ์จ์ ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์
๋ฉํฐ ํ ๋์ ํ๊ฒฝ์์ ์๋น์ค ๊ฐ ๊ฐ์ญ์ ๋ฐฉ์ง
์์ ์ Auto-healing & Scaling์ ์ํด QoS ์ค์ ์ ํ์
์ด์ ํ๊ฒฝ์์ Kubernetes์ QoS(Quality of Service)๋ ์๋น์ค ์์ ์ฑ ๋ณด์ฅ๊ณผ ๋ฆฌ์์ค ์ต์ ํ๋ฅผ ์ํ ํต์ฌ ์์์ด๋ค. ์๋๋ ์ค์ ์ด์ ๊ด์ ์์ QoS๋ฅผ ์ด๋ป๊ฒ ์ค์ ํด์ผ ํ๋์ง์ ๋ํ ์ ๋ต๊ณผ ์ค์ฒ ๋ฐฉ๋ฒ์ด๋ค.
| ์๋น์ค ์ ํ | ์์ | ๊ถ์ฅ QoS | ์ค์ ์ ๋ต |
|---|---|---|---|
| ํต์ฌ ์๋น์ค | DB, ๊ฒฐ์ , ์ธ์ฆ ์๋น์ค ๋ฑ | Guaranteed | requests == limits (๋ช
์์ ๋ฆฌ์์ค ๊ณ ์ ) |
| ์ผ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค | ์น์๋ฒ, API ์๋ฒ ๋ฑ | Burstable | ์ต์ํ์ requests, ์ฌ์ ์๋ limits |
| ๋น์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋ | ๋ก๊ทธ ์์ง, ๋ฐฐ์น ์์ ๋ฑ | BestEffort ๋๋ Burstable | ๋ฆฌ์์ค ์ค์ ์ ํ๊ฑฐ๋ ๋ฎ๊ฒ ์ค์ |
Kubernetes์ ResourceQuota๋ ๋ค์์คํ์ด์ค ๋จ์๋ก ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ํ์ ์ ์ค์ ํ๋ ์ ์ฑ ์ด๋ค. ์ฌ๋ฌ ํ์ด๋ ์ฑ์ด ๊ณต์ ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๊ฒ ๋๋๊ณ ๋จ์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
| ์ํฉ | ๋ฌธ์ | ResourceQuota์ ์ญํ |
|---|---|---|
| ์ฌ๋ฌ ํ์ด ํ๋์ ํด๋ฌ์คํฐ ์ฌ์ฉ | ํน์ ํ์ด ๊ณผ๋ํ๊ฒ ์์์ ์ ์ | ํ๋ง๋ค ์ฌ์ฉํ ์ ์๋ ์์ ์ ํ |
| Pod์ด ๊ณผ๋ํ๊ฒ ์์ฑ๋จ | ๋ ธ๋ ๋ฆฌ์์ค ๊ณ ๊ฐ โ ์ ์ฒด ์ฅ์ | Pod ์ ์ ํ ์ค์ |
| PVC ๋ฑ ์คํ ๋ฆฌ์ง๋ฅผ ๋ฌดํ ์์ฑ | ํด๋ฌ์คํฐ ๋์คํฌ ๊ณต๊ฐ ์์ง | PVC ์ฉ๋ ์ดํฉ ์ ํ |
| ํญ๋ชฉ | ์ค๋ช | ์์ |
|---|---|---|
pods | ์์ฑ ๊ฐ๋ฅํ Pod์ ๊ฐ์ | pods: 20 |
requests.cpu | ์ ์ฒด ์์ฒญ ๊ฐ๋ฅํ CPU ํฉ | requests.cpu: "2" |
limits.memory | ์ ์ฒด ์ ํ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ํฉ | limits.memory: "4Gi" |
persistentvolumeclaims | PVC ์ ์ ํ | persistentvolumeclaims: 10 |
requests.storage | ์ ์ฒด PVC ์ฉ๋ ์ ํ | requests.storage: "500Gi" |
Kubernetes์์ ๋ค์์คํ์ด์ค ๋จ์๋ก ResourceQuota๋ฅผ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ๋ฆฌ์คํฌ ๋ฐ ๋ถ์์ฉ์ด ๋ฐ์ํ ์ ์๋ค
ํน์ ๋ค์์คํ์ด์ค(์: spark)์ ์์ ์ ํ์ด ์์ผ๋ฉด, ๋ฌดํ๋๋ก Pod์ ์์ฑํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์ด ์ ์ฒด ํด๋ฌ์คํฐ ๋ ธ๋ ์์์ด ๊ณ ๊ฐ๋ ์ ์๋ค.
์ด๋ก ์ธํด, ๋ค๋ฅธ ์๋น์ค(Pod)๋ค์ด ์ค์ผ์ค๋ง๋์ง ์๊ฑฐ๋ OOMKilled, Pod Pending, Eviction ๋ฐ์ํ๋ค. ์์๋ค์ด, Spark job์ด executor๋ฅผ ์์ญ ๊ฐ ์์ฑํ๋ฉด์ 100Gi ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๋ฉด Trino, Airflow Pod์ด Pending ์ํ๋ก ์ ํ๋๋ค.
๋ฌดํ ๋ฃจํ ๋ฑ์ผ๋ก ์ธํด ์๋ชป๋ ๋งค๋ํ์คํธ๊ฐ ์๋ฐฑ ๊ฐ์ Pod์ ์์ฑํ ๊ฒฝ์ฐ API server ๋ถํ ์ฆ๊ฐ, kube-scheduler ๊ณผ๋ถํ, ํด๋ฌ์คํฐ ์ ์ฒด๊ฐ ๋ถ์์ ํด์ง๋ค.
pods ๊ฐ์ ์ ํ์ ํ์ง ์์ผ๋ฉด ๋ฐฉ์ด ๋ถ๊ฐํ๋ค.
prod ๋ค์์คํ์ด์ค์ test ๋ค์์คํ์ด์ค๋ฅผ ๋๋ด๋๋ผ๋ ๋ฆฌ์์ค์ฟผํฐ ์์ผ๋ฉด test ์์
์ด prod ๋ฆฌ์์ค๋ฅผ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
โ ์ด์ ์ฅ์ ์ ๋ฐ ๊ฐ๋ฅ
| ์ด์ | ์ค๋ช |
|---|---|
| ์์ ํญ์ฃผ ๋ฐฉ์ง | ๊ฐ ๋ค์์คํ์ด์ค๋ณ ์์ ์ํ ์ค์ |
| ํ ๊ฐ ๊ณต์ ํ ์์ ์ฌ์ฉ | ์๋ก ์ํฅ์ ์ฃผ์ง ์์ |
| ์์ ์ ์ธ ์๋น์ค ์ด์ | ์์ธก ๊ฐ๋ฅํ ์์ ๋ฐฐ๋ถ |
| Pod ์, PVC ์ ๋ฑ ์ ์ด ๊ฐ๋ฅ | ์ค๋ธ์ ํธ ๊ฐ์๋ ์ ์ด |
| HPA/Auto Scaling ์ ๋ณดํธ๋ง | ๋ฌดํ ํ์ฅ ๋ฐฉ์ง |
requests.cpu, limits.cpu
requests.memory, limits.memory
pods
persistentvolumeclaims
services, secrets, configmaps, replicationcontrollers
| ํญ๋ชฉ | QoS (Quality of Service) | ResourceQuota |
|---|---|---|
| ๋ชฉ์ | Pod ์ฐ์ ์์ ๋ฐ ์์ ํ์ ์ ์ฑ | ๋ค์์คํ์ด์ค ๋จ์ ์์ ์ ํ |
| ์ ์ฉ ๋์ | ๊ฐ๋ณ Pod | ๊ฐ๋ณ Namespace |
| ์๋ ์ ์ฉ ์ฌ๋ถ | Kubernetes๊ฐ ์๋ ๋ถ๋ฅ | ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ผ ํจ |
| ๊ธฐ์ค | Pod์ requests/limits ์ค์ ์กฐํฉ | Namespace์ ํ ๋น๋ ์ด๋ ์ ํ |
| ์ข ๋ฅ/๋ ๋ฒจ | Guaranteed, Burstable, BestEffort | CPU, Memory, Pods, PVC, ConfigMap ๊ฐ์ ๋ฑ |
| ์์ ๋ถ์กฑ ์ ํ๋ | QoS ๋ฎ์ Pod ๋จผ์ ์ ๊ฑฐ | Quota ์ด๊ณผ ์ ์ Pod ์์ฑ ๋ถ๊ฐ |
| ์ญ์ ๋์ ์ฐ์ ์์ | QoS: BestEffort โ Burstable โ Guaranteed | N/A (์ด๊ณผ ์ ์ค์ผ์ค๋ง ๋ถ๊ฐ) |
| ๊ด๋ จ ๋ฆฌ์์ค | PodSpec ๋ด resources.requests/limits | ResourceQuota, LimitRange |
| ์ด์ ๊ด์ ์ฉ๋ | ์ค์ผ์ค๋ฌ/eviction ์ ์ฐ์ ์์ ๊ฒฐ์ | ์์ ํต์ ๋ฐ ์ฌ์ฉ๋ ์ ํ |
์์ ์ ํ์ ์ง์ ์ ์ผ๋ก ์ค์ ํ ์ ์๋ ์ ์ผํ ๋จ์๋ ๋ค์์คํ์ด์ค์ด๋ค.
ํ์ง๋ง ๋ค์์คํ์ด์ค ์ธ์๋ ์์ ์ฌ์ฉ์ ๊ฐ์ ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ด ๋ช ๊ฐ์ง ์๋ค.
LimitRange๋ Pod ๋๋ ์ปจํ ์ด๋ ๋จ์์ ๋ฆฌ์์ค ๊ธฐ๋ณธ๊ฐ๊ณผ ์ ํ๊ฐ์ ์ ์ํ๋ค. ๋ค์์คํ์ด์ค ๋ด์ ๊ฐ๋ณ ์ํฌ๋ก๋๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ช ์ํ์ง ์์๋ ์๋์ผ๋ก ์ ์ฉ๋๋ค.
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: trino
spec:
limits:
- default:
cpu: "1000m"
memory: "1Gi"
defaultRequest:
cpu: "500m"
memory: "512Mi"
type: Container
๋ค์์คํ์ด์ค๊ฐ ๊ฐ๋๋ผ๋, ๊ฐ Pod/Container ์์ค์์ ๋ฆฌ์์ค ์ ํ์ ๊ฐ๋ณ์ ์ผ๋ก ์ง์ ๊ฐ๋ฅ.
taints์ tolerations๋ก ํน์ ์ํฌ๋ก๋๋ง ํน์ ๋ ธ๋์ ๋ฐฐ์น
kubectl taint nodes node1 role=spark:NoScheduleโ tolerations์ด ์ค์ ๋ Spark ์์ ๋ง ์ด ๋ ธ๋์ ๋ฐฐ์น ๊ฐ๋ฅ
nodeSelector ๋๋ affinity๋ก ๋ฐฐ์น ์ ์ด
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - sparkPriorityClass + Pod Disruption + Preemption
- ๋์ ์ฐ์ ์์์ Pod๊ฐ ๋ฎ์ ์ฐ์ ์์ Pod๋ฅผ ๋ฐ์ด๋ด๊ณ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ ์ ์๊ฒ ํจ
- SLA๊ฐ ๋ค๋ฅธ ์๋น์ค ๊ฐ์ ์์ ์ ์ ๊ฐ๋ฅ
| ๋จ์ | ์์ ์ ํ ๊ฐ๋ฅ ์ฌ๋ถ | ์ฃผ์ ๋๊ตฌ |
|---|---|---|
| ๋ค์์คํ์ด์ค | ์ง์ ์ค์ ๊ฐ๋ฅ | ResourceQuota, LimitRange |
| Pod/Container | ๋ฆฌ์์ค requests/limits ์ค์ | QoS, autoscaler |
| ๋ ธ๋ | ์ง์ ์ ํ ๋ถ๊ฐ (ํ์ง๋ง ๋ฐฐ์น ์ ์ด ๊ฐ๋ฅ) | taint/toleration, affinity |
| ํด๋ฌ์คํฐ ์ ์ฒด | ์ง์ ์ ํ ๋ถ๊ฐ | ์ปจ๋ฒค์ ๋๋ ์ ์ฑ ๊ธฐ๋ฐ ํด ํ์ |
| ๊ฐ์ ํด๋ฌ์คํฐ ๋จ์ | (vCluster, HNC ๋ฑ์ผ๋ก ๊ฒฉ๋ฆฌ) | vCluster, Loft |