[k8s] Control Plane๊ณผ ๊ฐ€์šฉ์„ฑ

control plane์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์‹ฌ์žฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์กด์žฌ๋‹ค.
๊ฐ ๋…ธ๋“œ์— ์„œ๋ฒ„๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ , ๊ทธ ์„œ๋ฒ„๋“ค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ƒํƒœ ์ €์žฅ์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ control plane์ด ๋‹ค์šด๋œ๋‹ค๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ์‹ ๋ขฐ๋„๊ฐ€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” control plane์„ ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค, ์„ ํƒ์ง€๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.




Basic ์•„ํ‚คํ…์ณ

๋Œ€๋ถ€๋ถ„์˜ k8s ๋ฐฐํฌํŒ์—์„œ๋Š” ์ „ํ˜•์ ์ธ master-slave ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ์„ ํ•ด์ค€๋‹ค.
master ๋…ธ๋“œ์— control plane ์„œ๋ฒ„์™€ etcd ์ €์žฅ์†Œ๋ฅผ ์„ธํŒ…ํ•˜๊ณ , control plane ์„œ๋ฒ„๊ฐ€ etcd์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ ์›Œ์ปค ๋…ธ๋“œ๋“ค์„ ํ†ต์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ€์šฉ์„ฑ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ด ์ •๋„๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์ƒ๊ธฐํ–ˆ๋“ฏ์ด ์ด๊ฑด ๋ฆฌ์Šคํฌ๊ฐ€ ์ œ๋ฒ• ํฌ๋‹ค.
control plane์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด Pod์— ๋Œ€ํ•œ ์Šค์ผ€์ค„๋ง์ด ์ผ๋‹จ ์ค‘๋‹จ๋œ๋‹ค. ๊ฐœ๋ณ„ Pod๋“ค์€ ๊ฐœ๋ณ„ Node์˜ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด ๊ด€๋ฆฌํ•˜๋‹ˆ๊นŒ ๊ธฐ์กด Pod๋“ค๋„ ์ฃฝ์ง„ ์•Š์ง€๋งŒ, ์ง€์†์ ์ธ ์•ˆ์ •์„ฑ์„ ๋‹ด๋ณดํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ Pod์˜ ์žฌ์‹คํ–‰์ด๋ผ๋“ ์ง€, ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค์˜ ์žฌํ• ๋‹น ๋“ฑ์ด ๋ง๊ฐ€์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ ๋””์Šคํฌ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ƒํƒœ ์ž์ฒด๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ๋ง๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ผ๊ณ  ๋ญ˜ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์ž˜ ์ €์žฅํ•ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, etcd๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ทธ๋ƒฅ API ์„œ๋ฒ„๋“ค์ฒ˜๋Ÿผ ์„œ๋ฒ„๋“ค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ €๊ฒŒ ์†Œ์‹ค๋˜๋ฉด ๊ทธ๋ƒฅ ์„œ๋ฒ„ ์ „์ฒด ์ •๋ณด๊ฐ€ ์ „๋ถ€ ์ฆ๋ฐœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ : ์—ฌ๊ธฐ์„œ๋Š” etcd๋ฅผ ๊ณ„์† ์–ธ๊ธ‰ํ•˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ์˜ˆ์‹œ์ผ ๋ฟ์ด๋‹ค. etcd ๋ง๊ณ  ๋‹ค๋ฅธ DB๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค.




๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌ์กฐ

์•„๋ฌดํŠผ ๊ทธ๋ž˜์„œ ์ •๋ง ๊ฐ€์šฉ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Control Plane์„ ๋‹ค์ค‘์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
์ด๋ก ์ ์ธ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด ์ตœ์†Œ 3๊ฐœ์˜ Control Plain ๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋Œ€์ถฉ ์ด๋Ÿฐ ์‹์ด ๋  ๊ฒƒ์ด๋‹ค.

๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ๋„ ๊ฐˆ๋ฆผ๊ธธ์ด ์ƒ๊ธด๋‹ค. ์‚ฌ์‹ค Control Plane ์ž์ฒด๋ฅผ ๋‹ค์ค‘ํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋‹ค.
Control Plane ์ž์ฒด๋Š” ์ƒํƒœ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ API ์„œ๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฒฐ๊ตญ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ƒํƒœ๋ฅผ ์–ด๋”” ์ €์žฅํ•˜๋Š”์ง€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์— ์ €์žฅํ•ด์•ผ ํ• ๊นŒ?
2๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ๋‹ค.




