
์ง๋ ํฌ์คํ ์์๋ ๋ฌด์ค๋จ ์๋น์ค์ ๋ ๋ ํ ๊ธฐ๋ฐ์ด ๋๋ ๋ ํ๋ฆฌ์นด์ (ReplicaSet) ๊ณผ ๋ํ๋ก์ด๋จผํธ(Deployment) ์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ด ๋์ ์น ์๋ฒ๋ API ์๋ฒ์ฒ๋ผ ์ํ๊ฐ ์๊ณ (Stateless) ๊ณ์ ์ผ์ ธ ์์ด์ผ ํ๋ ์๋น์ค์ ์ต์ ํ๋์ด ์์์ฃ .
ํ์ง๋ง ์ค์ ์ด์ ํ๊ฒฝ์์๋ "๋ชจ๋ ๋ ธ๋์ ํ๋์ฉ๋ง ๋ ์ผ ํ๋ ํ๋", "๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ํ๋", "ํ ๋ฒ ์์ ํ๊ณ ๊น๋ํ๊ฒ ๋๋๋ ํ๋" ๋ฑ ๋ค์ํ ์๊ตฌ์ฌํญ์ด ์กด์ฌํฉ๋๋ค.
์ค๋์ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ด๋ฌํ ํน์ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ๋ 4๊ฐ์ง ํน์ ์ํฌ๋ก๋(DaemonSet, StatefulSet, Job, CronJob)์, ํด๋ฌ์คํฐ ์ด์์ ํ์ ์คํฌ์ธ ๋ ธ๋ ๊ด๋ฆฌ(Cordon, Drain)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๐
๋ฐ๋ชฌ์ ์ ๋ ํ๋ฆฌ์นด์ ์ ํน์ํ ํํ๋ก, ํด๋ฌ์คํฐ ๋ด์ ๋ชจ๋ ๋ ธ๋์ ํ๋๋ฅผ ๋ฑ ํ ๊ฐ์ฉ๋ง ์์ฑํ๋๋ก ๋ณด์ฅํ๋ ์ํฌ๋ก๋์ ๋๋ค.
๊ฐ์ฅ ํฐ ํน์ง์ replicas (ํ๋ ๊ฐ์)๋ฅผ ์์ ์ง์ ํ ์ ์๋ค๋ ์ ์
๋๋ค.
ํด๋ฌ์คํฐ์ ๋
ธ๋๊ฐ ์๋ก ์ถ๊ฐ๋๋ฉด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์์์ ์ ๋
ธ๋์ ๋ฐ๋ชฌ์
ํ๋๋ฅผ ํ๋ ๋์์ฃผ๊ณ , ๋
ธ๋๊ฐ ์ญ์ ๋๋ฉด ํ๋๋ ํจ๊ป ์ฌ๋ผ์ง๋๋ค. (ํน์ ๋
ธ๋์ ๋์ฐ๊ณ ์ถ์ง ์๋ค๋ฉด nodeSelector๋ Anti-Affinity๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.)
๐ก ์ธ์ ์ฌ์ฉํ ๊น?
์ฃผ๋ก ๊ฐ ๋ ธ๋์ ๋ฆฌ์์ค ์ํ๋ฅผ ์์งํ๋ ๋ชจ๋ํฐ๋ง ์์ด์ ํธ(Datadog, Prometheus Node Exporter)๋ ๋ ธ๋๋ณ ๋ก๊ทธ๋ฅผ ์์งํ๋ ๋ก๊ทธ ์์ง๊ธฐ(Fluentd) ๋ฑ ๋ชจ๋ ๋ ธ๋์์ ๋ฐ๋์ ๋์๊ฐ์ผ ํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค์ ์ฌ์ฉํฉ๋๋ค.
์ ํํ ์ดํด๋ฅผ ์ํด ๋ชจ๋ํฐ๋ง์ ์ํ ํ๋ก๋ฉํ ์ฐ์ค ์ต์คํฌํฐ๋ฅผ ๋ฐ๋ชฌ์ ์ผ๋ก ๋์๋ณด๊ฒ ์ต๋๋ค.
# daemonset.yaml
apiVersion: apps/v1 # ๋ฐ๋ชฌ์
๋ apps/v1์ ์ฌ์ฉํฉ๋๋ค
kind: DaemonSet
metadata:
name: prometheus-daemonset
spec:
selector:
matchLabels:
tier: monitoring # ๊ธฐ๋ฅ๊ตฌ๋ณ์ ์ํ ์ด๋ฆํ
name: prometheus-exporter
template:
metadata:
labels:
tier: monitoring
name: prometheus-exporter
spec:
containers:
- name: prometheus
image: prom/node-exporter
ports:
- containerPort: 80
# ์์ฑ ๋ฐ ํ์ธ
$ kubectl apply -f daemonset.yaml
$ kubectl get pods -o wide # ํ๋๊ฐ ๊ฐ ๋
ธ๋๋ง๋ค ํ๋์ฉ ๊ท ๋ฑํ๊ฒ ๋ฐฐ์น๋ ๊ฒ์ ํ์ธ!

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
prometheus-daemonset-2plvc 1/1 Running 0 4m17s 10.244.1.134 worker2 <none> <none>
prometheus-daemonset-8g9bn 1/1 Running 0 4m17s 10.244.2.100 worker1 <none> <none>
์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์๋ฉด ๊ฐ ์์ปค ๋ ธ๋์ 1๊ฐ์ฉ ๋ฐ๋ชฌ์ ์ด ์์ฑ๋์ด ๋์๊ฐ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ชฌ์ ์ ์ ๋ฐ์ดํธ ์ ๋ต์ ๋ํ๋ก์ด๋จผํธ์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.
OnDelete: ๋งค๋ํ์คํธ(YAML)๋ฅผ ์์ ํด ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝํด๋ ๊ธฐ์กด ํ๋๊ฐ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ๊ด๋ฆฌ์๊ฐ kubectl delete pod ๋ช
๋ น์ผ๋ก ์๋ ์ญ์ ํด์ผ๋ง ์ ๋ฒ์ ์ ํ๋๊ฐ ๋น๋๋ค. ๋ฐ๋ชฌ์
์ ํ ๋ฒ ๋์ฐ๋ฉด ์ฅ๊ธฐ๊ฐ ์ผ๋๋ ๋ชจ๋ํฐ๋ง ์ฉ๋๊ฐ ๋ง์ ๊ณผ๊ฑฐ์ ์ฃผ๋ก ์ฐ๋ ๋ฐฉ์์
๋๋ค.
RollingUpdate: ์ต์ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ง์ํ๋ ๋ฐฉ์์
๋๋ค. ๋จ, ํ๋์ ๋
ธ๋์ ํ๋๋ฅผ 2๊ฐ ๋์ธ ์ ์์ผ๋ฏ๋ก maxUnavailable(๋์์ ์ญ์ ๊ฐ๋ฅํ ํ๋ ์)๋ง ์ง์ ํด์ ๋กค๋ง ์
๋ฐ์ดํธ๋ฅผ ์ํํฉ๋๋ค.
์ด๋ฆ ๊ทธ๋๋ก ์ํ(State)๋ฅผ ์ ์ง(ful) ํด์ผ ํ๋ ์ํฌ๋ก๋๋ฅผ ์ํ ๋ฆฌ์์ค์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, MongoDB ๋ฑ)์ฒ๋ผ ํ๋๊ฐ ์ฌ์์๋๋๋ผ๋ ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์ด์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
๋ํ๋ก์ด๋จผํธ(๋ ํ๋ฆฌ์นด์ )์ ๋น๊ตํ๋ฉด ํฐ ์ฐจ์ด์ ์ด ๋ ๊ฐ์ง ์์ต๋๋ค.
์์ธก ๊ฐ๋ฅํ ์ด๋ฆ: ํ๋ ์ด๋ฆ ๋ค์ ๋ฌด์์ ๋ฌธ์์ด์ด ๋ถ๋ ๋ํ๋ก์ด๋จผํธ์ ๋ฌ๋ฆฌ, sample-statefulset-0, sample-statefulset-1์ฒ๋ผ ์์ฐจ์ ์ธ ์ซ์ ์ธ๋ฑ์ค๊ฐ ๋ถ์ต๋๋ค. ์ญ์ ๋ ๋๋ ๋ฒํธ๊ฐ ํฐ ๊ฒ๋ถํฐ ์ญ์์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
๋
๋ฆฝ์ ์ธ ์๊ตฌ ๋ณผ๋ฅจ: spec.volumeClaimTemplates ์ค์ ์ ํตํด ํ๋๋ง๋ค ๊ณ ์ ํ ์๊ตฌ ๋ณผ๋ฅจ(Persistent Volume)์ ๋ถ์ฌ์ค๋๋ค. ํ๋๊ฐ ์ฃฝ๊ณ ๋ค๋ฅธ ๋
ธ๋์์ ๋ค์ ์ด์๋๋, ์ด๋ฆ์ด ๋๊ฐ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ์ฐ๋ ๋ณผ๋ฅจ์ ๊ทธ๋๋ก ๋ค์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํฉ๋๋ค.
์ค์ต์ ํตํด์ ์์๋ด ์๋ค.
# sample-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sample-statefulset
spec:
# ์คํ
์ดํธํ์
์ ํ๋์ ๊ณ ์ ํ ๋คํธ์ํฌ ID๋ฅผ ์ํด ๋ฐ๋์ ์ ์ฉ Service๊ฐ ํ์ํจ
serviceName: sample-statefulset
# ์์ฑ๋ ํ๋์ ๊ฐ์ (0๋ฒ, 1๋ฒ, 2๋ฒ ์์๋๋ก ์์ฑ๋จ)
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx
volumeMounts:
# ํ๋จ์ volumeClaimTemplates์์ ์ ์ํ ์ด๋ฆ์ ์ฌ๊ธฐ์ ์ฐ๊ฒฐ
- name: www
# ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๊ฒฝ๋ก
mountPath: /usr/share/nginx/html
# ์คํ
์ดํธํ์
์ ํต์ฌ: ๊ฐ ํ๋๋ง๋ค '๊ฐ๋ณ' ๋ณผ๋ฅจ์ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ํ
ํ๋ฆฟ
volumeClaimTemplates:
- metadata:
name: www
spec:
# ํ ๋
ธ๋์์๋ง ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ฐ๋ฅํ๋๋ก ์ค์
accessModes:
- ReadWriteOnce
resources:
requests:
# ๊ฐ ํ๋๋ณ๋ก ํ ๋น๋ ์ ์ฅ ๊ณต๊ฐ ํฌ๊ธฐ
storage: 1G
$ kubectl apply -f sample-statefulset.yaml
# ํ๋ ํ์ธ (0, 1, 2 ์์๋๋ก ์์ฑ๋จ)
$ kubectl get pods
# ๋ณผ๋ฅจ ๋ฐ ํด๋ ์ ํ์ธ
$ kubectl get pvc
$ kubectl get pv
ํ ์์ ์์๋ ํด๋น ๋ช
๋ น์ด๊ฐ ์๋ ํ
๋ฐ StatefulSet์ volumeClaimTemplates๋ฅผ ํตํด ๊ฐ ํ๋๋ง๋ค 1GB์ง๋ฆฌ ์ ์ฉ ๋์คํฌ (PVC)๋ฅผ ์๊ตฌํฉ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ง์ ๊ตฌ์ถํ ๋ก์ปฌ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์๋ ๋์คํฌ๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ์์คํ
(StorageClass) ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ธฐ ๋๋ฌธ์, ๋์คํฌ๋ฅผ ๋ฐ์ง ๋ชปํด ์คํ์ด ์๋๋ ๊ฒ๋๋ค.
๊ฐ๋ฅํ๊ฒ ํ๋ ค๋ฉด, ์กฐ๊ฑด์ ๋ง๋ PV(Persistent Volume) 3๊ฐ๋ฅผ ์๋์ผ๋ก ์ง์ ๋ง๋ค๋ฉด ๋ฉ๋๋ค.
์์ ๋ณธ ๋ฆฌ์์ค๋ค์ด ์น์๋ฒ์ฒ๋ผ ๊ณ์ ์ผ์ ธ ์์ด์ผ ํ๋ ๋ฆฌ์์ค๋ผ๋ฉด, ์ก(Job) ์ ํ ๋ฒ(๋๋ ์ง์ ๋ ํ์๋งํผ)๋ง ์คํ๋๊ณ ๋ชฉ์ ์ ๋ฌ์ฑํ๋ฉด ์ค์ค๋ก ์ข ๋ฃ(Completed)๋๋ ์ํฌ๋ก๋์ ๋๋ค.
์ฃผ๊ธฐ์ ์ธ ๋ฐฑ์ , ๋๊ท๋ชจ ์ฐ์ฐ, ๋ฐฐ์น(Batch) ์์ ๋ฑ์ ์ฐ์ ๋๋ค.
๋ฐ๋ก ์ค์ต ๋จผ์ ํด๋ณด๊ฒ ์ต๋๋ค.
# sample-job.yaml
apiVersion: batch/v1 # Job์ batch/v1์ ์ฌ์ฉํฉ๋๋ค
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4 # ์คํจ๋ฅผ ํ์ฉํ๋ ์ต๋ ํ์
$ kubectl apply -f sample-job.yaml
$ kubectl logs pi-์ผ๋ จ๋ฒํธ # ์๋ฃ๋ ํ๋์ ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด๋ฉด ํ์ด 2์ฒ ์๋ฆฌ๊ฐ ์ถ๋ ฅ๋จ!

