ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค. ๋ง์ฝ ์๋ค๋ฉด ์ง์ ํด์ฃผ์ธ์ :)
์ฟ ๋ฒ๋คํฐ์ค์์ ReplicaSet ์ ํตํด 3๊ฐ์ ํ๋๋ฅผ ๋ฐฐํฌํ๋ค๊ณ ์๊ฐํด๋ด ์๋ค. ์ด๋ ํ๋์ ํ๋๋ฅผ ์ญ์ ํ๊ฒ ๋๋ฉด ๊ณง ๋ค์ ํ๋๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฆ, ํ๋๊ฐ ์ต์ 3๊ฐ ์ด์์ด ์คํ๋๋๋ก ReplicaSet ๋ฅผ ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์ฃฝ์๋ ํ๋๋ฅผ ์๋กญ๊ฒ ์์์ํต๋๋ค. ์ด๋ ์ฟ ๋ฒ๋คํฐ์ค์ ํน์ง ์ค ํ๋์ธ Self Healing ์ด๊ธฐ๋ ํฉ๋๋ค.
ReplicaSet, Deployment ๋ฑ์์ ๋ช ์ํ๋ Replica ์ ๊ฐฏ์๋ ๊ณ ์ /์ต๋๊ฐ ์๋ ์ต์๋ฅผ ์๋ฏธํฉ๋๋ค.
3๊ฐ๋ผ๊ณ ๊ฐ์ ํ์ ๋, ๋กค๋ง์ ๋ฐ์ดํธ๋ ๋น์๋ฐ์ ์ธ ์ข ๋ฃ์ ์ํด 3๊ฐ ์ด์์ ํ๋๊ฐ ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
๊ทธ๋ผ ์ด๊ฑธ ์ข ๋ ์ ๋ฌธ์ ?์ผ๋ก ์ ๊ทผํด๋ด ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋(Desired) ReplicaSet ์ ๊ฐฏ์๋ 3๊ฐ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋๊ฐ ์ฃฝ์ด 2๊ฐ๊ฐ ๋์๋ค(Lived)๋ ๊ฒ์ ์ด๋ฅผ ์๋ฐํ๋ ํ์์ ๋๋ค. ๋ค์ ๋งํด Desired State ์ Lived State ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์๋ฐ ์ฌํญ์ด ์๋์ง ๋ ์ฃผ์(Watch) ํ๊ณ ์๋ ๋ ์์ด ์๋๋ฐ, ๋ฐ๋ก ์ปจํธ๋กค ํ๋ ์ธ์ ์ปดํฌ๋ํธ ์ค ํ๋์ธ Controller Manager ์ ๋๋ค.
Controller Manager ์ Control Loop ์ด๋ผ๋ ํ์๋ฅผ ํตํด ์ฐ๋ฆฌ๊ฐ ์ํ๋(Desired) ์ํ์ ํ์ฌ(Lived) ์ํ๋ฅผ ๋ง์ณ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ํ๋ฅผ ๋ง์ถฐ์ฃผ๋ ํ์๋ฅผ Reconciliation(๋ฆฌ์ปจ์ค๋ฆฌ์์ด์ ) ์ด๋ผ๊ณ ํฉ๋๋ค.
๋์ํํด๋ณด๋ฉด ์๋์ ๊ฐ์ฃ .
Controller Manager ์์์ Control Loop ์ ํตํด ๋ฌดํํ ๊ด๋ จํ ๋ฆฌ์์ค๋ฅผ ์ฃผ์(Watch) ํ๊ณ ์๊ณ , ๋ง์ฝ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ๋ฆฌ์์ค๊ฐ ์๋ค๋ฉด Reconcile(๋ฆฌ์ปจ์ฌ์ผ) ์ ํตํด์ ์๋ก์ ์ํ๋ฅผ ๋ง์ณ์ค๋๋ค.
ReplicaSet ์ ๋งค๋ํ์คํธ๋ฅผ ํญ์ ์ฃผ์ํ๊ณ ์๋ค๊ฐ, ํ๋๊ฐ ํ๋ ์ฃฝ๋๋ค ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ํ๋(Desired) ์ํ๋ก ๋งค๋ํ์คํธ๋ฅผ ๋ง์ณ์ฃผ๋ ๊ฒ์ด์ง์.
ReplicaSet ์ธ์๋ Deployment, DaemonSet, StatefulSet, CronJob, SeviceAccount ๊ฐ Controller Manager ์ ์ํด ์ฃผ์(Watch) ๋ฅผ ๋นํฉ๋๋ค.
ํํธ, Reconciliation ๋ 3๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค.
- Observe (๊ด์ฐฐ)
- Analyze (๋ถ์)
- Act (์คํ)
๊ด์ฐฐ(Observe) ํ๊ณ ์๋ ๋ฆฌ์์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ Controller Manager ๋ ๊ด๋ จํ ์ด๋ฒคํธ๋ฅผ ์ฃผ์(Watch) ํ์ฌ ์ค์ ์ํ(Lived State) ๋ฅผ ์ฐพ์, ์ํ๋ ์ํ(Desired State) ์ ์ฐจ์ด๋ฅผ ๋ถ์(Analyze) ํ๊ณ , ์ํ๋ ์ํ๋ก ๊ตฌ๋๋๋๋ก ์์ ์ ์ํ(Act) ํฉ๋๋ค.
"๋ด๊ฐ ๋์์๋ค!" ๋ผ๊ณ ํํํ๊ธด ํ๋๋ฐ, ์ ํํ๋ ์ฃฝ์๋ ์ ๊ฐ ์ด์๋๋๊ฑด ์๋๊ณ ์๋กญ๊ฒ ํ๋๋ฅผ ๋ง๋ ํ์ Deployment ์ ๋งตํํ๋ ๊ฒ์ ๋๋ค!
์ด๋ฐ ํ์๋ฅผ ํด์ฃผ๋ ๋ ์์ Controller ๋ผ๊ณ ์ง์นญํ๋๋ฐ, ์ด์ ๋น์ทํ ํ์๋ฅผ ํ๋ ๋ ์์ด ํ๋ ๋ ์กด์ฌํฉ๋๋ค.
๋ฐ๋ก ์คํผ๋ ์ดํฐ(Operator) ์ ๋๋ค.
๋ํ์ ์ผ๋ก ํ๋ก๋ฉํ ์ฐ์ค ์คํผ๋ ์ดํฐ๊ฐ ์กด์ฌํ์ฃ !
์ฌ์ค ์ด ๋ ๋ ์์ ํ์๊ฐ ๊ต์ฅํ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ๋ช ํํ๊ฒ ๋์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ๊ธด ํ๋ค์ง๋ง, ๋ณดํต CRD(CustomResourceDefinition) ๋ฅผ ํตํด Reconciliation ๋ฅผ ์ํํ๋ค๋ฉด Operator, CRD ์์ด ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ก๋ง ์งํ๋๋ Reconciliation ๋ผ๋ฉด Controller ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๊ฒ๋ ์ ๋งคํ ๊ฒ์ด ArgoCD ๋ฅผ ๋น๋์ด ๋ณด๋ฉด CRD ๋ฅผ ํตํ Reconciliation ์ ์งํํ๋ ์ปดํฌ๋ํธ์ ์ด๋ฆ์ Controller ๊ฐ ๋ถ๋๋ค๋ ๊ฒ์ด์ฃ . ArgoCD ๋ํ Application ๊ฐ์ CRD ๋ฅผ ์ฌ์ฉํ๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๋ง์ด์ฃ .
๊ทธ๋ ๊ฒ ๊ตฌ๋ถ ์ง์ผ๋ ค๊ณ ๋ ธ๋ ฅ?ํ์ง๋ ์๋๊ฑฐ ๊ฐ์ต๋๋ค.
๊ทธ๋๋ ์ฐจ์ด๊ฐ ๋ ์ธ๋ถ์ ์ผ๋ก ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ Overstackflow ๋ต๋ณ์ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฑฐ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ ์ด์ Controller ์ Operator ๊ฐ ๋ญ์ง ์์์ผ๋, ์ค์ ๋ก Controller ๋ฅผ ๊ตฌํํด๋ณด์ฃ !
To The Code~
๋๋ง์ Controller ๋ง๋ค๊ธฐ
ConfigMap ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ, Annotations ์ ๋ช ์๋ Deployment ์ ํ๋๋ค์ Recreate ํ๋ Controller ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค!
myconfig.yaml
apiVersion: v1
data:
HELLO: "World Twice"
kind: ConfigMap
metadata:
name: myconfig
annotations:
restart-deployment: mypod #-- ํ๋์ Recreate ๋ฅผ ์งํํ Deployment ์ ์ด๋ฆ
mypod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mypod
labels:
app: mypod
test: test
spec:
replicas: 1
selector:
matchLabels:
app: mypod
template:
metadata:
labels:
app: mypod
spec:
containers:
- name: mypod
image: nginx:1.26
ports:
- containerPort: 80
env:
- name: HELLO
valueFrom:
configMapKeyRef:
name: myconfig
key: HELLO
์ฝ๋๋ Go ๋ฅผ ํตํด์ ๊ตฌํํ๊ณ , kubernetes/client-go ์ examples ๋ฅผ ํ ๋๋ก ๋ง๋ค์์ต๋๋ค.
์ฐ์ ๊ฒฐ๊ณผ๋ถํฐ ๋ณด์ฌ๋๋ฆฌ์ฃ !
์๋ ๋ช ๋ น์ด๋ฅผ ํตํด Controller ๋ฅผ ์คํํฉ๋๋ค.
$ go run main.go -kubeconfig="myconfig" -master="myk8surl"
๊ทธ๋ฆฌ๊ณ ํ์ฌ ๋ฐฐํฌ๋์ด์๋ Deployment ์ Pod ์๋ myconfig ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ์ ํ๊ฒฝ๋ณ์๋ก ๋ค๊ณ ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ myconfig ์ ๋ฐ์ดํฐ๊ฐ์ HELLO=World Once ๋ก ๋ฐ๊ฟ์ค๋๋ค.
๊ทธ๋ฌ์ Controller ์์ Sync/Add/Update for ConfigMap myconfig ๋ก๊ทธ๊ฐ ํ๋ ๋ ์ฐํ๊ฑธ ํ์ธํ ์ ์์ฃ .
๋ํ k get configmap -w ์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์๋์ผ๋ก ํ๋๋ฅผ ์ฌ์์ํ์ง ์๊ณ , ์๋์ผ๋ก ๋ณ๊ฒฝ๋์๋์ง ํ์ธํด๋ด ๋๋ค.
์ ๋ฐ๋ ๊ฒ์ ํ์ธํด๋ณผ ์ ์์ต๋๋ค!
๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ดค์ผ๋, ์ด์ ์ฝ๋๋ฅผ ํ๋ฒ์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
์์ ๋นจ๊ฐ ๋ค๋ชจ๋ถํฐ 1,2,3 ... ์ฉ ์์๋ฅผ ๊ฐ์ง๋๋ค!
- ListWatch ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค, ์ด ๋ ์์ ๋ค์ ์์ Informer ์ ํ์ํฉ๋๋ค.
- WorkQueue ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค, ๋ค์ ์์ Informer ์ ํ์ํฉ๋๋ค.
- Indexer ์ Informer ๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ Controller ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
Indexer ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค์ ์ธ๋ฑ์ฑ๊ณผ ๋น ๋ฅธ ์กฐํ๋ฅผ ์ง์ํ๋ ์ญํ ์ ์ํํ๋๋ฐ, ์ด๋ฅผ ํตํด ์กฐ๊ฑด์ ๋ง๋ ๋ฆฌ์์ค๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
Informer ๋ Controller ๋ฅผ ๊ตฌํํ๋๋ฐ ํ์ํ ํต์ฌ ๊ฐ์ฒด ์ค ํ๋๋ก, ListWatch ๋ฅผ ํตํด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฆฌ์์ค์ ์ํ๋ฅผ ์ฃผ์(Watch) ํฉ๋๋ค. Add/Update/Delete ์ด๋ฒคํธ์ ๋ํด ๋ฐ์ํ์ฌ ์๋ ค์ฃผ๋(Inform) ๋ ์์ ๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ค์ ๋ก Add/Update/Delete ์ด๋ฒคํธ์ ๋ํ ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ ์์ต๋๋ค.
๋ํ Add/Update/Delete ์ด๋ฒคํธ ์์ ๋ณด๋ฉด queue.Add(key) ๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด๋ฅผ ํตํด ์ด๋ค ๋ฆฌ์์ค์ธ์ง ์ ์ ์๋ key ๋ฅผ queue ์ ์ง์ด๋ฃ๊ณ , ๋ค์ชฝ์ ์์ ์ฝ๋์์ pop() ํด์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค. (๋ค์ชฝ์์ ๋ค๋ฃน๋๋ค!)
์ฆ, ListWatch ๋ฅผ ํตํด k get pods -w ์ ๊ฐ์ด ๋ฌดํ์ผ๋ก(Control Loop) ๋ฆฌ์์ค๋ฅผ ์ฃผ์(Watch)ํฉ๋๋ค.
- Indexer ์ ์ถ๊ฐ์ ์ธ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
- ์์์ ์์ฑํ Controller ๊ฐ์ฒด๋ฅผ ์คํํฉ๋๋ค. ๋ค์ ์๋ workers ๋ Reconciliation ์ 2๋ฒ์งธ ๋จ๊ณ์ธ Analyze ์ 3๋ฒ์งธ ๋จ๊ณ์ธ Act ๋ฅผ ์ํํ ๋ ์ฒ๋ฆฌํ ๋ณ๋ ฌ ๊ฐฏ์์ ๋๋ค.
- go routine ์ผ๋ก๋ง ์คํ๋๋ Controller ๋ฅผ ํฌ๊ทธ๋ผ์ด๋๋ก ์๊ตฌ์ ์ผ๋ก ์คํํฉ๋๋ค.
์์ ์คํํ๋ Controller.Run() ์ ๊ตฌํ ์ฝ๋์ ๋๋ค.
- informer.Run ์ ๊ณ ๋ฃจํด์ผ๋ก ์คํํฉ๋๋ค. ๋ค์์ ์ดํด๋ณด๊ฒ ์ง๋ง, stopCh ์ด close ๋ ๋๊น์ง ListWatch ๋ฅผ ํตํด ๋ฌดํ์ผ๋ก(Control Loop) ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฆฌ์์ค๋ฅผ ์ฃผ์(Watch) ํฉ๋๋ค.
- c.runWorker() ๋ wait.Until ๊ณ ๋ฃจํด์ผ๋ก ์คํ๋ฉ๋๋ค. c.runWorker() ์ Analyze ์ Act ๋ฅผ ์ํํ๋ ํจ์๋ก ๋ค์์ ๋ค๋ฃน๋๋ค.
wait.Until ์ ๊ฝค๋ ์ค์ํ ํจ์์ด๋ฏ๋ก ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- wait.Until() ๋ฅผ ํ๊ณ , ํ๊ณ ๋ค์ด๊ฐ๋ฉด ๊ฒฐ๊ตญ BackoffUntil ์ด๋ผ๋ ํจ์๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค. ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๊ฒฝ์ฐ ๋ฐ๋ก ์ข ๋ฃํ๋๊ฒ ์๋๊ณ , Backoff ์ ์งํํด์ ๊ณ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฑฐ์ฃ .
- ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ์ค๊ฐ์ ๋๊ฒจ๋ฐ์ f() ๋ฅผ for{} ์ ํตํด ๊ณ์ํด์ ์คํ์ํต๋๋ค.
์ด? ์ฌ๊ธฐ์ ํ๊ฐ์ง ์๋ฌธ์ด ์๊ธธ ์ ์์ ๊ฒ๋๋ค. "for{} ์ ๋๊ฒ๋๋ฉด ๋ฌดํ์ ์ผ๋ก ์ดํ์์ด f() ๊ฐ ์คํ๋ ํ ๋ฐ ์ด๊ฑฐ ๋ง์?"
์์์ WorkQueue ๋ฅผ ์์ฑํ๋๊ฑฐ ๊ธฐ์ต๋์๋์? Informer ๋ ListWatch ๋ฅผ ํตํด ๊ฐ์ ธ์ค๋ ๋ฆฌ์์ค๋ฅผ WorkQueue ์ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ go wait.Until(c.runWorker, time.Second, stopCh) ์ ์ํํ๋๋ฐ c.runWorker ํจ์ ์์ ๋ณด๊ฒ๋๋ฉด processNextItem ์ด ์คํ๋๊ณ processNextItem ์์๋ c.queue.Get() ์ ํ๊ฒ ๋ฉ๋๋ค.
์ฆ, WorkQueue ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ๋นผ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ c.queue.Get() ๋ฅผ ์์ธํ ๋ค์ฌ๋ค๋ณด๋ฉด, Lock() ์ด ๊ฑธ๋ ค์๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ฆฌํ์๋ฉด wait.Util() ์ for{} ๋๋ฌธ์ ์ดํ์์ด ๋ฌดํ์ ์ผ๋ก ๋ ์ ์์ง๋ง, Lock() ์ ํตํด ๊ณ ๋ฃจํด์ ๋ธ๋กํด๋ฒ๋ฆฌ๋ ๊ฑฐ์ฃ ! ๊ทธ๋ฆฌ๊ณ defer() ๋ฅผ ํตํด Unlock() ์ ์์ผ์ค๋๋ค.
์์ !! ์ค์ง์ ์ผ๋ก ๊ณ ๋ฃจํด์ ๋ธ๋กํ๋ ๊ฑด for q.queue.Len() == 0 && !q.shuttingDown {} ๋ด์ ์๋ q.cond.Wait() ์ ๋๋ค.
๋ฌผ๋ก Lock ์ ํด์ฃผ์ง๋ง for ๋ฌธ์ด ์์ผ๋ฉด ๊ฒฐ๊ตญ Unlock ์ด ๋๋ฒ๋ฆฌ์ฃ .
๊ทธ๋ผ ์ด์ Informer ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ณด์ฃ !
controller.go ๋ kubernetes/client-go ์์ ์ ๊ณต๋ฉ๋๋ค.
- Reflector ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ์ฟ ๋ฒ๋คํฐ์ค API ์์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ ์ํํฉ๋๋ค.
- r.Run() ์ ํตํด Reflector ์ ListWatch ๋ฅผ ์คํ์ํด์ผ๋ก์จ, ์ง์์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ์ฃผ์(Watch) ํ ์ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ Reconciliation ์ ์ฒซ๋ฒ์งธ ์คํ ์ธ Observe ๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค.
- processLoop ์ด wait.Until ์ ํตํด ์คํ๋๋๋ฐ, ๋ค์ด๊ฐ๋ณด๋ฉด c.config.Queue.Pop() ์ด for{} ์ ํตํด ๋ฌดํ์ ์ผ๋ก ๋๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ Queue ๋ WorkQueue ๋ ์๋๊ณ , ListWatch ๋ฅผ ํตํด ๊ฐ์ ธ์ค๋ ๋ฆฌ์์ค๋ฅผ ๋ด๋ Queue ์ ๋๋ค.
- ListAndWatch() ๋ฅผ ์คํํจ์ผ๋ก์จ Observe ๋ฅผ ํ๊ณ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก r.typeDescription ์๋ ์ค์ ๋ก ์ฃผ์(Watch) ํ๊ณ ์๋ ๋ฆฌ์์ค์ ํ์ ์ ๋ด๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด v1.ConfigMap, v1.Pod ์ฒ๋ผ ๋ง์ด์ฃ .
๊ทธ๋ผ ์ง๊ธ๊น์ง ์ดํด๋ณธ ๊ฒ๋ค์ ํ๋ฒ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Informer ๋ ListWatch ๋ฅผ ํตํด Control Loop ์ ์งํํ๋ฉด์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ ์ํํฉ๋๋ค. Add/Update/Delete ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ WorkQueue ์ ๋ฆฌ์์ค key ๋ฅผ ๋ฃ์ ํ, ์ถํ Reconciliation ์ 2๋ฒ์งธ ๋จ๊ณ์ธ Analyze ์ 3๋ฒ์งธ ๋จ๊ณ์ธ Act ๋ฅผ ์ํํ ์ ์๋๋ก ๋ฐ๋ฐ๋ฅ์ ๋ค์ง๋๋ค.
c.informer.Run ์ ์ดํด๋ดค์ผ๋. ์ด์ ๋ c.runWorker ์ ๋ํด์ ์์๋ณด์ฃ .
- c.runWorker ๋ํ wait.Until ๊ณ ๋ฃจํด์ ํตํด ์คํ๋ฉ๋๋ค.
- runWorker ์์๋ processNextItem() ์ด false ์ผ๋๊น์ง for{} ์ ํตํด ๋ฌดํ์ ์ผ๋ก ๋๊ฒ ๋ฉ๋๋ค.
- ์์ informer ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ Add/Update/Delete ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ queue.add(key) ๋ฅผ ํตํด key ๋ฅผ ๋ฃ์ด์คฌ๋๋ฐ, ์ด๋ฒ์ Get() ์ ํตํด key ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (Get() ํจ์ ์์๋ pop() ์ด ์์) ๊ทธ๋ฆฌ๊ณ ์ด queue ๊ฐ ๋น์ด์๋ ์ํ๋ผ๋ฉด false ๋ฅผ ๋ฆฌํดํจ์ผ๋ก์จ c.processNextItem() ์ ์ข ๋ฃํฉ๋๋ค.
- c.syncToStdout(key) ๋ Reconciliation ์ Analyze ์ Act ์ ๊ดํ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ ํจ์์ ๋๋ค. (syncToStdout ๋ผ๋ ์ด๋ฆ ๋ง๊ณ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ง์ด๋ ์ ํ ์๊ด ์์)
ConfigMap ์ Annotations ๋ฅผ ๊ฐ์ ธ์จ ํ์, "restart-deployment" Annotation ์ value ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ํด๋น value ๋ ์ฌ์์ํ Deployment ์ ์ด๋ฆ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ๊ฐ์ ธ์จ Deployment ์ ์ด๋ฆ์ ํตํด Deployment ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. Deployment ์ LabelSelector ๋ฅผ ํตํด์ ๋งตํ๋ Pod ๋ํ ๊ฐ์ ธ์ต๋๋ค.
์ดํ ๊ฐ์ ธ์จ Pod ๋ฅผ ์ ๋ถ ์ญ์ ํด์ ์ฌ์์๋๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ณ๊ฒฝ๋ ConfigMap ์ ๋ฐ์ดํฐ ๊ฐ์ด ํ๋์ ์ ์ฉ๋๋๋ก ํฉ๋๋ค.
์ด๋ฅผ ํตํด Analyze ์ Act ๋ ๊ตฌํํ์๊ณ , ๊ฐ๋จํ Controller ๋ฅผ ๋ง๋ค์์ต๋๋ค.
Operator ๋ ๋ง๋ค ์ ์๋๋ฐ, Operator ๊ฐ์ ๊ฒฝ์ฐ operator-sdk ๋ฅผ ์ด์ฉํด์ ๋ง๋๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
๊ทธ๋ผ ์ด์ ์ค์ ๋ก Kubernetes ์ ReplicaSet ์ ์ด๋ค ๋ฐฉ์์ผ๋ก Control Loop ๋๋ฉด์ Reconciliation ์ ์ํํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ReplicaSet ์ฝ๋ ๊น๋ณด๊ธฐ
newReplicaSetControllerDescripto() ๋ฅผ ํตํด ReplicaSet ์ ๊ดํ ControllerDescriptor ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ newReplicaSetControllerDescripto() ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ฉด startReplicaSetController ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
NewReplicaSetController ๊ฐ์ฒด์ InformerFactory ๋ฅผ ์ด์ฉํด์ ReplicaSet ๊ณผ Pods ๋ฆฌ์์ค์ Informer ๋ฅผ ์ถ๊ฐํด์ ์์ฑ ํ ํ Run() ์ ์คํํ๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ถํฐ๋ ์์ ์ ํฌ๊ฒ ๋ค๋ฅผ ๋ฐ๊ฐ ์์ต๋๋ค. go wait.UntilWithContext ํจ์๋ฅผ ํตํด์ rcs.worker ๋ฅผ ์คํํฉ๋๋ค.
rsc.queue ์์ key ๋ฅผ ๊ฐ์ ธ์จ ํ์ rsc.syncHandler ๋ฅผ ์คํํ๊ฒ ๋๋๋ฐ,
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์๋ ๊ทธ ReplicaSet ์ด ํ๋ ํ์๊ฐ ์์ฑ๋์ด์์ต๋๋ค.
ํ์คํ ๋ง๋ค์๋ ์์ ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ด ์ถ์ํ๊ฐ ๋์ด ์๊ธฐ ํ๋ฐ, ํฐ ํ์์๋ ๋น์ทํ๊ฑธ ํ์ธํ ์ ์์์ต๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค Controller Manager ๋ "๋ถ๊ฝ ๊ฐ์ ๋๋น"์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ค์ ์ฃผ์(Watch) ํ๊ณ ์์ต๋๋ค. ๋ ์ด "๋ถ๊ฝ ๊ฐ์ ๋๋น"์ ์ฝ๋๋ก ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๊ถ๊ธํ๋๋ฐ ์ด์ ๋ ๋ต์ ์๊ฒ ๊ฐ์ต๋๋ค.
๊ณ ๋ฃจํด์ผ๋ก Informer ๊ฐ์ฒด์ ListWatch ๋ฅผ ์คํํด์ ๋ฆฌ์์ค๋ฅผ ๋ฌดํ์ ์ผ๋ก(Control Loop) ๋ฐ๋ผ๋ณด๋ค๊ฐ, Add/Update/Delete ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ WorkQueue ์ ๋ฃ๊ฒ ๋๊ณ , ๊ณ ๋ฃจํด์ผ๋ก wait.Util(๋ก์ง) ์ ์ํํจ์ผ๋ก์จ ๋ค์ด์ค๋ ์ด๋ฒคํธ์ ๋ํด Reconcile ์ ์ํํ๋ ๊ฒ์ด์์ต๋๋ค.
์ด๋ ๊ฒ ์ด๋ฒ ๊ธ์์๋ Controller ์ Low ํ ๋ถ๋ถ๊น์ง ์์๋ดค๋๋ฐ, ๋์ค์ Controller Manager ์ ์ปจํธ๋ฆฌ๋ทฐํฐ๋ ํ๋ฒ ๋์ ํด๋ด์ผ๊ฒ ๋ค์!
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!