ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : v1.30
Kubernetes v1.30 ๋ฌธ์๋ ๋ ์ด์ ์ ๊ทน์ ์ผ๋ก ๊ด๋ฆฌ๋์ง ์์. ํ์ฌ ๋ณด๊ณ ์๋ ๋ฌธ์๋ ์ ์ ์ค๋ ์ท์. ์ต์ ๋ฌธ์๋ฅผ ์ํด์๋, ๋ค์์ ์ฐธ๊ณ . ์ต์ ๋ฒ์ .
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ
์ฐธ๊ณ :
ReplicaSet
์ ๊ตฌ์ฑํ๋ Deployment
๊ฐ ํ์ฌ ๊ถ์ฅํ๋ ๋ ํ๋ฆฌ์ผ์ด์
์ค์ ๋ฐฉ๋ฒ์ด๋ค.๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ๋ ์ธ์ ๋ ์ง ์ง์ ๋ ์์ ํ๋ ๋ ํ๋ฆฌ์นด๊ฐ ์คํ ์ค์์ ๋ณด์ฅํ๋ค. ๋ค์ ๋งํ๋ฉด, ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ํ๋ ๋๋ ๋์ผ ์ข ๋ฅ์ ํ๋์ ์ ์ด ํญ์ ๊ธฐ๋๋๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ํ์ธํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ๋์๋ฐฉ์
ํ๋๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๊ฐ ์ถ๊ฐ์ ์ธ ํ๋๋ฅผ ์ ๊ฑฐํ๋ค. ๋๋ฌด ์ ์ผ๋ฉด ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋ ๋ง์ ํ๋๋ฅผ ์์ํ๋ค. ์๋์ผ๋ก ์์ฑ๋ ํ๋์ ๋ฌ๋ฆฌ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๊ฐ ์ ์ง ๊ด๋ฆฌํ๋ ํ๋๋ ์คํจํ๊ฑฐ๋ ์ญ์ ๋๊ฑฐ๋ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๊ต์ฒด๋๋ค. ์๋ฅผ ๋ค์ด, ์ปค๋ ์ ๊ทธ๋ ์ด๋์ ๊ฐ์ด ํ๊ดด์ ์ธ ์ ์ง ๋ณด์ ์์ ์ ํ๊ณ ๋ ์ดํ์ ๋ ธ๋์์ ํ๋๊ฐ ๋ค์ ์์ฑ๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋์ ํ๋๋ง ํ์ํ ๊ฒฝ์ฐ์๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ํ๋ก์ธ์ค ๊ฐ์์(supervisor)์ ์ ์ฌํ์ง๋ง ๋จ์ผ ๋ ธ๋์์ ๊ฐ๋ณ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํ๋ ๋์ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ์ฌ๋ฌ ๋ ธ๋์์ ์ฌ๋ฌ ํ๋๋ฅผ ๊ฐ์ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋์ค์ปค์ ์์ ์ข ์ข "rc"๋ก ์ถ์ฝ๋๋ฉฐ kubectl ๋ช ๋ น์์ ์์ปท์ผ๋ก ์ฌ์ฉ๋๋ค.
๊ฐ๋จํ ๊ฒฝ์ฐ๋ ํ๋์ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ์ฌ ํ ๊ฐ์ ํ๋ ์ธ์คํด์ค๋ฅผ ์๊ตฌํ ์์ ์ ์ผ๋ก ์คํํ๋ ๊ฒ์ด๋ค. ๋ณด๋ค ๋ณต์กํ ์ฌ์ฉ ์ฌ๋ก๋ ์น ์๋ฒ์ ๊ฐ์ด ๋ณต์ ๋ ์๋น์ค์ ๋์ผํ ๋ ํ๋ฆฌ์นด๋ฅผ ์ฌ๋ฌ ๊ฐ ์คํํ๋ ๊ฒ์ด๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์์ ์คํ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์์ ์ config๋ nginx ์น์๋ฒ์ ๋ณต์ฌ๋ณธ ์ธ ๊ฐ๋ฅผ ์คํํ๋ค.
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
์์ ํ์ผ์ ๋ค์ด๋ก๋ํ ํ ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ์์ ์์ ์ ์คํํ๋ผ.
kubectl apply -f https://k8s.io/examples/controllers/replication.yaml
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
replicationcontroller/nginx created
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ์ํ๋ฅผ ํ์ธํ์.
kubectl describe replicationcontrollers/nginx
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Name: nginx
Namespace: default
Selector: app=nginx
Labels: app=nginx
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 0 Running / 3 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: 80/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- ---- ------ -------
20s 20s 1 {replication-controller } Normal SuccessfulCreate Created pod: nginx-qrm3m
20s 20s 1 {replication-controller } Normal SuccessfulCreate Created pod: nginx-3ntk0
20s 20s 1 {replication-controller } Normal SuccessfulCreate Created pod: nginx-4ok8v
์ด์ ์ธ ๊ฐ์ ํ๋๊ฐ ์์ฑ๋์์ผ๋ ์์ง ์ด๋ฏธ์ง๊ฐ ํ(pull)๋์ง ์์์ ์ด๋ค ํ๋๋ ์์๋์ง ์์๋ค. ์กฐ๊ธ ์ง๋ ํ์ ๊ฐ์ ๋ช ๋ น์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ด๋ค.
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ์ํ ๋ชจ๋ ํ๋๋ฅผ ๋จธ์ ์ด ์ฝ์ ์ ์๋ ํ์์ผ๋ก ๋์ดํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์๋ค.
pods=$(kubectl get pods --selector=app=nginx --output=jsonpath={.items..metadata.name})
echo $pods
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
nginx-3ntk0 nginx-4ok8v nginx-qrm3m
์ฌ๊ธฐ์ ์
๋ ํฐ๋ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ(kubectl describe
์ ์ถ๋ ฅ์์ ๋ณด์ธ)์ ์
๋ ํฐ์ ๊ฐ๊ณ ,
๋ค๋ฅธ ํ์์ ํ์ผ์ธ replication.yaml
์ ๊ฒ๊ณผ ๋์ผํ๋ค. --output=jsonpath
์
๋ฐํ๋ ๋ชฉ๋ก์ ๊ฐ ํ๋์ ์ด๋ฆ์ ์ถ๋ ฅํ๋๋ก ํ๋ ์ต์
์ด๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ Spec ์์ฑ
๋ค๋ฅธ ๋ชจ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ปจํผ๊ทธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ apiVersion
, kind
, metadata
์ ๊ฐ์ ํ๋๊ฐ ํ์ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ ์ค๋ธ์ ํธ์ ์ด๋ฆ์ ์ ํจํ
DNS ์๋ธ๋๋ฉ์ธ ์ด๋ฆ์ด์ด์ผ ํ๋ค.
ํ๊ฒฝ์ค์ ํ์ผ์ ๋์์ ๊ด๋ จ๋ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ ๊ด๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ ๋ํ .spec
section๋ ํ์ํ๋ค.
ํ๋ ํ ํ๋ฆฟ
.spec.template
๋ ์ค์ง .spec
ํ๋์์ ์๊ตฌ๋๋ ๊ฒ์ด๋ค.
.spec.template
๋ ํ๋ ํ
ํ๋ฆฟ์ด๋ค. ์ ํํ๊ฒ ํ๋ ์คํค๋ง์ ๋์ผํ๋, ์ค์ฒฉ๋์ด ์๊ณ apiVersion
ํน์ kind
๋ฅผ ๊ฐ์ง ์๋๋ค.
ํ๋์ ํ์ํ ํ๋ ์ธ์๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ํ๋ ํ ํ๋ฆฟ์ ์ ์ ํ ๋ ์ด๋ธ๊ณผ ์ ์ ํ ์ฌ์์ ์ ์ฑ ์ ์ง์ ํด์ผ ํ๋ค. ๋ ์ด๋ธ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ปจํธ๋กค๋ฌ์ ์ค์ฒฉ๋์ง ์๋๋ก ํ๋ผ. ํ๋ ์ ๋ ํฐ๋ฅผ ์ฐธ์กฐํ๋ผ.
์ค์ง Always
์ ๋์ผํ .spec.template.spec.restartPolicy
๋ง ํ์ฉ๋๋ฉฐ, ํน๋ณํ ์ง์ ๋์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด๋ค.
๋ก์ปฌ ์ปจํ ์ด๋์ ์ฌ์์์ ๊ฒฝ์ฐ, ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋ ธ๋์ ์์ด์ ํธ์๊ฒ ์์ํ๋ค. ์๋ฅผ ๋ค์ด Kubelet์ด๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์์ ๋ ์ด๋ธ
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ ์์ฒด๋ ๋ ์ด๋ธ (.metadata.labels
) ์ ๊ฐ์ง ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ .spec.template.metadata.labels
์ ๋์ผํ๊ฒ ์ค์ ํ ๊ฒ์ด๋ค. .metadata.labels
๊ฐ ์ง์ ๋์ด ์์ง ์์ ๊ฒฝ์ฐ,
๊ธฐ๋ณธ์ .spec.template.metadata.labels
์ด๋ค. ํ์ง๋ง ๋ ์ด๋ธ์
๋ค๋ฅธ ๊ฒ์ด ํ์ฉ๋๋ฉฐ, .metadata.labels
๋ผ๋ฒจ์ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์
๋์์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
ํ๋ ์ ๋ ํฐ
.spec.selector
ํ๋๋ ๋ ์ด๋ธ ์
๋ ํฐ์ด๋ค. ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ ์
๋ ํฐ์ ์ผ์นํ๋ ๋ ์ด๋ธ์ด ์๋ ๋ชจ๋ ํ๋๋ฅผ ๊ด๋ฆฌํ๋ค.
์ง์ ์์ฑํ๊ฑฐ๋ ์ญ์ ๋ ํ๋์ ๋ค๋ฅธ ์ฌ๋์ด๋ ํ๋ก์ธ์ค๊ฐ ์์ฑํ๊ฑฐ๋
์ญ์ ํ ํ๋๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ์ค์ธ ํ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ฅผ ๊ต์ฒดํ ์ ์๋ค.
์ง์ ๋ ๊ฒฝ์ฐ .spec.template.metadata.labels
์
.spec.selector
์ ๋์ผํด์ผ ํ๋ฉฐ ๊ทธ๋ ์ง ์์ผ๋ฉด API์ ์ํด ๊ฑฐ๋ถ๋๋ค. .spec.selector
๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์
.spec.template.metadata.labels
์ด๋ค.
๋ํ ์ผ๋ฐ์ ์ผ๋ก ์ด ์ ๋ ํฐ์ ๋ ์ด๋ธ์ด ์ผ์นํ๋ ํ๋๋ฅผ ์ง์ ๋ค๋ฅธ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ๋๋ ์ก๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ปจํธ๋กค๋ฌ๋ก ์์ฑํด์๋ ์๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋ค๋ฅธ ํ๋๋ฅผ ์์ฑํ๋ค๊ณ ์๊ฐํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค๋ ์ด๋ฐ ์์ ์ ์ค๋จํด ์ฃผ์ง ์๋๋ค.
์ค์ฒฉ๋ ์ ๋ ํฐ๋ค์ ๊ฐ๋ ๋ค์์ ์ปจํธ๋กค๋ฌ๋ค์ ์ข ๋ฃํ๊ฒ ๋๋ฉด, ์ญ์ ๋ ๊ฒ๋ค์ ์ค์ค๋ก ๊ด๋ฆฌ๋ฅผ ํด์ผ ํ๋ค (์๋๋ฅผ ์ฐธ์กฐ).
๋ค์์ ๋ ํ๋ฆฌ์นด
.spec.replicas
๋ฅผ ๋์์ ์คํํ๊ณ ์ถ์ ํ๋์ ์๋ก ์ค์ ํจ์ผ๋ก์จ
์คํํ ํ๋์ ์๋ฅผ ์ง์ ํ ์ ์๋ค. ๋ ํ๋ฆฌ์นด๊ฐ ์ฆ๊ฐ ๋๋ ๊ฐ์ํ ๊ฒฝ์ฐ ๋๋
ํ๋๊ฐ ์ ์์ ์ผ๋ก ์ข
๋ฃ๋๊ณ ๊ต์ฒด๊ฐ ์ผ์ฐ ์์๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด
์ธ์ ๋ ์ง ์คํ์ค์ธ ์๊ฐ ๋ ๋๊ฑฐ๋ ๋ฎ์ ์ ์๋ค.
.spec.replicas
๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ 1์ด๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์ฌ์ฉํ๊ธฐ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ํ๋ ์ญ์
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์ ๋ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ํ๋๋ฅผ ์ญ์ ํ๋ ค๋ฉด kubectl delete
๋ฅผ ์ฌ์ฉํ๋ผ.
Kubectl์ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ฅผ 0์ผ๋ก ์ค์ผ์ผํ๊ณ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ ์์ฒด๋ฅผ
์ญ์ ํ๊ธฐ ์ ์ ๊ฐ ํ๋๋ฅผ ์ญ์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ์ด kubectl ๋ช
๋ น์ด ์ธํฐ๋ฝํธ๋๋ฉด ๋ค์ ์์ํ ์ ์๋ค.
REST API๋ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋ก ๋จ๊ณ๋ฅผ ์ํํด์ผ ํ๋ค(๋ ํ๋ฆฌ์นด๋ฅผ 0์ผ๋ก ์ค์ผ์ผํ๊ณ ํ๋์ ์ญ์ ๋ฅผ ๊ธฐ๋ค๋ฆฐ ์ดํ, ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ).
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ง ์ญ์
ํด๋น ํ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ํ ์ ์๋ค.
kubectl์ ์ฌ์ฉํ์ฌ, kubectl delete
์ ์ต์
์ผ๋ก --cascade=orphan
์ ์ง์ ํ๋ผ.
REST API๋ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์ค๋ธ์ ํธ๋ฅผ ์ญ์ ํ๋ผ.
์๋ณธ์ด ์ญ์ ๋๋ฉด ๋์ฒดํ ์๋ก์ด ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ์ฌ ๊ต์ฒดํ ์ ์๋ค. ์ค๋๋ ํ๋์ ์๋ก์ด ํ๋์ .spec.selector
๊ฐ ๋์ผํ๋ค๋ฉด,
์๋ก์ด ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ ์ค๋๋ ํ๋๋ฅผ ์ฑํํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์กด ํ๋๋ฅผ
์๋ก์ด ํ๋ ํ
ํ๋ฆฟ๊ณผ ์ผ์น์ํค๋ ค๋ ๋
ธ๋ ฅ์ ํ์ง ์์ ๊ฒ์ด๋ค.
์๋ก์ด spec์ ๋ํ ํ๋๋ฅผ ์ ์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์
๋ฐ์ดํธํ๋ ค๋ฉด ๋กค๋ง ์
๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ผ.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์์ ํ๋ ๊ฒฉ๋ฆฌ
ํ๋๋ ๋ ์ด๋ธ์ ๋ณ๊ฒฝํ์ฌ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ๋์ ์ ์์ ์ ๊ฑฐ๋ ์ ์๋ค. ์ด ๊ธฐ์ ์ ๋๋ฒ๊น ๊ณผ ๋ฐ์ดํฐ ๋ณต๊ตฌ๋ฅผ ์ํด ์๋น์ค์์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ฑฐ๋ ํ๋๋ ์๋์ผ๋ก ๊ต์ฒด๋๋ค (๋ ํ๋ฆฌ์นด ์๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค๊ณ ๊ฐ์ ).
์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ ํจํด
๋ค์ ์ค์ผ์คํ๊ธฐ
์์์ ์ธ๊ธํ๋ฏ์ด, ์คํํ๋ ค๋ ํ๋๊ฐ ํ ๊ฐ ํน์ 1000๊ฐ์ด๋ ๊ด๊ณ์์ด ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋ ธ๋ ์คํจ ๋๋ ํ๋ ์ข ๋ฃ์ ์ง์ ๋ ์์ ํ๋๊ฐ ์กด์ฌํ๋๋ก ๋ณด์ฅํ๋ค (์ : ๋ค๋ฅธ ์ ์ด ์์ด์ ํธ์ ์ํ ๋์์ผ๋ก ์ธํด).
์ค์ผ์ผ๋ง
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ replicas
ํ๋๋ฅผ ์
๋ฐ์ดํธํ์ฌ, ์๋์ผ๋ก ๋๋ ์คํ ์ค์ผ์ผ๋ง ์ ์ด ์์ด์ ํธ๋ฅผ ํตํด, ๋ ํ๋ฆฌ์นด์ ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์๋ค.
๋กค๋ง ์ ๋ฐ์ดํธ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ํ๋๋ฅผ ํ๋์ฉ ๊ต์ฒดํจ์ผ๋ก์จ ์๋น์ค์ ๋ํ ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ฝ๊ฒ ํ๋๋ก ์ค๊ณ๋์๋ค.
#1353์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ, ๊ถ์ฅ๋๋ ์ ๊ทผ๋ฒ์ 1 ๊ฐ์ ๋ ํ๋ฆฌ์นด๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๊ณ ์๋ก์ด (+1) ์ปจํธ๋กค๋ฌ ๋ฐ ์ด์ (-1) ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐจ๋ก๋๋ก ์ค์ผ์ผํ ํ 0๊ฐ์ ๋ ํ๋ฆฌ์นด๊ฐ ๋๋ฉด ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด๋ค. ์์์น ๋ชปํ ์ค๋ฅ์ ์๊ด์์ด ํ๋ ์ธํธ๋ฅผ ์์ธก ๊ฐ๋ฅํ๊ฒ ์ ๋ฐ์ดํธํ๋ค.
์ด์์ ์ผ๋ก ๋กค๋ง ์ ๋ฐ์ดํธ ์ปจํธ๋กค๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋น ์ํ๋ฅผ ๊ณ ๋ คํ๋ฉฐ ์ฃผ์ด์ง ์๊ฐ์ ์ถฉ๋ถํ ์์ ํ๋๊ฐ ์์ฐ์ ์ผ๋ก ์ ๊ณต๋๋๋ก ๋ณด์ฅํ ๊ฒ์ด๋ค.
๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ๋๊ธฐํ ํ๋ ์ด๋ฏธ์ง ์ ๋ฐ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ํ๋์ ๊ธฐ๋ณธ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ํ๊ทธ์ ๊ฐ์ด ์ ์ด๋ ํ๋์ ์ฐจ๋ณํ๋ ๋ ์ด๋ธ๋ก ํ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
๋ค์์ ๋ฆด๋ฆฌ์ค ํธ๋
๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ์งํ๋๋ ๋์ ๋ค์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆด๋ฆฌ์ค๋ฅผ ์คํํ๋ ๊ฒ ์ธ์๋ ๋ค์์ ๋ฆด๋ฆฌ์ค ํธ๋์ ์ฌ์ฉํ์ฌ ์ฅ๊ธฐ๊ฐ์ ๊ฑธ์ณ ๋๋ ์ฐ์์ ์ผ๋ก ์คํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ํธ๋์ ๋ ์ด๋ธ ๋ณ๋ก ๊ตฌ๋ถ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋น์ค๋ tier in (frontend), environment in (prod)
์ด ์๋ ๋ชจ๋ ํ๋๋ฅผ ๋์์ผ๋ก ํ ์ ์๋ค. ์ด์ ์ด ๊ณ์ธต์ ๊ตฌ์ฑํ๋ 10 ๊ฐ์ ๋ณต์ ๋ ํ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ํ์ง๋ง ์ด ๊ตฌ์ฑ ์์์ ์๋ก์ด ๋ฒ์ ์ '์นด๋๋ฆฌ' ํ๊ธฐ๋ฅผ ์ํ๋ค. ๋๋์ ๋ ํ๋ฆฌ์นด์ ๋ํด replicas
๋ฅผ 9๋ก ์ค์ ํ๊ณ tier=frontend, environment=prod, track=stable
๋ ์ด๋ธ์ ์ค์ ํ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์, ์นด๋๋ฆฌ์ replicas
๊ฐ 1๋ก ์ค์ ๋ ๋ค๋ฅธ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์ tier=frontend, environment=prod, track=canary
๋ผ๋ ๋ ์ด๋ธ์ ์ค์ ํ ์ ์๋ค. ์ด์ ์ด ์๋น์ค๋ ์นด๋๋ฆฌ์ ์นด๋๋ฆฌ ์ด์ธ์ ํ๋ ๋ชจ๋๋ฅผ ํฌํจํ๋ค. ๊ทธ๋ฌ๋ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ฅผ ๋ณ๋๋ก ์กฐ์ํ์ฌ ํ
์คํธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๋ฑ์ ์์
์ด ํผ๋์ค๋ฌ์ธ ์ ์๋ค.
์๋น์ค์ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์ฌ์ฉ
ํ๋์ ์๋น์ค ๋ค์ ์ฌ๋ฌ ๊ฐ์ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ถ ํธ๋ํฝ์ ์ด์ ๋ฒ์ ์ผ๋ก ์ด๋ํ๊ณ ์ผ๋ถ๋ ์ ๋ฒ์ ์ผ๋ก ์ด๋ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ์์ฒด์ ์ผ๋ก ์ข ๋ฃ๋์ง ์์ง๋ง, ์๋น์ค๋งํผ ์ค๋ ์ง์๋ ๊ฒ์ผ๋ก ๊ธฐ๋๋์ง๋ ์๋๋ค. ์๋น์ค๋ ์ฌ๋ฌ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ์ํด ์ ์ด๋๋ ํ๋๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ, ์๋น์ค ๋ผ์ดํ์ฌ์ดํด ๋์(์๋ฅผ ๋ค์ด, ์๋น์ค๋ฅผ ์คํํ๋ ํ๋ ์ ๋ฐ์ดํธ ์ํ์ ์ํด) ๋ง์ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๊ฐ ์์ฑ ๋ฐ ์ ๊ฑฐ๋ ๊ฒ์ผ๋ก ์์๋๋ค. ์๋น์ค ์์ฒด์ ํด๋ผ์ด์ธํธ ๋ชจ๋ ํ๋๋ฅผ ์ ์งํ๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ํ์ง ์๋ ์ํ๋ก ๋จ์ ์์ด์ผ ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํ๋ก๊ทธ๋จ ์์ฑ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ์ํด ์์ฑ๋ ํ๋๋ ํด๋น ๊ตฌ์ฑ์ด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ด์ง์ ์ด ๋ ์ ์์ง๋ง ๊ท ์ผํ๊ณ ์๋ฏธ์ ๋์ผํ๋๋ก ์ค๊ณ๋์๋ค. ์ด๋ ๋ ํ๋ฆฌ์นด๋ ์ํ ์คํ ์ดํธ๋ฆฌ์ค ์๋ฒ์ ์ ํฉํ์ง๋ง ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์คํฐ ์ ์ถ, ์ค๋ ๋ฐ ์ํฌ-ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฉ์ฑ์ ์ ์งํ ์๋ ์๋ค. RabbitMQ work queues์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํฐํจํด์ผ๋ก ๊ฐ์ฃผ๋๋ ๊ฐ ํ๋์ ๊ตฌ์ฑ์ ๋ํ ์ ์ /์ผํ์ฑ ์ฌ์ฉ์ ์ ์์ ๋ฐ๋๋ก ๋์ ์์ ํ ๋น ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด์ผ ํ๋ค. ๋ฆฌ์์ค์ ์์ง ์๋ ํฌ๊ธฐ ์กฐ์ (์ : CPU ๋๋ ๋ฉ๋ชจ๋ฆฌ)๊ณผ ๊ฐ์ ์ํ๋ ๋ชจ๋ ํ๋ ์ฌ์ฉ์ ์ ์๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์์ฒด์ ๋ฌ๋ฆฌ ๋ค๋ฅธ ์จ๋ผ์ธ ์ปจํธ๋กค๋ฌ ํ๋ก์ธ์ค์ ์ํด ์ํ๋์ด์ผ ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ์ฑ ์
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ์๋ํ ์์ ํ๋๊ฐ ํด๋น ๋ ์ด๋ธ ์ ๋ ํฐ์ ์ผ์นํ๊ณ ๋์ํ๋์ง๋ฅผ ํ์ธํ๋ค. ํ์ฌ, ์ข ๋ฃ๋ ํ๋๋ง ํด๋น ํ๋์ ์์์ ์ ์ธ๋๋ค. ํฅํ ์์คํ ์์ ์ฌ์ฉํ ์ ์๋ readiness ๋ฐ ๊ธฐํ ์ ๋ณด๊ฐ ๊ณ ๋ ค๋ ์ ์์ผ๋ฉฐ ๊ต์ฒด ์ ์ฑ ์ ๋ํ ํต์ ๋ฅผ ๋ ์ถ๊ฐ ํ ์ ์๊ณ ์ธ๋ถ ํด๋ผ์ด์ธํธ๊ฐ ์์๋ก ์ ๊ตํ ๊ต์ฒด ๋๋ ์ค์ผ์ผ ๋ค์ด ์ ์ฑ ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ๊ณํ์ด๋ค.
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ๋ ์ด ์ข์ ์ฑ
์์ ์์ํ ์ ์ฝ์ ๋ฐ๋๋ค. ๊ทธ ์์ฒด๋ก๋ ์ค๋น์ฑ ๋๋ ํ์ฑ ํ๋ก๋ธ๋ฅผ ์คํํ์ง ์์ ๊ฒ์ด๋ค. ์คํ ์ค์ผ์ผ๋ง์ ์ํํ๋ ๋์ , ์ธ๋ถ ์คํ ์ค์ผ์ผ๋ฌ (#492์์ ๋
ผ์๋)๊ฐ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์ replicas
ํ๋๋ฅผ ๋ณ๊ฒฝํจ์ผ๋ก์จ ์ ์ด๋๋๋ก ์๋๋์๋ค. ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์ ์ค์ผ์ค๋ง ์ ์ฑ
(์๋ฅผ ๋ค์ด spreading)์ ์ถ๊ฐํ์ง ์์ ๊ฒ์ด๋ค. ์คํ ์ฌ์ด์ง ๋ฐ ๊ธฐํ ์๋ํ ๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐฉํดํ ์ ์์ผ๋ฏ๋ก ์ ์ด๋ ํ๋๊ฐ ํ์ฌ ์ง์ ๋ ํ
ํ๋ฆฟ๊ณผ ์ผ์นํ๋์ง ํ์ธํด์ผ ํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐํ ์๋ฃ, ์์ ์ข
์์ฑ, ๊ตฌ์ฑ ํ์ฅ ๋ฐ ๊ธฐํ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ๊ณณ์ ์ํ๋ค. ๋๋์ ํ๋ ์์ฑ ๋ฉ์ปค๋์ฆ (#170)๊น์ง๋ ๊ณ ๋ คํด์ผ ํ๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ์กฐํฉ ๊ฐ๋ฅํ ๋น๋ฉ-๋ธ๋ก ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ๋๋๋ก ๊ณ ์๋์๋ค. ํฅํ ์ฌ์ฉ์์ ํธ์๋ฅผ ์ํด ๋ ์์ ์์ค์ API ๋ฐ/๋๋ ๋๊ตฌ์ ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ณด์์ ์ธ ๊ธฐ๋ณธ ์์๊ฐ ๊ทธ ์์ ๊ตฌ์ถ ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ค. ํ์ฌ kubectl์ด ์ง์ํ๋ "๋งคํฌ๋ก" ์์ (์คํ, ์ค์ผ์ผ)์ ๊ฐ๋ ์ฆ๋ช ์ ์์์ด๋ค. ์๋ฅผ ๋ค์ด Asgard์ ๊ฐ์ด ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ, ์คํ ์ค์ผ์ผ๋ฌ, ์๋น์ค, ์ ์ฑ ์ค์ผ์ค๋ง, ์นด๋๋ฆฌ ๋ฑ์ ๊ด๋ฆฌํ ์ ์๋ค.
API ์ค๋ธ์ ํธ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ์ฟ ๋ฒ๋คํฐ์ค REST API์ ์ต์์ ์์ค์ ๋ฆฌ์์ค์ด๋ค. API ์ค๋ธ์ ํธ์ ๋ํ ๋ ์์ธํ ๊ฒ์ ReplicationController API object ์์ ์ฐพ์ ์ ์๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ๋์
๋ ํ๋ฆฌ์นด์
ReplicaSet
์ ์๋ก์ด ์งํฉ์ฑ ๊ธฐ์ค ๋ ์ด๋ธ ์
๋ ํฐ์ด๋ค.
์ด๊ฒ์ ์ฃผ๋ก ๋ํ๋ก์ด๋จผํธ์ ์ํด ํ๋์ ์์ฑ, ์ญ์ ๋ฐ ์
๋ฐ์ดํธ๋ฅผ ์ค์ผ์คํธ๋ ์ด์
ํ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ์
๋ฐ์ดํธ ์กฐ์ ์ด ํ์ํ๊ฑฐ๋ ์
๋ฐ์ดํธ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋ ํ๋ฆฌ์นด์
์ ์ง์ ์ฌ์ฉํ๋ ๋์ ๋ํ๋ก์ด๋จผํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ํ๋ก์ด๋จผํธ (๊ถ์ฅ๋จ)
Deployment
๋ ๊ธฐ๋ณธ ๋ ํ๋ฆฌ์นด์
๊ณผ ๊ทธ ํ๋๋ฅผ ์
๋ฐ์ดํธํ๋ ์์ ์์ค์ API ์ค๋ธ์ ํธ์ด๋ค. ์ ์ธ์ ์ด๋ฉฐ, ์๋ฒ ์ฌ์ด๋์ด๊ณ , ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ๋กค๋ง ์
๋ฐ์ดํธ ๊ธฐ๋ฅ์ ์ํ๋ค๋ฉด ๋ํ๋ก์ด๋จผํธ๋ฅผ ๊ถ์ฅํ๋ค.
๋ฒ ์ด ํ๋
์ฌ์ฉ์๊ฐ ์ง์ ํ๋๋ฅผ ๋ง๋ ๊ฒฝ์ฐ์ ๋ฌ๋ฆฌ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋ ธ๋ ์ค๋ฅ ๋๋ ์ปค๋ ์ ๊ทธ๋ ์ด๋์ ๊ฐ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ ๋ ธ๋ ์ ์ง ๊ด๋ฆฌ์ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ด๋ค ์ด์ ๋ก๋ ์ญ์ ๋๊ฑฐ๋ ์ข ๋ฃ๋ ํ๋๋ฅผ ๋์ฒดํ๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋์ ํ๋๋ง ํ์ํ ๊ฒฝ์ฐ์๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ํ๋ก์ธ์ค ๊ด๋ฆฌ์์ ๋น์ทํ๊ฒ ์๊ฐํ๋ฉด, ๋จ์ง ๋จ์ผ ๋ ธ๋์ ๊ฐ๋ณ ํ๋ก์ธ์ค๊ฐ ์๋ ์ฌ๋ฌ ๋ ธ๋์์ ์ฌ๋ฌ ํ๋๋ฅผ ๊ฐ๋ ํ๋ ๊ฒ์ด๋ค. ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ ๋ก์ปฌ ์ปจํ ์ด๋๊ฐ kubelet๊ณผ ๊ฐ์ ๋ ธ๋์ ์์ด์ ํธ๋ก ์ฌ์์ํ๋๋ก ์์ํ๋ค.
์ก
์์ฒด์ ์ผ๋ก ์ ๊ฑฐ๋ ๊ฒ์ผ๋ก ์์๋๋ ํ๋ (์ฆ, ๋ฐฐ์น ์ก)์ ๊ฒฝ์ฐ
๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ ๋์ Job
์ ์ฌ์ฉํ๋ผ.
๋ฐ๋ชฌ์
๋จธ์ ๋ชจ๋ํฐ๋ง์ด๋ ๋จธ์ ๋ก๊น
๊ณผ ๊ฐ์ ๋จธ์ ๋ ๋ฒจ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋์๋ ๋ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ ๋์
DaemonSet
์ ์ฌ์ฉํ๋ผ. ์ด๋ฐ ํ๋๋ค์ ์๋ช
์ ๋จธ์ ์ ์๋ช
์ ๋ฌ๋ ค ์๋ค.
๋ค๋ฅธ ํ๋๊ฐ ์์๋๊ธฐ ์ ์ ํ๋๊ฐ ๋จธ์ ์์ ์คํ๋์ด์ผ ํ๋ฉฐ,
๋จธ์ ์ด ์ฌ๋ถํ
/์ข
๋ฃ ์ค๋น๊ฐ ๋์ด ์์ ๋ ์์ ํ๊ฒ ์ข
๋ฃ๋๋ค.
๋ค์ ๋ด์ฉ
- ํ๋์ ๋ํด ๋ฐฐ์ด๋ค.
- ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์ ํ๋ ๋ํ๋ก์ด๋จผํธ์ ๋ํด ๋ฐฐ์ด๋ค.
ReplicationController
๋ ์ฟ ๋ฒ๋คํฐ์ค REST API์ ์ผ๋ถ์ด๋ค. ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ API์ ๋ํด ์ดํดํ๊ธฐ ์ํด ReplicationController ์ค๋ธ์ ํธ ์ ์๋ฅผ ์ฝ๋๋ค.