ํด๋น ํ๋๋ ์ฐ์ฐ์ด ๋๋๋ฉด Running ์ํ์์ Completed(์๋ฃ) ์ํ๋ก ๋ณ๊ฒฝ๋์ด ์์ ์ ๋ฉ์ถฅ๋๋ค.
(์ดํ ํ๋จ์ ์ค๋ช ํ ttlSecondsAfterFinished ์ต์ ์ ์ฃผ์ง ์์ผ๋ฉด ๋ก๊ทธ ํ์ธ์ ์ํด ํ๋ ์์ฒด๋ ์ญ์ ๋์ง ์๊ณ ๋จ์์์ต๋๋ค.)
restartPolicy (์คํจ ์ ๋์ฒ๋ฒ)
Never: ์ฅ์ ๊ฐ ๋๋ฉด ์์ ์๋ก์ด ์ด๋ฆ์ ํ๋๋ฅผ ์๋ก ์์ฑํด์ ๋ค์ ์๋ํฉ๋๋ค.
OnFailure: ํ๋๋ ์๋ก ๋ง๋ค์ง ์๊ณ , ๊ธฐ์กด ํ๋ ์์ ์ปจํ
์ด๋ ๋ช
๋ น์ด๋ง ๋ค์ ์ํํฉ๋๋ค.
ttlSecondsAfterFinished: ์ก์ด '์ฑ๊ณต'ํ๊ณ ๋์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ํ๋๋ฅผ ์๋์ผ๋ก ์ญ์ (์ฒญ์)ํด์ฃผ๋ ์ ์ฉํ ์ต์
์
๋๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ ์ต์
๋ชฉ์ ์ ๋ฐ๋ผ ์ก์ ๋ณ๋ ฌ๋ก ํ์ํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
| ์์ ์ ํ | completions (์ฑ๊ณต ํ์) | parallelism (๋ณ๋ ฌ ์คํ ์) |
|---|---|---|
| ํ ๋ฒ๋ง ์คํํ๋ ๋จ์ผ ํ์คํฌ | 1 (๊ธฐ๋ณธ๊ฐ) | 1 (๊ธฐ๋ณธ๊ฐ) |
| ์ง์ ๋ ํ์(N๋ฒ)๋ฅผ ๋ณ๋ ฌ๋ก ์คํ | N | ์์์ ์ซ์ |
| ์์๋๋ก ํ๋์ฉ ์คํํ๋ ํ | ์ค์ ์ ํจ | 1 |
| N๊ฐ๋ฅผ ๋ณ๋ ฌ๋ก ๋ฝ์ ์ฐ๋ ํ | ์ค์ ์ ํจ | ์์์ ์ซ์ (N) |
์ก(Job)์ด ์๋์ผ๋ก ํ ๋ฒ ์คํํ๋ ๊ฒ์ด๋ผ๋ฉด, ํฌ๋ก ์ก(CronJob) ์ ๋ฆฌ๋
์ค์ crontab์ฒ๋ผ ํน์ ์ฃผ๊ธฐ๋ง๋ค Job์ ์๋์ผ๋ก ์์ฑํด ์ฃผ๋ ์ํฌ๋ก๋์
๋๋ค.
๋งค์ผ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์ , ๋งค์๊ฐ ๋ก๊ทธ ์์นด์ด๋น ๋ฑ์ ํ์์ ์ ๋๋ค.
# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *" # 1๋ถ๋ง๋ค ์คํ (๋ถ ์ ์ผ ์ ์์ผ)
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from Kubernetes cluster
restartPolicy: OnFailure
ํฌ๋ก ์ก์ ์ง์ ๋ ์๊ฐ๋ง๋ค ํ๋๋ฅผ ๊ณ์ ์ฌ์์ฑํฉ๋๋ค. ๊ณผ๊ฑฐ์ ์ด๋ ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก 3๊ฐ๊น์ง๋ง ๋จ๊ธฐ๊ณ ์ค๋๋ ํ๋๋ ์์์ ์ง์์ค๋๋ค.
spec.concurrencyPolicy)์คํ ์ฃผ๊ธฐ๊ฐ ์งง๊ฑฐ๋ ์์ ์ด ์ค๋ ๊ฑธ๋ ค ์ด์ ์์ ์ด ๋ ๋๋ฌ๋๋ฐ ๋ค์ ์ฃผ๊ธฐ ์๊ฐ์ด ๋์์ ๋์ ๋์์ ์ ์ํฉ๋๋ค.
Allow (๊ธฐ๋ณธ๊ฐ): ์ ํ ์์ด ๋ฌด์กฐ๊ฑด ์ ์ก์ ์คํํฉ๋๋ค.
Forbid: ์ด์ ์ก์ด ์ ๋๋ฌ์ผ๋ฉด ์ด๋ฒ ์ฃผ๊ธฐ๋ ๊ฑด๋๋๋๋ค.
Replace: ์ด์ ์ก์ ๊ฐ์ ๋ก ์ทจ์ํ๊ณ ์๋ก์ด ์ก์ผ๋ก ๋ฎ์ด์์๋๋ค.
๐ก [ํต์ฌ] ์ค๋ฌด ๊ฐ์ฌ๋ ๊ฟํ: ๋ก๊ทธ๋ ๋ฐ๋์ ์ธ๋ถ(External)๋ก!
ํฌ๋ก ์ก์ด๋ ํ๋์ ๋ก๊ทธ๋ฅผ ํ์ธํ ๋ ๋งค๋ฒ ํฐ๋ฏธ๋์์
kubectl logs๋ฅผ ์น๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค. ์ค๋ฌด(์ด์ ๋จ๊ณ)์์๋ ์ธ๋ถ ๋ก๊ทธ ์์คํ (Elasticsearch, Datadog ๋ฑ)์ผ๋ก ๋ก๊ทธ๋ฅผ ๋ฆฌ๋ค์ด๋ ์ ํ์ฌ ์ค์ ์ง์คํํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค.
๋ก๊ทธ ํํธํ ํด๊ฒฐ: ์์ปค ๋ ธ๋์ ๋ฟ๋ฟ์ด ํฉ์ด์ง ๋ก๊ทธ๋ฅผ ํ ๊ณณ์์ ๊ฒ์/๋ถ์
๊ณ ๊ฐ์ฉ์ฑ(HA): K8s ํด๋ฌ์คํฐ๋ ๋ ธ๋๊ฐ ์ฃฝ์ด๋ ๋ก๊ทธ๋ ์์ ํ๊ฒ ๋ณด์กด
์ฐธ๊ณ : ๊ณผ๊ฑฐ์๋ HostPath๋ฅผ ์จ์ ๋ ธ๋์ ์ง์ ๋จ๊ธฐ๊ธฐ๋ ํ์ผ๋ ์์ฆ์ ์ ์ฐ๋ ์ถ์ธ์ ๋๋ค.
์ง๊ธ๊น์ง ํ๋๋ฅผ ๋์ฐ๋ ๋ฒ์ ๋ฐฐ์ ๋ค๋ฉด, ์ด๋ฒ์ "๋ฌธ์ ๊ฐ ์๋ ๋ ธ๋(์๋ฒ)์์ ํ๋๋ฅผ ๋ํผ์ํค๊ฑฐ๋ ๋์ฐ์ง ๋ชปํ๊ฒ ๋ง๋ ๋ฐฉ๋ฒ" ์ ์์๋ณด๊ฒ ์ต๋๋ค.
ํ๋์จ์ด ์ ๊ฒ์ด๋ ์ปค๋ ์ ๋ฐ์ดํธ ์ ํ์์ ์ธ ํด๋ฌ์คํฐ ์ด์ ๊ธฐ์ ์ ๋๋ค.
ํน์ ๋ ธ๋์ ๋ฌธ์ ๊ฐ ๊ฐ์ง๋์ด ํ ์ํ๋ ์ ์งํ๋, ์๋ก์ด ํ๋๊ฐ ์ค์ผ์ค๋ง(๋ฐฐ์น)๋๋ ๊ฒ๋ง ๋ง๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
# worker1 ๋
ธ๋๋ฅผ ์ค์ผ์ค๋ง ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋ณ๊ฒฝ
$ kubectl cordon worker1
# ๋ํ๋ก์ด๋จผํธ๋ฅผ 4๊ฐ๋ก ์ค์ผ์ผ ์์ ํด๋ณด๋ฉด?
$ kubectl scale deployment sample-deployment --replicas=4
๐ ํ์ธํด ๋ณด๋ฉด ๊ธฐ์กด์
worker1์ ์๋ ํ๋๋ ๊ทธ๋๋ก ์ด์์์ง๋ง, ์๋ก ์ถ๊ฐ๋ ํ๋๋ค์ ๋ชจ๋worker2์๋ง ๋ชฐ๋ ค์ ์์ฑ๋ฉ๋๋ค.
๋
ธ๋๋ฅผ ์์ ํ ์ฌ๋ถํ
ํ๊ฑฐ๋ ๊ต์ฒดํด์ผ ํด์, ํด๋น ๋
ธ๋์ ๋๊ณ ์๋ ๋ชจ๋ ํ๋๋ฅผ ๋ค๋ฅธ ๊ฑด๊ฐํ ๋
ธ๋๋ก ๊ฐ์ ๋ํผ(Eviction) ์ํฌ ๋ ์ฌ์ฉํฉ๋๋ค. drain์ ์คํํ๋ฉด ํด๋น ๋
ธ๋๋ ์๋์ผ๋ก cordon ์ํ๊ฐ ๋ฉ๋๋ค.
# worker1์ ๋ชจ๋ ํ๋๋ฅผ ๋ํผ์ํด
$ kubectl drain worker1 --ignore-daemonsets
๐ ์ฃผ์: ๊ฐ ๋ ธ๋๋ง๋ค ๋ฐ๋์ ํ๋์ฉ ๋ ์์ด์ผ ํ๋ ๋ฐ๋ชฌ์ (DaemonSet) ํ๋๋ ๋ํผ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์๋ฌ๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ ๋ช ๋ น์ด์ฒ๋ผ
--ignore-daemonsets์ต์ ์ ์ฃผ์ด ๋ฐ๋ชฌ์ ์ ๋ฌด์ํ๊ณ ๋๋จธ์ง ํ๋๋ค๋ง ๋ํผ์์ผ์ผ ํฉ๋๋ค.
์ค๋์ ๊ฐ ๋ ธ๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ๋ชฌ์ ๋ถํฐ, ๋ฐ์ดํฐ๋ฅผ ์งํค๋ ์คํ ์ดํธํ์ , ์ผํ์ฑ ์์ ์ ์ํ ์ก/ํฌ๋ก ์ก, ๊ทธ๋ฆฌ๊ณ ๋ ธ๋๋ฅผ ์์ ํ๊ฒ ๋น์ฐ๋ ์ด์ ์คํฌ๊น์ง ์ฟ ๋ฒ๋คํฐ์ค์ ์ฌํ ์ํฌ๋ก๋๋ค์ ์ดํด๋ณด์์ต๋๋ค.
์ด๋ฌํ ํน์ ์ํฌ๋ก๋๋ค์ ๋ชฉ์ ์ ๋ง๊ฒ ์ ์ฌ์ ์์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค๋ต๊ฒ ์ฐ๋ ์ง๋ฆ๊ธธ์ ๋๋ค. ๋ค์ ํฌ์คํ ์์๋ ์ธ๋ถ ์ฌ์ฉ์์๊ฒ ์ฐ๋ฆฌ ์๋น์ค๋ฅผ ์คํํ๋ ๊ด๋ฌธ, ์๋น์ค(Service)์ ์ธ๊ทธ๋ ์ค(Ingress) ์ ๋ํด ๋ค๋ฃจ์ด ๋ณด๊ฒ ์ต๋๋ค.