์ด ๊ธ์ Kubernetes Best Practice๋ฅผ ์ฝ๊ณ ๊ฐ์ธ์ ์ผ๋ก ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ถ๊ณผ ์ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๋ํด ๊ณต๋ถํ ๋ด์ฉ์ ์์ฑํ ๊ธ์ ๋๋ค. ๋ชจ๋ ๋ด์ฉ์ ์ฑ ์ ํฌํจ๋์ด ์๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ผ๋ฉฐ ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ์ ๋ถ๋ค์ ์ฑ ์ ๊ตฌ๋งคํด์ ์ฝ๋ ๊ฒ์ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
์ต๊ทผ ์๋น์ค ๋ฉ์์ ๋ํด ์์๋ณด๊ฑฐ๋ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ๊ณ ๊ณต๋ถํ๋ฉด์ ๊ฐ์ฅ ๋ง์ด ๋ค์๋ ์๊ฐ์ ์ด ๋ฐฉ๋ฒ์ด ์ต์ ์ธ๊ฐ? ๋ผ๋ ์๊ฐ์ด์์ต๋๋ค. ์ด์ ๋ํ ๊ถ๊ธ์ฆ์ ํด๊ฒฐํ๋๋ฐ ๋์์ด ๋ ๋งํ ์ฑ ์ ๋ฐ๊ฒฌํด์ ์ฝ์ด๋ณด๊ณ ์ ํฉ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค ์ค์ผ์ค๋ฌ
Kubernetes Master Node์ ์กด์ฌํ๋ ์ค์ผ์ค๋ฌ๋ ํด๋ฌ์คํฐ์ ์ฌ์ฉ์์ ๋ฆฌ์์ค ์ ์ฝ์ ์ต์ ํ ๋๋๋ก Pod์ ๋ฐฐ์นํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ์ด ๋ ๋ ผ๋ฆฌ ์กฐ๊ฑด ๋ฐ ์ฐ์ ์์ ๊ธฐ๋ฐ์ ์ค์ฝ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค.
- ๋
ผ๋ฆฌ ์กฐ๊ฑด
์ค์ผ์ค๋ง ์ ์ฌ์ฉํ๋ ์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์ฐธ/๊ฑฐ์ง์ ๋ฐํํ๋ ๋ ผ๋ฆฌ ์กฐ๊ฑด ํจ์์ ๋๋ค. ๋ ผ๋ฆฌ์กฐ๊ฑด์ ๋ํด ๊ฑฐ์ง์ ๋ฐํํ๋ฉด ํด๋น ๋ ธ๋๋ ์ค์ผ์ค๋ง ํ๋ณด์์ ์ ๊ฑฐ๋๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋ฌธ์์์๋ ์ด๋ฅผ Filtering์ด๋ผ๊ณ ํํํ๊ณ ์์ต๋๋ค. - ์ฐ์ ์์
๋ ผ๋ฆฌ ์กฐ๊ฑด์ผ๋ก ์ฐธ์ ํด๋นํ๋ ๋ ธ๋๋ ์ฐ์ ์์ ์ค์ฝ์ด ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์์๊ฐ ์ ํด์ง๋๋ค. ์ด ์ค ๊ฐ์ฅ ์์๊ฐ ๋์ ๋ ธ๋์ Pod์ด ์ค์ผ์ค๋ง๋ฉ๋๋ค. ๋ง์ฝ ๊ฐ์ ์ฐ์ ์์๋ฅผ ๋ฐํํ๋ค๋ฉด Round Robin Tournament ๋ฐฉ์์ผ๋ก ๋ฐฐ์นํ ๋ ธ๋๋ฅผ ์ ํํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฟ ๋ฒ๋คํฐ์ค ์ค์ผ์ค๋ฌ๋ฅผ ํตํด ์ต์ ํ๋ ์ค์ผ์ค๋ง ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์ง๋ง ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฒฝ์ฐ ๋์ฑ ์ธ๋ฐํ ์ค์ผ์ค๋ง์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ์กด์ฌํฉ๋๋ค.
-
PodAffinity / PodAntiAffinity
Pod์ ๊ฐ์ ๋ฐฐ์น ๊ท์น์ ์ค์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. PodAffinity๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ Pod์ด ์๋ ๋ ธ๋์ ๋ฐฐํฌ๋ฅผ ํ๋ผ๋ ์๋ฏธ์ด๋ฉฐ PodAntiAffinity๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ Pod์ด ์๋ ๋๋์ ๋ฐฐํฌ๋ฅผ ํ์ง ๋ง๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์์ธํ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: server
spec:
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
spec:
containers:
- name: server
image: sphong.com/server:v1.1.0
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- server
topologyKey: "kubernetes.io/hostname"
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- redis
topologyKey: "kubernetes.io/hostname"
์์ ์์ ๋ server ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋, PodAffinity๋ฅผ ํตํด redis pod์ด ๋ฐฐํฌ๋ ๋ ธ๋์ ๋ฐฐํฌ๋ฅผ ํด์ผํ๋ฉฐ, server pod์ด ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ํด๋น ๋ ธ๋์๋ ๋ฐฐํฌํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋์ ๋ ธ๋๊ฐ ์คํจํ๋๋ผ๋ Pod์ ๋ค๋ฅธ ๋ ธ๋์ ๋ถ์ฐํ์ฌ ๋ฐฐ์นํจ์ผ๋ก์จ ์ฅ์ ์ ๋์ํ ์ ์์ต๋๋ค.
-
NodeSelector / NodeAffinity
NodeSelector๋ Node Label์ ํตํด ํน์ ๋ ธ๋์ Pod์ ์ค์ผ์ค๋งํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. NodeAffinity๋ Pod Affinity์ ์ ์ฌํ๊ฒ Node Label์ ํตํด ์ด๋ค ๋ ธ๋์ ์ค์ผ์ค๋งํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ ์ ์์ฑํ๋ Elasticsearch Helm Chart๋ฅผ ์์๋ก ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// Node Selector
nodeSelector:
cloud.google.com/gke-nodepool: ssd-node-pool
---
// NodeAffinity
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-nodepool
operator: In
values:
- ssd-node-pool
-
Taint / Toleration
Taint๋ Pod๊ฐ ์ค์ผ์ค๋ง ๋์ง ๋ชปํ๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํฉ๋๋ค. AntiAffinity์ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ์ ๋ฐ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. Taints๋ ํน์ํ ํ๋์จ์ด๋ฅผ ๊ฐ์ง ์ฅ๋น๋, ์ ์ฉ ๋ ธ๋ ๋ฆฌ์์ค๋ฅผ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ ํน์ ๋ ธ๋๋ฅผ ๊ฐ์ง Pod๋ง ์ค์ผ์ค๋งํ๊ณ ๊ทธ ์ธ์ ๋ค๋ฅธ pod์ ์ค์ผ์ค๋ง ํ์ง ์์ผ๋ ค๋ ์ํฉ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ง์ฝ Taint๋ ๋ ธ๋์ ์ค์ผ์ค๋ง ํ๋ ค๋ฉด Toleration์ ํตํด์๋ง ๊ฐ๋ฅํฉ๋๋ค. Taint ํ์ ์ NoScehule, PreferNoSchedule, NoExecute, NodeCondition ํ์ ์ด ์กด์ฌํ๋ฉฐ ๊ฐ ํ์ ์ด ์ํํ๋ ๊ธฐ๋ฅ์ ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
Node์ Taint ์ค์ ์ kubectl taint nodes node1 key1=value1:NoSchedule์ CLI๋ฅผ ํตํด ์ค์ ํ ์ ์๊ณ ์ด ๋ ธ๋์ ์ค์ผ์ค๋ง ํ๊ธฐ ์ํ toleration์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
NoSchedule๊ณผ NoExecute์ ์ฐจ์ด๋ฅผ ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ณด๋ฉด, NoSchedule ํ์ ์ ํ ์ธํธ๊ฐ ์ถ๊ฐ๋๋๋ผ๋ ๊ธฐ์กด์ ์ค์ผ์ค๋ง ๋ Pod์ ๊ทธ๋๋ก ์คํ๋ฉ๋๋ค. ํ์ง๋ง NoExecute ํ์ ์ ํ ์ธํธ๊ฐ ์ถ๊ฐ๋๋ฉด ๊ธฐ์กด์ ์ค์ผ์ค๋ง ๋ Pod์ ์ถ์ถ๋๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
Pod ๋ฆฌ์์ค ๊ด๋ฆฌ
ํด๋ฌ์คํฐ์ ๋ฆฌ์์ค ํ์ฉ์ ์ต์ ํํ๊ธฐ ์ํด์๋ Pod์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๊ณ ๋ คํ ํ์๊ฐ ์์ต๋๋ค. ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ํด ์๊ธฐ ์ํด์๋ ๋จผ์ Request์ Limit์ ๋ํด ์์์ผ ํฉ๋๋ค.
Request๋ ํด๋ฌ์คํฐ๊ฐ ์ค์ผ์ค๋ง ํ ๋ ํ์ํ ๋ฆฌ์์ค์ ์์ผ๋ก CPU์ Memory๋ฅผ ํตํด ์ ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ฝ Request ๋งํผ์ ๋ฆฌ์์ค๋ฅผ ๋ง์กฑํ๋ ๋ ธ๋๊ฐ ์๋ค๋ฉด Pod์ ์ค์ผ์ค๋ง ๋์ง ์์ต๋๋ค.
Limit์ Pod์ด ์คํ ์ค์ ๋๋ฌํ ์ ์๋ ์ต๋ ๋ฆฌ์์ค ์์ ์๋ฏธํฉ๋๋ค. Request์ ๋์ผํ๊ฒ CPU์ Memory๋ฅผ ํตํด ์ ์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
OverCommitted
request์ ๋ง๊ฒ ๋ฆฌ์์ค๋ฅผ ํ ๋นํ์ฌ ์ปจํ ์ด๋๋ฅผ ์์ฑ, ์ด์ํ๋ ๋์ค ๋ฆฌ์์ค๊ฐ ๋ ํ์ํ๊ฒ ๋๋ฉด limit๊น์ง ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ ์ปจํ ์ด๋์ limit ์ดํฉ์ด ์ค์ ์์คํ ์ด ๊ฐ์ฉ๊ฐ๋ฅํ reousrce์ ์๋ณด๋ค ๋ง์์ง๋ ํ์ (=Overcommitted)์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Overcommitted ์ํ๊ฐ ๋์์ ๊ฒฝ์ฐ CPU์ Memory๋ ๊ฐ์ ๋ค๋ฅธ ์์ ์ ์ํํฉ๋๋ค.
-
CPU Overcommitted
์ค์ CPU ์ฌ์ฉ๋์ request์ ์ ์๋ ์ํ๊น์ง ๋ฎ์ถฅ๋๋ค(Throttling). ์ดํ์ Overcommitted ์ํ๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค๋ฉด ์ฐ์ ์์์ ๋ฐ๋ผ ์ด์ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ์ข ๋ฃ์ํต๋๋ค. -
Memory Overcommitted
์ฌ์ฉ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ์ ์์์ ๋ฐ๋ผ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ์ข ๋ฃ ์ํต๋๋ค. ์ดํ ์ด๊ธฐ request์ ๋ง๊ฒ ์ปจํ ์ด๋๊ฐ ์ฌํ ๋น๋ฉ๋๋ค.
Qos Class
Pod์ด ์์ฑ๋๋ฉด Guaranteed, Burstable, Best-Effort ์ค ํ๋์ QoS ํด๋์ค๊ฐ ํ ๋น๋ฉ๋๋ค. request์ limit์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ Guranteed, limit > request์ธ ๊ฒฝ์ฐ์๋ Burstable, request๋ limit์ ์ค์ ํ์ง ์์ผ๋ฉด Best-Effort๊ฐ ํ ๋น๋ฉ๋๋ค. ์ด๋ Pod ์์์ด ์๋ ๊ฒฝ์ฐ ์ถ์ถ๋๋ Pod์ ์ ํํ ๋ ์ฐ์ ์์์ ์ํฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ๋ฆฌ์์ค์ ๋ํ ์ธ๋ฐํ ์กฐ์ ์ ํ์ง ๋ชปํ๋ฉด Overcommitted ํ์์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก Guaranteed ํด๋์ค๋ก ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค๊ณ ํฉ๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์์์ ํ์ผํ ์ ์์ต๋๋ค.
PodDisruptionBudget
Pod์ด ์ถ์ถ๋๋ ์ ํ์ 2๊ฐ์ง๊ฐ ์กด์ฌํฉ๋๋ค. ํ๋์จ์ด ์ฅ์ , ๋ฆฌ๋ก์ค ๋ถ์กฑ์ผ๋ก ์ธํ ๋น์๋ฐ์ ์ค๋จ๊ณผ ํด๋ฌ์คํฐ ์คํ ์ค์ผ์ผ๋ง ํด์ , PodTemplate ์ ๋ฐ์ดํธ๋ก ์ธํ ์๋ฐ์ ์ถ์ถ์ ๋๋ค. PodDisruptionBudget์ Pod์ด ์ถ์ถ๋ ๋ ์ต์ ๊ฐ์ฉ Pod๊ณผ ์ต๋ ๋ถ๊ฐ์ฉ Pod์ ๋ํ ์ ์ฑ ์ ์ค์ ํจ์ผ๋ก์จ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ ์๊ฐ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ๋๋ค. ๋ค์์ ์์๋ server ์ดํ๋ฆฌ์ผ์ด์ ์ด ํญ์ ์ต์ 5๊ฐ๊ฐ ๊ฐ์ฉํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: server-pdb
spec:
minAvailable: 5
selector:
matchLabels:
app: server
ResourceQuota
๋จ์ผ ํด๋ฌ์คํฐ๋ฅผ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ณต์ ํ ๊ฒฝ์ฐ ๋ค์์คํ์ด์ค์ ResourceQuota๋ฅผ ์ค์ ํด ํด๋ฌ์คํฐ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถํ ํด์ผ ํฉ๋๋ค. ์ด ๋ ์ ์ํ ์ ์๋ ๋ฆฌ์์ค๋ cpu, memory, storage, pvc, storageClass, service/deployment/replicaSet์ ๊ฐ์ ๋ฑ์ด ์กด์ฌํฉ๋๋ค. ๋ค์์ ์์๋ sphong์ด๋ผ๋ namespace์ cpu ๋ฐ memory, pvc ๊ฐ์๋ฅผ ์ ํํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-rq
namespace: sphong
spec:
hard:
request.cpu: "1"
request.memory: 2Gi
limits.cpu: "3"
limits.memory: 2Gi
persistentvolumeclaims: "5"
LimitRange
ResourceQuota๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ request์ limit์ด ๋ช ์๋์ง ์์ผ๋ฉด ์ค์ผ์ค๋ง์ด ๊ฑฐ์ ๋ฉ๋๋ค. ํ์ง๋ง ๋ฆฌ์์ค์ ๋ํด ์ ์์ง ๋ชปํ๋ ์ฌ์ฉ์๊ฐ ์ด๋ฅผ ์ค์ ํ๊ธฐ์ ์ด๋ ค์์ด ์กด์ฌํ๊ณ ์ค์๋ก ๋นผ๋จน์ ์๋ ์์ต๋๋ค. ์ด๋ฐ ์ํฉ์ ์ํ LimitRange๋ผ๋ Admission Controller๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ ์์๋ memory์ ๋ํ defaultRequest๋ฅผ ์ค์ ํ๋ LimitRange ์ ๋๋ค.
apiVersion: v1
kind: LimitRange
metadata:
name: sphong-lr
spec:
limits:
- default:
memory: 256Mi
defaultRequest:
memory: 128Mi
type: Container
HPA
์ํฌ๋ก๋์ ์ฆ๊ฐ๊ฐ ์์๋๋ ๊ฒฝ์ฐ ์๋ ํ์ฅ์ ํตํด ๋์ํ ์ ์์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ์ํฌ๋ก๋๋ฅผ ํ์ฅํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ฟ ๋ฒ๋คํฐ์ค๋ HPA๋ฅผ ์ ๊ณตํฉ๋๋ค. HPA๋ addon์ผ๋ก ์ ๊ณต๋๋ metrics-server๋ก ๋ถํฐ ๋ฉํธ๋ฆญ์ ์กฐํํด ์ํ ํ์ฅ์ ์งํํ ์ ์์ต๋๋ค. ์ด ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง๊ณ ๋์ํฉ๋๋ค.
-
horizontal-pod-autoscaler-sync-period(๋ฉํธ๋ฆญ ๋๊ธฐํ ์ฃผ๊ธฐ) : 30s
-
horizontal-pod-autoscaler-upscale-delay(ํ์ฅ ์ง์ฐ ์๊ฐ) : 3m
-
horizontal-pod-autoscaler-downscale-delay(์ถ์ ์ง์ฐ ์๊ฐ) : 5m
HPA๋ฅผ ์ค์ ํ ๊ฒฝ์ฐ ๋ฌดํ ํ์ฅ/์ถ์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ต์/์ต๋ ํ์ฅ ๊ฐ์๋ฅผ ์ค์ ํด์ผ ํ๋ฉฐ, ํ์ฅ์ ์งํํ ๋ฆฌ์์ค ๊ธฐ์ค์ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ค์ CLI๋ cpu๋ฅผ 60% ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ต์ 1๊ฐ์์ ์ต๋ 5๊ฐ์ ๋ ํ๋ฆฌ์นด๋ฅผ ์์ฑํ๋ HPA๋ฅผ ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
> kubectl autoscale deployment server --cpu-percent=60 --min=1 --max=5
metrics-server์์ ์ ๊ณตํ๋ ๋ฉํธ๋ฆญ ์ด์ธ์๋ ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ์ฌ HPA๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ API Apapter๋ฅผ ํตํด custom metric์ API๋ก ๋ ธ์ถ์์ผ์ผ ํฉ๋๋ค. ์ด์ ๊ด๋ จ๋ ์์ธํ ๋ด์ฉ์ alice_k106๋์ ๋ธ๋ก๊ทธ์์ ์ฝ๊ฒ ์ค๋ช ๋์ด ์์ด ๋งํฌ๋ฅผ ๋จ๊ฒจ๋๋๋ก ํ๊ฒ ์ต๋๋ค.
๋๊ธ