π ν΄λΉ ν¬μ€ν
μ μμνμΈμ! λ컀/μΏ λ²λ€ν°μ€ μμ μ μ½κ³ κ°μΈμ μΈ λͺ©μ νμ μμ±λλ κΈμ
λλ€. ν¬μ€ν
μ μ¬μ©λλ λͺ¨λ μλ£λ μ κ° μ§μ μ¬κ΅¬μ±νμμμ μ립λλ€.
μ΄λ² ν¬μ€ν μμλ νλλ₯Ό μ¬μ©νλ λ λ€λ₯Έ μμ 리μμ€ μ€λΈμ νΈλ€λ‘ Jobs, DaemonSet, StatefulSetμ λν΄μ μμ보λλ‘ νμ. μ§κΈκΉμ§ μ΄ν΄λ³Έ ReplicaSet, Deployment μ κ°μ 리μμ€ μ€λΈμ νΈλ€λ λ°°μ μλλ°, μ΄κ²λ€λ νλλ₯Ό μ¬μ©νλ μμ 리μμ€ μ€λΈμ νΈλ€μ΄λΌκ³ ν μ μλ€. νμ§λ§ νλλ₯Ό μ¬μ©νλ 리μμ€ μ€λΈμ νΈλ€λ‘μ Jobs, DaemonSet, StatefulSetμ Replicaset, Deployment μλ μ½κ° λ€λ₯Έ λͺ©μ μΌλ‘ μ¬μ©νκ³€ νλ€. νλμ© μ΄ν΄λ³΄λλ‘ νμ.
1. νΉμ λμμ μννκ³ μ’ λ£ν΄! : Jobs
κ°μ₯ λ¨Όμ μμλ³Ό 리μμ€ μ€λΈμ νΈλ Jobs μ΄λ€. μ¬μ€ Jobsλ μ΄λ₯Έλ° 'μ‘' μ΄λΌκ³ λΆλ₯΄λ©° νΉν λ°μ΄ν° μμ§λμ΄λ§μ΄λ Airflowλ₯Ό λ€λ£¨μ΄λ³Έ μ¬λλ€μκ²λ μ΅μν μ©μ΄μΌ μ μλ€. Jobμ λν΄μ μ μνλ©΄ "νΉμ λμμ μννκ³ μ’ λ£ν΄μΌ νλ μμ μ μν μ€λΈμ νΈ"μ΄λ€. νλλ₯Ό μμ±ν΄μ μ΄λ€ λμμ μνμν¨λ€λ μ μμλ ReplicaSet μ΄λ Deployment μ λμΌνλ€κ³ λ³Ό μ μλ€. νμ§λ§ ν° μ°¨μ΄μ μ νλμ μ΅μ’ μνμ΄λ€.
ReplicaSet μ΄λ Deploymentλ λ³΄ν΅ νμ μ΄μλκ³ μμ΄μΌ νλ μ ν리μΌμ΄μ μλ²μ μ£Όλ‘ μ΄μ©λλ©° μ΄λ° 리μμ€ μ€λΈμ νΈλ€μ΄ μ§ν₯νλ νλμ μ΅μ’ μνλ μ€ν μ€ μ¦, Running μ΄λ€. νμ§λ§ Jobμ΄ μ§ν₯νλ νλμ μ΅μ’ μνλ μ μ μ’ λ£ μ¦, Completed μ΄λ€.(μ°Έκ³ λ‘ νλμ μν μ’ λ₯μ λν΄μλ μ λͺ¨λ₯Έλ€λ©΄ μ λ² ν¬μ€ν μ μ°Έμ‘°νμ) μ¦, Jobμ ν΄λΉ νλ 컨ν μ΄λμ init νλ‘μΈμ€μ μ’ λ£ μ½λ(exit code)κ° 0μ λ°νν΄μΌ νλ κ²μ λͺ©μ μΌλ‘ νλ€.
κ·Έλ¬λ©΄ Jobμ μμ±νλ κ°λ¨ν μμ 맀λνμ€νΈλ₯Ό νλ μ΄ν΄λ³΄μ.
apiVersion: batch/v1
kind: Job
metadata:
name: zedd-hello-job
spec:
template:
spec:
restartPolicy: Never
containers:
- image: busybox
args: ["sh", "-c", "echo Hello, World && exit 0"]
name: zedd-hello-job
μ 맀λνμ€νΈλ₯Ό 보면 Deployment 맀λνμ€νΈλ λ§€μ° μ μ¬ν¨μ λ³Ό μ μλ€. νΉν, template λΆλΆμ νλ ν νλ¦Ώ μμμ μ μνλ©΄ λλ€. νμ§λ§ Job 맀λνμ€νΈλ₯Ό μμ±ν λλ μ£Όμν΄μΌ ν μ μ΄ μλ€. λ°λ‘ restartPolicy μ΄λ€. μ λ² ν¬μ€ν μμ λ°°μ΄ κ²μ²λΌ restartPolicyλ νλκ° μ¬μμνλ μ μ± μ μ μ€μ ν΄μΌ νλ€. restartPolicyμ λͺ μν μ μλ κ°μΌλ‘λ Always, Never, OnFailureκ° μμλλ°, μ΄ μ€ Never, OnFailure λ μ€ νλλ‘ λͺ μν΄μ£Όμ΄μΌ νλ€. μ΄λ₯Ό μ΄ν΄νκΈ° μν΄μλ Jobμ λͺ©μ μ λ€μ μκΈ°μν¬ νμκ° μλ€.
λ€μ νλ² μ΄μΌκΈ°νμ§λ§, Jobμ λͺ©μ μ νλκ° μ μ μ€νλκ³ 'μ μ μ’ λ£'λλ κ²μ λͺ©νλ‘ νλ€. λ°λΌμ, μ μ μ’ λ£λ¨μλ λ€μ μ¬μμνλλ‘ λͺ μνλ Alwaysλ₯Ό μ¬μ©ν΄μλ μλλ κ²μ΄λ€.
κ·Έλ¦¬κ³ args μΈμμμ λ³΄λ€ μνΌ νλ 컨ν μ΄λμ init νλ‘μΈμ€ λ§μ§λ§μ μ’ λ£ μ½λλ₯Ό 0μ λ°νν¨μΌλ‘μ¨ μ μ’ λ£λλλ‘ ν΄μ£Όμλ€.
μ΄λ κ² Jobμ λ³΄ν΅ λ°°μΉ(Batch) μμ μ μν΄ μ£Όλ‘ μ¬μ©λκ³€ νλ€. ν¬λ‘€λ§μ΄λ λ°μ΄ν° ETL, νλ μ λ λλ§, νμΌ μΈμ½λ© λ±κ³Ό κ°μ΄ ν λ² μννκ³ μ’ λ£λλ©΄ λλ μμ λ€μ μ£Όλ‘ μ¬μ©λλ€. μ£Όμν μ μΌλ‘ Jobμ λμμ±μ μ격νκ² μ§ν€κ³ 보μ₯ν΄μΌ νλ λ³λ ¬ μ²λ¦¬λ₯Ό μν΄ μ¬μ©νλ κ²μ μλλΌλ μ μ μμλμ. κ·Έλ¦¬κ³ Jobμ΄ μ€ννλ νλκ° μ€ν¨νλ©΄ restartPolicyμ λ°λΌ μ¬μμλ μλ μμΌλ Jobμ΄ μ²λ¦¬νλ λ‘μ§μ λ©±λ±μ±(μ°μ°μ μ¬λ¬ λ² μ μ©ν΄λ κ²°κ³Όκ° λ¬λΌμ§μ§ μλ νΉμ±)μ κ°μ§λ κ²μ΄ μ’λ€.
Jobμ μ’ λ μΈλ°νκ² μ¬μ©νλ λ°©λ²μ λν΄μ μκΈ° μν΄ Jobμ μ΅μ μ λν΄μ μμ보λλ‘ νμ. ν¬κ² 2κ°μ§κ° μ‘΄μ¬νλ€. λ°©κΈ μ΄ν΄λ³Έ 맀λνμ€νΈμ μ΅μ 2κ°μ§λ₯Ό μΆκ°ν΄λ³΄μλ€.
apiVersion: batch/v1
kind: Job
metadata:
name: zedd-hello-job
spec:
completions: 3
parallelism: 1
template:
spec:
restartPolicy: OnFailure
containers:
- image: busybox
args: ["sh", "-c", "echo Hello, World && exit 0"]
name: zedd-hello-job
첫λ²μ§Έλ‘λ spec.completions μ΄λ€. μ΄ κ°μ Jobμ΄ μ±κ³΅νλ€κ³ μ¬κ²¨μ§λ €λ©΄ λͺ κ°μ νλκ° μ±κ³΅ μ¦, λͺ κ°μ νλκ° μ μ μ’ λ£λμ΄μΌ νλμ§λ₯Ό μ€μ νλ€. κΈ°λ³Έ κ°μ 1μ΄λ€. λ€μ λ§ν΄, μ Job 맀λνμ€νΈλ₯Ό apply νλ©΄ νλ ν νλ¦Ώμ λͺ μλμ΄ μλ busybox νλ 컨ν μ΄λκ° μμ°¨μ μΌλ‘ 3κ° μμ±μ΄ λκ³ , 3κ° λͺ¨λ μ μ μ’ λ£λλ©΄ Jobμ΄ μ±κ³΅νλ€κ³ μ¬κ²¨μ§λ€λ λ»μ΄λ€.
κ·Έλ°λ° λ°©κΈ busybox νλ 컨ν μ΄λκ° 'μμ°¨μ μΌλ‘' 3κ° μμ±μ΄ λλ€κ³ νλ€. κΌ μ΄λ κ² 1κ°κ° μμ± λ° μ’ λ£κ° λκ³ λ λ€μ λ€λ₯Έ 1κ°κ° μμ±λμ΄μΌ ν κΉ? μ΄μ λ λ°λ‘ spec.parallelism κ°μ΄ 1μ΄κΈ° λλ¬Έμ΄λ€. spec.parallelismλ λμμ μμ±λ νλμ κ°μλ₯Ό μ€μ νλ κ°μ΄λ€. μ΄ κ°λ λν΄νΈ κ°μ΄ 1μ΄λ€. λ°λΌμ μ 맀λνμ€νΈμμλ spec.parallelismμ 1μ λͺ μνκΈ° λλ¬Έμ 'μμ°¨μ μΌλ‘' νλκ° 1κ°μ© μμ± λ° μ’ λ£λλ κ²μ΄λ€.
λ§μ½ spec.parallelismμ 3μΌλ‘ λ°κΎΈλ©΄ μ΄λ»κ² λ κΉ? 3κ°μ νλκ° λμμ μμ±λκ³ μ’ λ£λλ κ²μ λ³Ό μ μλ€.
μΆκ°λ‘ μμλ μ μ Jobμ νλκ° μ€ν¨νλ©΄ restartPolicyμ λͺ μλ μ μ± μ μν΄ νλκ° μ¬μμ(OnFailure)λκ±°λ μλλ©΄ μλ‘μ΄ νλλ₯Ό λ€μ μμ±(Never)νλ€κ³ νλ€. μ΄ λ, Jobμμλ νλκ° μ€ν¨ν μ μ΅λ 6λ²κΉμ§ μ¬μλλ₯Ό μννλ€. λ¬Όλ‘ μ΄ μ¬μλ μ΅λ νμλ spec.backoffLimit κ°μΌλ‘ 컀μ€ν°λ§μ΄μ§ ν μ μλ€. λν Jobμ νλκ° λͺ¨μ’ μ μ΄μ λ‘ μμ μ΄ μ§νλμ§ μκ³ κ³μ νλ©λλ κ²½μ°, Jobμ μ±κ³΅λ μ€ν¨λ μλ μ€κ°μ μνλ‘ μ€λμκ° λ¨Έλ¬΄λ₯Ό μκ° μλ€. μ΄λ¬ν μν©μμ λΉ μ Έλμ€κΈ° μν΄ Jobμ νλκ° μ€νλ μ μλ μ΅λ μκ°μ spec.activeDeadlineSeconds μ΅μ μΌλ‘ μ νν μλ μλ€. ν΄λΉ μκ°λ³΄λ€ λ μ€λ μ€κ° μνλ‘ λ¨Έλ¬΄λ₯Έλ€λ©΄ νλλ κ°μ μ’ λ£λλ©° νλμ μνλ λΉμ μ μ’ λ£λ‘ μ¬κ²¨μ§λ€.
2. Jobsμ μ£ΌκΈ°μ μΈ λ°λ³΅μ λνλ€: CronJobs
λ€μμΌλ‘ μμλ³Ό 리μμ€ μ€λΈμ νΈλ Jobsμ μ맀ν 격μ΄λΌκ³ ν μ μλ ν¬λ‘ μ‘(Cronjobs)μ΄λ€. Cronjobsλ Jobsλ₯Ό μ£ΌκΈ°μ μΈ κ°κ²©μΌλ‘ μ€ννλ 리μμ€ μ€λΈμ νΈμΈλ°, νΉν Unix κ³μ΄ OSμμμ Cron μ€μΌμ₯΄λ§μ μ¬μ©ν΄λ³Έ μ¬λμ΄λΌλ©΄ λ§€μ° μ΅μν κ²μ΄λ€. μ€μ λ‘ Cron μ€μΌμ₯΄λ§ κ·μΉμ κ·Έλλ‘ μ¬μ©νκΈ° λλ¬Έμ λ μ΄ν΄νκΈ° μ½λ€. μμ 맀λνμ€νΈλ λ€μκ³Ό κ°λ€.
apiVersion: batch/v1
kind: CronJob
metadata:
name: zedd-cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: zedd-cronjob
image: busybox
args: ["sh", "-c", "echo Hello World && exit 0"]
μΆκ°λ λ΄μ©μ spec.schedule κ³Ό spec.jobTemplate μμμ΄λ€. spec.schedule μλ ν΄λΉ CronJobμ μ΄λ κ°κ²©μΌλ‘ μ€νν μ§λ₯Ό λͺ μνλ€. κ·Έλ¦¬κ³ spec.jobTemplate μμμλ μ§μ λͺ©μ°¨μμ λ³Έ Job 맀λνμ€νΈμμ spec.template μμ μ¦, νλ ν νλ¦Ώμ λͺ μν΄μ£Όλ©΄ λλ€.
(μ°Έκ³ λ‘ μλνλ μ£ΌκΈ°λ₯Ό Cron μ€μΌμ₯΄λ§λ‘ μ΄λ»κ² κ·μΉνμν€λμ§ ν·κ°λ¦°λ€λ©΄ μ¬κΈ°λ₯Ό μ°Έμ‘°ν΄λ³΄μ. λ§μ΄λνκ² μ μ©νλ€)
κ·Έλ¦¬κ³ λ§€λνμ€νΈμ kindκ° Jobκ³Ό λ¬λ¦¬ CronJobμΌλ‘ λͺ μλμ΄ μμ§λ§ μΏ λ²λ€ν°μ€ μμμ 리μμ€λ₯Ό μ‘°νν λλ jobsλ‘ λ κ° λͺ¨λ μ‘°νκ° λλ€. κ·Έλ¦¬κ³ μ‘°νν λ κΈ°λ³Έμ μΌλ‘λ μ±κ³΅ν μ‘μ κΈ°λ‘μ μ΅λ 3κ°κΉμ§, μ€ν¨ν μ‘μ κΈ°λ‘μ μ΅λ 1κ°κΉμ§λ§ κΈ°λ‘λμ§λ§, μ΄ μ€μ κ°λ Job λλ CronJob 맀λνμ€νΈμ spec.successfulJobsHistoryLimit κ³Ό spec.failedJobsHistoryLimit κ°μΌλ‘ 컀μ€ν°λ§μ΄μ§ ν μ μλ€.
3. λͺ¨λ λ Έλμ νλλ₯Ό νλμ© ν λΉνμ: DaemonSets
λ€μμΌλ‘ μμλ³Ό 리μμ€ μ€λΈμ νΈλ λ°λͺ¬μ (DaemonSets)μ΄λ€. DaemonSetsμ λμΌν νλλ₯Ό μΏ λ²λ€ν°μ€ ν΄λ¬μ€ν° λ΄μ λͺ¨λ λ Έλμ νλμ© μμ±νλ κ²μ λͺ©μ μΌλ‘ νλ€. κ·Έλμ DaemonSetsμ μ£Όλ‘ λ‘κΉ , λͺ¨λν°λ§, λ€νΈμνΉ λ±μ μν μμ΄μ νΈλ₯Ό κ° λ Έλμ μμ±ν΄μΌ ν λ μ£Όλ‘ μ¬μ©νλ€. λ¨μ μΈ μλ‘, μΏ λ²λ€ν°μ€ λ€νΈμνΉμ μν kube-proxy λ calico λ€νΈμν¬ νλ¬κ·ΈμΈ, κ·Έλ¦¬κ³ λ§€λμ§λ λͺ¨λν°λ§ μμ€ν μΈ λ°μ΄ν°λ μ datadog-agent λ±μ΄ μλ€. DaemonSetsμ μμ±νλ μμ 맀λνμ€νΈλ₯Ό μ΄ν΄λ³΄μ.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: zedd-daemonset
spec:
selector:
matchLabels:
name: zedd-daemonset-pod
template:
metadata:
labels:
name: zedd-daemonset-pod
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: busybox-pod
image: busybox
args: ["tail", "-f", "/dev/null"]
resources:
limits:
cpu: 100m
memory: 200Mi
DaemonSets 맀λνμ€νΈλ Deployment 맀λνμ€νΈλ μ μ¬νλ€. νΉν, Deploymentμμ λΌλ²¨ μ λ ν°λ₯Ό μ΄μ©ν΄ νΉμ λΌλ²¨μ κ°λ νλλ€μ κ΄λ¦¬ν μ μλλ‘ ν κ²μ²λΌ DaemonSetsλ λΌλ²¨ μ λ ν°λ₯Ό μ΄μ©ν΄ νΉμ λΌλ²¨μ κ°λ νλλ₯Ό κ΄λ¦¬νλ€. DaemonSetsμμ λΌλ²¨ μ λ ν°λ spec.selector.matchLabels μμμ λͺ μν λ μ΄λΈμ΄ νλ ν νλ¦Ώ μμ μ¦, spec.template.metadata.labels μμκ³Ό μΌμΉμμΌμ£Όμ΄μΌ νλ€.
μΆκ°λ‘, λ§μ€ν° λ Έλμλ ν΄λΉ νλκ° ν λΉλ μ μλλ‘ tolerationsμ μΆκ°νλ€. μ΄ λΆλΆμ νμμ μΈ κ²μ μλλ€. λν μ 맀λνμ€νΈμμ resources μμμ 보면 νλμ 리μμ€λ₯Ό Guaranteed ν΄λμ€λ‘ μ€μ νλ€. μ¦, requests μ limits κ°μ΄ λͺ¨λ λμΌνκ² ν κ²μ΄λ€.(μ 맀λνμ€νΈμμλ requests μμμ΄ μλ΅λμ΄ μμ§λ§ μ΄λ κ² νλ©΄ λͺ μλ limitsμ κ°μ requestsμ λμΌνκ² μλμ€μ νλ€)
μ΄λ κ² Gruaranteed ν΄λμ€λ‘ μ€μ ν κ²μ λ°λͺ¬μ μ΄λΌλ κ²μ΄ λ³΄ν΅ λͺ¨λ λ Έλμ λν μμ΄μ νΈ μν μ νκΈ° λλ¬Έμ μ€μν μν μ ν κ²μμ μλ―Ένλ€. λ°λΌμ 리μμ€ λΆμ‘±μΌλ‘ μΈν΄ λ°λͺ¬μ νλλ€μ΄ μ’ λ£λλ κ²μ λ§κ³ μ Guaranteed ν΄λμ€λ‘ μ€μ νλλ‘ νλ κ²μ΄ κΆκ³ λλ€.
4. μν(State)λ₯Ό κ°λ νλλ₯Ό κ΄λ¦¬νλ€: StatefulSets
μΌλ°μ μΌλ‘ μΏ λ²λ€ν°μ€μμλ μνλ₯Ό κ°μ§ μλ μ¦, Statelessν μ ν리μΌμ΄μ μ λ€λ£¨λ κ²½μ°κ° λ§λ€. μ΄λ₯Ό μν΄μλ κ·Έλμ μ°λ¦¬κ° μμ보μλ λνλ‘μ΄λ¨ΌνΈμ κ°μ 리μμ€ μ€λΈμ νΈλ₯Ό μ΄μ©ν΄μ κ΄λ¦¬νλ©΄ λλ€. νμ§λ§ λ°μ΄ν°λ² μ΄μ€ μλ²μ κ°μ΄ μνλ₯Ό κ°λ μ¦, Statefulν μ ν리μΌμ΄μ μ μΏ λ²λ€ν°μ€μμ μ€ννκ³ κ΄λ¦¬νλ κ²μ κ½€λ 볡μ‘ν μΌμ΄ λλ€. μλνλ©΄ 'μν'λ₯Ό κ°λλ€λ κ²μ 곧 'μν'λ₯Ό λνλ΄λ 'λ°μ΄ν°'λ₯Ό νλ λ΄λΆμμ μ΄λ»κ² κ΄λ¦¬ν μ§, λ μΈλΆμμ μνλ₯Ό κ°λ νλλ€μ μ΄λ»κ² μ κ·Όν μ§ λ±μ λν΄μ κ³ λ €ν΄μΌ νκΈ° λλ¬Έμ΄λ€.
μΏ λ²λ€ν°μ€μμλ μνλ₯Ό κ°λ νλλ₯Ό μν΄ StatefulSets μ΄λΌλ 리μμ€ μ€λΈμ νΈλ₯Ό μ 곡ν΄μ μνλ₯Ό κ°λ νλλ₯Ό μλ²½νλ μλμ§λ§, μ΄λμ λ κ΄λ¦¬ν μ μλλ‘ κΈ°λ₯μ μ 곡ν΄μ€λ€.
λ¨Όμ μνλ₯Ό κ°λ νλμ μνλ₯Ό κ°μ§ μλ νλ κ°μ μ°¨μ΄μ μ΄ λ¬΄μμΈμ§ μ΄ν΄νκΈ° μν΄ μ€μ μΏ λ²λ€ν°μ€μμ λΉμ λ₯Ό λ€μ΄λ³΄μ. λ¨Όμ μνλ₯Ό κ°μ§ μλ Stateless νλλ₯Ό 'κ°μΆ'μ΄λΌκ³ ν μ μλ€. κ°μΆμ΄λΌλ λ¨μ΄μ μ¬μ μ μλ―Έλ 'μ§μμ κΈ°λ₯΄λ μ§μΉ. μ, λ§, λΌμ§, κ° λ, λ±. μ‘μ§μΉ' μ΄λ€. μ¬κΈ°μ μ°λ¦¬κ° μ£Όλͺ©ν λΆλΆμ μ΄ κ°μΆμ μνλ μ§μΉλ€μ μΈμ λ μ§ λ체λ μ μκ³ κ°κ°μ κ³ μ ν μ‘΄μ¬λ‘ μ¬κΈ°μ§ μλλ€λ κ²μ΄λ€. μ΄λ₯Ό μΏ λ²λ€ν°μ€ λνλ‘μ΄λ¨ΌνΈλ‘ μ°κ²°μμΌλ³΄λ©΄, λνλ‘μ΄λ¨ΌνΈκ° κ΄λ¦¬νλ νλλ€μ μΈμ λ μ§ λ체λ μ μλ€. μΌλ‘λ‘, μ΄λ―Έ Running μ€μΈ νλλ₯Ό μ¬μμνλ©΄ μλ‘ μμ±λλ νλλ μ΄μ μ μ€νλκ³ μλ νλλμ λ€λ₯Έ μ‘΄μ¬μ΄λ€. λ€λ₯Έ μ‘΄μ¬μμ μ΄λ»κ² μ μ μλκ³ ? νλ μ΄λ¦ λμ λΆλ ν΄μ¬κ°μ΄ λ¬λΌμ§μΌλ‘μ¨ μΈμν μ μλ€. μ€μ νλκ° μ¬μμλλ©΄ λμ ν΄μ¬κ°μ΄ λ³κ²½λμ΄ μλ‘μ΄ νλκ° μμ±λλ κ²μ λ³Ό μ μλ€. λ°λΌμ μ°λ¦¬λ Stateless νλλ₯Ό μ΄λ₯Έλ° 'κ°μΆ'μ΄λΌκ³ λΉμ νλ μ μ΄λ€.
λ°λ©΄μ μνλ₯Ό κ°λ Stateful νλλ 'μ μλλ¬Ό'μ΄λΌκ³ ν μ μλ€. λ°λ €κ²¬ λλ λ°λ €λ¬ λ± μ΄λ ν λλ¬Όμ μ μλλ¬Όλ‘μ ν€μ°λ μ¬λλ€μ 보면 κ·Έ λλ¬Ό ν λ§λ¦¬λ§λ€ κ³ μ ν μ΄λ¦μ λΆμ¬μ€λ€.(ex. νΈλ, ν°λ₯μ΄, λλ μ΄, .... λ±λ±..) μ΄λ κ² κ³ μ ν μ΄λ¦μ λΆμ¬μ€λ€λ κ²μ λ체 λΆκ°λ₯ν μ‘΄μ¬λΌλ κ±Έ μλ―Ένλ©°, κ³ μ ν μλ³μλ₯Ό κ°λλ€λ κ²μ μλ―Ένλ€. μΏ λ²λ€ν°μ€μμλ μ΄λ¬ν μν μ StatefulSets 리μμ€ μ€λΈμ νΈκ° νλ€. κ·Έλμ StatefulSetsμ λνλ‘μ΄λ¨ΌνΈμ λ¬λ¦¬ μ¬μμν΄λ λμΌν νλ μ΄λ¦μΌλ‘ μμ±μ΄ λλ€. μ¬λ΄μ΄μ§λ§, StatefulSetsμ μΏ λ²λ€ν°μ€ 1.5 μ΄μ λ²μ μλ μ€μ λ‘ 'PetSets' λΌλ μ΄λ¦μ΄μλ€.
StatefulSetsκ° μ΄λ€ κ°λ μΈμ§ μ΄λ‘ μ μΌλ‘ μ΄ν΄ν΄λ³΄μλ€. κ·Έλ¬λ©΄ μ΄μ StatefulSetsμ λν 맀λνμ€νΈ μμλ₯Ό νλ μ΄ν΄λ³΄μ.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: example-statefulsets
spec:
serviceName: statefulsets-svc
selector:
matchLabels:
name: zedd-statefulsets
replicas: 3
template:
metadata:
labels:
name: zedd-statefulsets
spec:
containers:
- name: statefulsets-container
image: alicek106/rr-test:echo-hostname
ports:
- containerPort: 80
name: web
---
apiVersion: v1
kind: Service
metadata:
name: statefulsets-svc
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
name: zedd-statefulsets
μ 맀λνμ€νΈμ μλ―Έλ₯Ό νλμ© μ΄ν΄λ³΄μ. λ¨Όμ StatefulSet μ΄λΌλ kindλ₯Ό λͺ μν¨μΌλ‘μ¨ μ€ν μ΄νΈνμ μ΄λΌλ 리μμ€ μ€λΈμ νΈλ₯Ό μμ±νλ€. μ΄ λ§€λνμ€νΈλ λνλ‘μ΄λ¨ΌνΈ 맀λνμ€νΈλ κ±°μ μ μ¬νλ€. λ€λ§ ν κ°μ§ μ°¨μ΄μ μ΄ μλλ° λ°λ‘ spec.serviceName νλͺ©μ΄λ€. ν΄λΉ νλͺ©μλ μ€ν μ΄νΈνμ μ νλλ‘ μ κ·Όν μ μλ μλΉμ€ μ΄λ¦μ μ λ ₯ν΄μΌ νλ€. μ¦, μ μμλ‘ λ°μ§λ©΄ kindμ Serviceλ₯Ό λͺ μν μλΉμ€ 리μμ€ μ€λΈμ νΈμ μ΄λ¦μΈ "statefulsets-svc" λΌλ κ°μ κ·Έλλ‘ λͺ μν΄μ£Όμ΄μΌ νλ€.
κ·Έλ¬λ©΄ μ΄ spec.serviceName νλͺ©μ μ μν¨μΌλ‘μ¨ μ΄λ€ ν¨κ³Όκ° λ°μνλ κ±ΈκΉ? μ°μ ν΄λΉ νλͺ©μ μ μνμ§ μλ λνλ‘μ΄λ¨ΌνΈμ κ²½μ° μλΉμ€λ‘ μμ²μ΄ μ λ¬λλ©΄ μλΉμ€λ λλ€ν νλλ₯Ό μ νν΄μ νΉμ νλλ‘ νΈλν½μ μ λ¬νλ€. κ·Έλ¦ΌμΌλ‘ λμνν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
νμ§λ§ μ€ν μ΄νΈνμ μ μ¬μ©νλ€λ©΄ νλκ° μνλ₯Ό κ°κ³ μκΈ° λλ¬Έμ μλΉμ€κ° λλ€νκ² μμ²μ μ λ¬νλ κ² μλ νλμ μλ³μλ₯Ό μ§μ μ§μ ν΄μ μμ²μ μ λ¬ν μ μκ² νλ€. κ·Έλ¦Όμ μλμ κ°λ€.
μμ κ°μ΄ νλμ μλ³μλ₯Ό μ§μ μ§μ ν΄μ μμ²μ μ λ¬ν μ μλλ‘ ν΄μ£Όλ μλΉμ€λ₯Ό ν€λ리μ€(Headless) μλΉμ€λΌκ³ νκ³ , μ€ν μ΄νΈνμ μ μ΄λ¬ν ν€λλ¦¬μ€ μλΉμ€λ₯Ό μ΄μ©νλ€. 맀λνμ€νΈ μμμλ Service 맀λνμ€νΈμ spec.clusterIPμ None κ°μ λͺ μν¨μΌλ‘μ¨ μ¬μ©μ΄ κ°λ₯νλ€. μ°Έκ³ λ‘ ν€λλ¦¬μ€ μλΉμ€μ μ΄λ¦μ SRV λ μ½λλ‘ μ°μ΄κΈ° λλ¬Έμ μ΄λ‘ μΈν΄ ν€λλ¦¬μ€ μλΉμ€μ μ΄λ¦μ ν΅ν΄ νλμ μ κ·Όν μ μλ IPλ₯Ό λ°ννκ² λλ€.
μΆκ°μ μΌλ‘, StatefulSetsμ μ£Όλ‘ PV(Persistent Volume)κ³Ό μμ£Ό μ¬μ©λλ€. μλνλ©΄ PVλ₯Ό μ΄μ©νλ©΄ StatefuleSetsμ΄ λ΄λΆμμ κ΄λ¦¬νλ λ°μ΄ν°λ₯Ό μμμ (persistent)μΌλ‘ 보κ΄ν μ μκΈ° λλ¬Έμ΄λ€. λ³΄ν΅ StatefuleSetsλ μ¬λ¬ κ°μ νλλ‘ μ΄μνκΈ° λλ¬Έμ StatefulSetsκ° μμ±νλ κ° νλλ§λ€ PVC(Persistent Volume Claim)λ₯Ό λ³λλ‘ μμ±ν΄μ£Όμ΄μΌ νλ λ²κ±°λ‘μμ΄ μλ€. λ¬Όλ‘ μ΄λ₯Ό μν΄ StatefulSets 리μμ€ μ€λΈμ νΈ λ§€λνμ€νΈμμ μ€ν μ΄νΈνμ μ μμ±ν λ νλλ§λ€ PVCλ₯Ό μλμΌλ‘ μμ±ν¨μΌλ‘μ¨ PVλ κ·Έ μκ° λμ μΌλ‘ κ°μ΄ μμ±λλ λ€μ΄λλ―Ή νλ‘λΉμ Έλ κΈ°λ₯μ μ¬μ©ν μ μλλ‘ μ§μνλ€. μμΈν μ¬μ©λ²μ 곡μλ¬Έμλ₯Ό μ°Έμ‘°ν΄λ³΄λλ‘ νμ.
μ°Έκ³ λ‘ μ€ν μ΄νΈνμ μ μμ νλ€κ³ ν΄λ PVCμ λ€μ΄λλ―Ή νλ‘λΉμ Έλλ PVλ κ°μ΄ μμ λλ κ²μ μλμ μμλμ.