๊ณ ๊ฐ€์šฉ์„ฑ - ์™ธ๋ถ€ DB

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ์„ ํƒ์ง€๋Š”, ๊ทธ๋ƒฅ etcd ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜์ ์ธ DB ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑํ•˜๋“ฏ์ด ์ ์ ˆํžˆ ๋ฉ€ํ‹ฐ๋…ธ๋“œ ๊ตฌ์„ฑํ•˜๊ณ , ๊ทธ DB ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ Control Plane๋“ค์ด ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ƒ๊ฐํ•˜๋Š” API ์„œ๋ฒ„์™€ DB์˜ ๊ด€๊ณ„๋‹ค.

์ด๋Ÿฌ๋ฉด control plane์ด ํ•˜๋‚˜ ์ฃฝ๊ฑฐ๋‚˜, etcd ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜ ๋ป—๋”๋ผ๋„ ์ „์ฒด ๊ฐ€์šฉ์„ฑ์„ ์ €ํ•ดํ•˜์ง€ ์•Š๊ณ  ์„œ๋น„์Šค ์šด์˜์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค์ด ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ๊ฒฝ์šฐ ETCD ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์„ค์น˜๋œ ๋…ธ๋“œ๋“ค์€ ๋…๋ฆฝ์ ์ธ ๋ณ„๋„ ์žฅ๋น„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด๋‹ค.๊ทธ๋ž˜์„œ ๋Œ€์ฒด๋กœ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ข€ ๋” ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค.

kubeadm์œผ๋กœ ์™ธ๋ถ€ etcd๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด, init/joinํ• ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์™ธ๋ถ€ etcd ์ ‘์†์ •๋ณด๋งŒ ์ ์ ˆํžˆ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" # change this (see below)
etcd:
  external:
    endpoints:
      - https://ETCD_0_IP:2379 # change ETCD_0_IP appropriately
      - https://ETCD_1_IP:2379 # change ETCD_1_IP appropriately
      - https://ETCD_2_IP:2379 # change ETCD_2_IP appropriately
    caFile: /etc/kubernetes/pki/etcd/ca.crt
    certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
    keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key



๊ณ ๊ฐ€์šฉ์„ฑ - ๋‚ด๋ถ€ DB

๋˜ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์€, ๊ฐœ๋ณ„ Control Plane ๋…ธ๋“œ์— etcd๋ฅผ ๊ฐ์ž ๊ตฌ์„ฑํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
stacked etcd๋ผ๊ณ ๋„ ๋ถ€๋ฅด๊ณ , ๋น„๊ต์  ๋” ์ผ๋ฐ˜์ ์ธ ์„ ํƒ์ง€๋‹ค.

Control Plane์™€ etcd ํ•œ ์Œ์ด ํ•˜๋‚˜์˜ ๋…๋ฆฝ์ ์ธ DB๊ฐ€ ๋˜๊ณ , Control Plane ๊ทธ๋ฃน์ด ํ•˜๋‚˜์˜ ๋ถ„์‚ฐ DB๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
kubeadm์˜ HA ๊ตฌ์„ฑ์—์„œ๋Š” ์‹ค์ œ๋กœ Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜๊ณ  ๊ณต์œ ํ•œ๋‹ค. Leader๋„ ์„ ์ถœํ•˜๊ณ  ๊ทธ๋Ÿฐ๋‹ค. ๊ทธ๋ž˜์„œ ์ตœ์†Œ ์ฟผ๋Ÿผ ์ถฉ์กฑ์„ ์œ„ํ•ด 3๊ฐœ ์ด์ƒ์˜ ๋…ธ๋“œ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.

์™ธ๋ถ€ etcd ๋ฐฉ์‹์— ๋น„ํ•ด ํ•˜๋“œ์›จ์–ด ์ž์›์ด ๋œ ํ•„์š”ํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์šฉ์„ฑ ์ˆ˜์ค€์€ ๊ดœ์ฐฎ๋‹ค.
ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ๋ป—๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค๋กœ ์ƒˆ Leader๋ฅผ ์„ ์ถœํ•˜๋“ ์ง€ ํ•ด์„œ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ๋…ธ๋“œ๋ฅผ control plain ๋…ธ๋“œ๋กœ ๋“ฑ๋กํ•˜๋ ค๋ฉด, joinํ• ๋•Œ ์ „์šฉ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
kubeadm ๋ฐฐํฌํŒ์˜ ๊ฒฝ์šฐ์—๋Š” --control-plane ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„ฃ์œผ๋ฉด, node๋กœ ์ฐธ์—ฌํ•จ๊ณผ ๋™์‹œ์— control plane์œผ๋กœ ์„ค์ •๋œ๋‹ค.

kubeadm join --control-plane ...


์ฐธ์กฐ
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/