Kubernetes ์ž…๋ฌธ

Kubernetes ์ž…๋ฌธ — Pod·Deployment·Service ํ•œ ๋ฒˆ์— ์ •๋ฆฌ. ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋Š” Docker๋กœ ๋„์› ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ˆ˜์‹ญ ๊ฐœ๋ฅผ, ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ, ์ฃฝ์œผ๋ฉด ์‚ด๋ฆฌ๊ณ  ํŠธ๋ž˜ํ”ฝ์— ๋งž์ถฐ ๋Š˜๋ฆฌ๋ ค๋ฉด? ๊ทธ๊ฒŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋‹ค. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ด ํ•„์š”ํ•œ ์ด์œ ๋ถ€ํ„ฐ ํ•ต์‹ฌ ์˜ค๋ธŒ์ ํŠธ์™€ kubectl๊นŒ์ง€, ์‹ค์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์™€ ์ถœ๋ ฅ์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค.


๋“ค์–ด๊ฐ€๋ฉฐ

์˜ˆ์ „ Spark๋ฅผ Kubernetes ์œ„์— ์˜ฌ๋ฆฌ๋ฉด ๋ฌด์—‡์ด ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€ ๊ธ€์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ "์ปจํ…Œ์ด๋„ˆ ์›Œํฌ๋กœ๋“œ๋ฅผ ์šด์˜ํ•˜๋Š” ํ‘œ์ค€ ์šด์˜ ์ฒด๊ณ„"๋ผ๊ณ  ํ•œ ๋ฌธ๋‹จ์œผ๋กœ๋งŒ ์งง๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ”๋‹ค. ์ด๋ฒˆ ๊ธ€์€ ๊ทธ ํ•œ ๋ฌธ๋‹จ์„ ์ œ๋Œ€๋กœ ํŽผ์น˜๋Š”, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ ์ƒ์„ธํŒ์ด๋‹ค.

ํ๋ฆ„์€ ์ด๋ ‡๊ฒŒ ์ด์–ด์ง„๋‹ค. Docker ์ž…๋ฌธ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค๊ณ  ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์› ๊ณ , GitHub Actions๋กœ CI/CD์—์„œ ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋นŒ๋“œ·๋ฐฐํฌํ–ˆ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์Œ ์งˆ๋ฌธ์€ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค. "์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜์‹ญ ๊ฐœ๋ฅผ, ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๊ฑธ์ณ, ์ฃฝ์œผ๋ฉด ๋˜์‚ด๋ฆฌ๊ณ , ํŠธ๋ž˜ํ”ฝ์ด ๋Š˜๋ฉด ๋Š˜๋ฆฌ๋ฉด์„œ ์šด์˜ํ•˜๋ ค๋ฉด?" ์ด ์งˆ๋ฌธ์˜ ๋‹ต์ด ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜, ์ฆ‰ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค(Kubernetes, ์ค„์—ฌ์„œ K8s)๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํ•ต์‹ฌ ํ•œ ์ค„: "์›ํ•˜๋Š” ์ƒํƒœ(desired state)๋ฅผ ์„ ์–ธํ•˜๋ฉด, ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์•Œ์•„์„œ ๊ทธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค." ์‚ฌ๋žŒ์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ผ์ผ์ด ๋„์šฐ๊ณ  ๊ฐ์‹œํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, "๋‚˜๋Š” ์ด๊ฒŒ 3๊ฐœ ๋–  ์žˆ๊ธธ ์›ํ•ด"๋ผ๊ณ  ์„ ์–ธํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ๊ทธ๊ฑธ ์ฑ…์ž„์ง„๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์™œ Docker๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ์ง€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์กฐ, ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ธ Pod, ์„ ์–ธ์  ๊ด€๋ฆฌ์™€ ์ž๊ฐ€๋ณต๊ตฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Deployment, ์•ˆ์ •์ ์ธ ์ง„์ž…์ ์ธ Service, ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฑธ ์กฐ์ž‘ํ•˜๋Š” kubectl๊นŒ์ง€ ์‹ค์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•œ๋‹ค.


1. ์™œ Kubernetes์ธ๊ฐ€ — Docker๋งŒ์œผ๋กœ ๋ถ€์กฑํ•œ ์ง€์ 

Docker๋กœ ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋ฅผ ๋„์šฐ๋Š” ๊ฑด ์‰ฝ๋‹ค. ๋ฌธ์ œ๋Š” ์‹ค์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ˆ˜์‹ญ ๊ฐœ๋กœ ๋Š˜๊ณ , ์„œ๋ฒ„๋„ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๋˜๋ฉด ์ด๋Ÿฐ ์ผ๋“ค์„ ๋ˆ„๊ตฐ๊ฐ€ ํ•ด์•ผ ํ•œ๋‹ค.

  • ์–ด๋А ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์–ด๋А ์„œ๋ฒ„์— ๋ฐฐ์น˜ํ• ์ง€ (๋ฆฌ์†Œ์Šค ์—ฌ์œ ๋ฅผ ๋ณด๊ณ )
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฃฝ์œผ๋ฉด ์ž๋™์œผ๋กœ ๋˜์‚ด๋ฆฌ๊ธฐ
  • ํŠธ๋ž˜ํ”ฝ์ด ๋Š˜๋ฉด ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ณ , ์ค„๋ฉด ์ค„์ด๊ธฐ (์Šค์ผ€์ผ๋ง)
  • ์ƒˆ ๋ฒ„์ „์„ ๋ฌด์ค‘๋‹จ์— ๊ฐ€๊น๊ฒŒ ๊ต์ฒดํ•˜๊ณ , ๋ฌธ์ œ ์ƒ๊ธฐ๋ฉด ๋˜๋Œ๋ฆฌ๊ธฐ (๋กค๋ง ์—…๋ฐ์ดํŠธ·๋กค๋ฐฑ)
  • ์ฃฝ๊ณ  ์‚ด์•„๋‚˜๋ฉฐ IP๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์—๊ฒŒ ์•ˆ์ •์ ์ธ ์ฃผ์†Œ๋กœ ํŠธ๋ž˜ํ”ฝ ๋ณด๋‚ด๊ธฐ

์ด๊ฑธ docker run๊ณผ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‚ฌ๋žŒ์ด ์ง์ ‘ ํ•˜๋ฉด, ์„œ๋ฒ„ ๋ช‡ ๋Œ€๋งŒ ๋„˜์–ด๊ฐ€๋„ ๊ณง ํ•œ๊ณ„์— ๋ถ€๋”ชํžŒ๋‹ค. ์ด ์šด์˜ ์ž‘์—… ์ „์ฒด๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์ด ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์ด๊ณ , ๊ทธ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋‹ค. ๊ตฌ๊ธ€์ด ๋‚ด๋ถ€์—์„œ ์“ฐ๋˜ Borg์—์„œ ์ถœ๋ฐœํ•ด ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋๊ณ , ์ง€๊ธˆ์€ CNCF๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์šด์˜์˜ ๊ธฐ๋ฐ˜์ด ๋๋‹ค.

ํ•ต์‹ฌ ์ฒ ํ•™์€ ์„ ์–ธ์ (declarative)์ด๋ผ๋Š” ์ ์ด๋‹ค. "์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ด๋ผ"(๋ช…๋ นํ˜•)๊ฐ€ ์•„๋‹ˆ๋ผ "์ตœ์ข… ์ƒํƒœ๊ฐ€ ์ด๋ž˜์•ผ ํ•œ๋‹ค"(์„ ์–ธํ˜•)๋ฅผ ์ ์–ด๋‘๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํ˜„์žฌ ์ƒํƒœ์™€ ๋น„๊ตํ•ด ๊ทธ ์ฐจ์ด๋ฅผ ๋Š์ž„์—†์ด ๋ฉ”์šด๋‹ค.


2. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์กฐ — ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ์›Œ์ปค ๋…ธ๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋ฅผ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ(cluster)๋กœ ๋‹ค๋ฃฌ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋‘ ์ข…๋ฅ˜์˜ ๊ตฌ์„ฑ์›์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(Control Plane) — ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‘๋‡Œ. ๋ฌด์—‡์„ ์–ด๋””์— ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ์ „์ฒด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์›Œ์ปค ๋…ธ๋“œ(Worker Node) — ์‹ค์ œ๋กœ ์ปจํ…Œ์ด๋„ˆ(Pod)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ผ๊พผ ์„œ๋ฒ„๋“ค.

์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • API Server — ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ •๋ฌธ. kubectl์„ ๋น„๋กฏํ•œ ๋ชจ๋“  ์š”์ฒญ์ด ์—ฌ๊ธฐ๋ฅผ ๊ฑฐ์นœ๋‹ค.
  • Scheduler — ์ƒˆ Pod๋ฅผ ์–ด๋А ๋…ธ๋“œ์— ์˜ฌ๋ฆด์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • Controller Manager — "์›ํ•˜๋Š” ์ƒํƒœ"์™€ "ํ˜„์žฌ ์ƒํƒœ"๋ฅผ ๋น„๊ตํ•ด ๋Š์ž„์—†์ด ๋งž์ถ˜๋‹ค. ์ž๊ฐ€๋ณต๊ตฌ์˜ ์ฃผ์—ญ์ด๋‹ค.
  • etcd — ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค.

์›Œ์ปค ๋…ธ๋“œ์—๋Š” kubelet(๋…ธ๋“œ์—์„œ Pod๋ฅผ ์‹ค์ œ๋กœ ๋„์šฐ๊ณ  ์ƒํƒœ๋ฅผ ๋ณด๊ณ ), kube-proxy(๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ…), ๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„(containerd ๋“ฑ, ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰)์ด ๋ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ณดํ†ต ์ด ๋‚ด๋ถ€๋ฅผ ์ง์ ‘ ๋งŒ์งˆ ์ผ์ด ์—†๋‹ค. kubectl๋กœ API Server์— "์›ํ•˜๋Š” ์ƒํƒœ"๋ฅผ ๋˜์ง€๋ฉด, ๋‚˜๋จธ์ง€๋Š” ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.


3. ๊ฐ€์žฅ ์ž‘์€ ๋ฐฐํฌ ๋‹จ์œ„ — Pod

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ์ง€๋Š” ์•Š๋Š”๋‹ค. ์ตœ์†Œ ๋‹จ์œ„๋Š” Pod๋‹ค. Pod๋Š” ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜(๋˜๋Š” ๊ธด๋ฐ€ํžˆ ๋ฌถ์ธ ๋ช‡ ๊ฐœ)๋ฅผ ๊ฐ์‹ผ ๊ป๋ฐ๊ธฐ๋กœ, ๊ฐ™์€ Pod ์•ˆ์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋„คํŠธ์›Œํฌ(๊ฐ™์€ IP)์™€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ "Pod ํ•˜๋‚˜ = ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜"๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์ค‘์š”ํ•œ ์„ฑ์งˆ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. Pod๋Š” ์ผํšŒ์šฉ(ephemeral)์ด๋ผ๋Š” ์ ์ด๋‹ค. ์ฃฝ์œผ๋ฉด ๊ณ ์ณ ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋œฌ Pod๋Š” IP๊ฐ€ ๋ฐ”๋€๋‹ค. ์ด "Pod๋Š” ์–ธ์ œ๋“  ์‚ฌ๋ผ์ง€๊ณ  ์ƒˆ๋กœ ์ƒ๊ธด๋‹ค"๋Š” ์ „์ œ๊ฐ€ ๋’ค์— ๋‚˜์˜ฌ Deployment(์ž๊ฐ€๋ณต๊ตฌ)์™€ Service(์•ˆ์ •์  ์ฃผ์†Œ)๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ Pod๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ์ผ์€ ๋“œ๋ฌผ๋‹ค. Pod๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๋ฉด ๊ทธ Pod๊ฐ€ ์ฃฝ์—ˆ์„ ๋•Œ ์•„๋ฌด๋„ ๋˜์‚ด๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  Pod๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์ƒ์œ„ ์˜ค๋ธŒ์ ํŠธ — Deployment๋ฅผ ์“ด๋‹ค.


4. ์„ ์–ธ์  ๊ด€๋ฆฌ์™€ ์ž๊ฐ€๋ณต๊ตฌ — Deployment

Deployment๋Š” "์ด Pod๋ฅผ ๋ช‡ ๊ฐœ๋กœ, ์–ด๋–ค ์ด๋ฏธ์ง€๋กœ ์œ ์ง€ํ•ด๋ผ"๋ฅผ ์„ ์–ธํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ํ•ญ์ƒ ๋งž์ถ˜๋‹ค. Pod๊ฐ€ ์ฃฝ์œผ๋ฉด ์ƒˆ๋กœ ๋„์šฐ๊ณ , ๊ฐœ์ˆ˜๋ฅผ ๋ฐ”๊พธ๋ฉด ๊ฑฐ๊ธฐ์— ๋งž์ถ˜๋‹ค. ์ด ์ผ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ReplicaSet์ด ๋‹ด๋‹นํ•œ๋‹ค.

CI/CD์—์„œ ghcr.io์— ์˜ฌ๋ฆฐ ์ด๋ฏธ์ง€๋ฅผ 3๊ฐœ๋กœ ๋„์šฐ๋Š” Deployment ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3                # Pod๋ฅผ ํ•ญ์ƒ 3๊ฐœ ์œ ์ง€ (desired state)
  selector:
    matchLabels:
      app: myapp
  template:                  # ์ด ํ‹€๋กœ Pod๋ฅผ ์ฐ์–ด๋‚ธ๋‹ค
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: ghcr.io/jinoism/myapp:main   # CI/CD์—์„œ ๋นŒ๋“œ·ํ‘ธ์‹œํ•œ ์ด๋ฏธ์ง€
          ports:
            - containerPort: 3000

์ด ํŒŒ์ผ์„ kubectl apply๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋˜์ง€๋ฉด, Pod 3๊ฐœ๊ฐ€ ๋œฌ๋‹ค.

kubectl apply -f deployment.yaml
# deployment.apps/myapp created

kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myapp-7d9f8c6b4c-2xk9p   1/1     Running   0          12s
myapp-7d9f8c6b4c-8fmlq   1/1     Running   0          12s
myapp-7d9f8c6b4c-q7r2t   1/1     Running   0          12s

์ด์ œ ์ž๊ฐ€๋ณต๊ตฌ๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ž. Pod ํ•˜๋‚˜๋ฅผ ๊ฐ•์ œ๋กœ ์ง€์šด๋‹ค.

kubectl delete pod myapp-7d9f8c6b4c-2xk9p
kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
myapp-7d9f8c6b4c-8fmlq   1/1     Running   0          40s
myapp-7d9f8c6b4c-q7r2t   1/1     Running   0          40s
myapp-7d9f8c6b4c-vv5n8   1/1     Running   0          3s    ← ์ƒˆ๋กœ ์ƒ์„ฑ๋จ

์ง€์šด Pod ์ž๋ฆฌ์— ์ƒˆ Pod๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ๊ฒผ๋‹ค. "๋‚˜๋Š” 3๊ฐœ๋ฅผ ์›ํ•ด"๋ผ๋Š” ์„ ์–ธ์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ณ„์† ์ง€ํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐœ์ˆ˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ํ•œ ์ค„์ด๋‹ค.

kubectl scale deployment myapp --replicas=5   # 5๊ฐœ๋กœ ํ™•์žฅ

์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌ๋„ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋งŒ ๋ฐ”๊ฟ” applyํ•˜๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ Pod๋ฅผ ํ•˜๋‚˜์”ฉ ๊ต์ฒด(๋กค๋ง ์—…๋ฐ์ดํŠธ)ํ•˜๋ฉฐ ๋ฌด์ค‘๋‹จ์— ๊ฐ€๊น๊ฒŒ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด kubectl rollout undo๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.


5. ์•ˆ์ •์ ์ธ ์ง„์ž…์  — Service

3๋ฒˆ์—์„œ ๋ดค๋“ฏ Pod๋Š” ์ฃฝ๊ณ  ์‚ด์•„๋‚˜๋ฉฐ IP๊ฐ€ ๋ฐ”๋€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ์„œ๋น„์Šค๋‚˜ ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ์ฃผ์†Œ๋กœ ์ ‘์†ํ•ด์•ผ ํ• ๊นŒ? ๋ฐ”๋€Œ๋Š” Pod IP๋ฅผ ์ง์ ‘ ๋ถ€๋ฅผ ์ˆ˜๋Š” ์—†๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒŒ Service๋‹ค.

Service๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ€์ƒ IP(์™€ ์ด๋ฆ„)๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ทธ ๋’ค์˜ ์—ฌ๋Ÿฌ Pod๋“ค๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑํ•œ๋‹ค. Pod๊ฐ€ ๊ต์ฒด๋ผ๋„ Service ์ฃผ์†Œ๋Š” ๊ทธ๋Œ€๋กœ๋‹ค. ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ(app: myapp)๋กœ "์–ด๋–ค Pod๋“ค์—๊ฒŒ ๋ณด๋‚ผ์ง€"๋ฅผ ๊ณ ๋ฅธ๋‹ค.

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp          # ์ด ๋ผ๋ฒจ์„ ๊ฐ€์ง„ Pod๋“ค๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ
  ports:
    - port: 80          # Service๊ฐ€ ๋ฐ›๋Š” ํฌํŠธ
      targetPort: 3000  # ์ „๋‹ฌํ•  Pod(์ปจํ…Œ์ด๋„ˆ) ํฌํŠธ
  type: ClusterIP       # ๋…ธ์ถœ ๋ฐฉ์‹ (๊ธฐ๋ณธ๊ฐ’)

type์ด ๋…ธ์ถœ ๋ฒ”์œ„๋ฅผ ์ •ํ•œ๋‹ค.

  • ClusterIP (๊ธฐ๋ณธ) — ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ. ์„œ๋น„์Šค ๊ฐ„ ๋‚ด๋ถ€ ํ†ต์‹ ์šฉ.
  • NodePort — ๊ฐ ๋…ธ๋“œ์˜ ํŠน์ • ํฌํŠธ๋กœ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ.
  • LoadBalancer — ํด๋ผ์šฐ๋“œ์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋ถ™์—ฌ ์™ธ๋ถ€์— ๋…ธ์ถœ. EKS·GKE ๊ฐ™์€ ๋งค๋‹ˆ์ง€๋“œ ํ™˜๊ฒฝ์—์„œ ํ”ํžˆ ์“ด๋‹ค.

์—ฌ๋Ÿฌ Service๋ฅผ ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ/๊ฒฝ๋กœ ๊ทœ์น™์œผ๋กœ ๋ฌถ์–ด ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋ ค๋ฉด ๊ทธ ์œ„์— Ingress(๋˜๋Š” Gateway API)๋ฅผ ๋‘”๋‹ค. ์ž…๋ฌธ ๋‹จ๊ณ„์—์„  "Service = ๋ฐ”๋€Œ๋Š” Pod๋“ค ์•ž์˜ ๊ณ ์ • ์ฃผ์†Œ + ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ"๋กœ ์ดํ•ดํ•˜๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.


6. kubectl — ์†์— ์ตํ˜€์•ผ ํ•  ๊ธฐ๋ณธ ๋ช…๋ น

kubectl์€ ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋Œ€ํ™”ํ•˜๋Š” CLI๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์ž‘์—…์ด ์ด ๋ช…๋ น์œผ๋กœ ์ด๋ค„์ง„๋‹ค. ๋จผ์ € ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋…ธ๋“œ ์ƒํƒœ๋ถ€ํ„ฐ ๋ณธ๋‹ค.

kubectl get nodes
NAME       STATUS   ROLES           AGE   VERSION
node-1     Ready    control-plane   5d    v1.36.2
node-2     Ready    <none>          5d    v1.36.2
node-3     Ready    <none>          5d    v1.36.2

์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น์„ ํ‘œ๋กœ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

๋ช…๋ น์–ด ํ•˜๋Š” ์ผ
kubectl apply -f ํŒŒ์ผ.yaml ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์ƒํƒœ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉ (์ƒ์„ฑ·๊ฐฑ์‹ )
kubectl get pods / get deploy / get svc Pod·Deployment·Service ๋ชฉ๋ก ๋ณด๊ธฐ
kubectl describe pod ์ด๋ฆ„ ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ์ƒ์„ธ ์ •๋ณด·์ด๋ฒคํŠธ (์žฅ์•  ์›์ธ ์ถ”์ )
kubectl logs ์ด๋ฆ„ Pod ๋กœ๊ทธ ๋ณด๊ธฐ (-f๋กœ ์‹ค์‹œ๊ฐ„)
kubectl exec -it ์ด๋ฆ„ -- sh ์‹คํ–‰ ์ค‘์ธ Pod ์•ˆ์œผ๋กœ ์…ธ ์ง„์ž…
kubectl scale deploy ์ด๋ฆ„ --replicas=N ๋ ˆํ”Œ๋ฆฌ์นด ๊ฐœ์ˆ˜ ์กฐ์ •
kubectl rollout undo deploy ์ด๋ฆ„ ์ง์ „ ๋ฐฐํฌ๋กœ ๋กค๋ฐฑ
kubectl delete -f ํŒŒ์ผ.yaml ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ๋งŒ๋“  ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

์žฅ์• ๊ฐ€ ๋‚ฌ์„ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋ณด๋Š” ๊ฑด ๋ณดํ†ต describe์™€ logs๋‹ค. describe๋Š” "์™œ ์ด Pod๊ฐ€ ์•ˆ ๋œจ๋Š”๊ฐ€"(์ด๋ฏธ์ง€ pull ์‹คํŒจ, ์Šค์ผ€์ค„๋ง ์‹คํŒจ ๋“ฑ)๋ฅผ ์ด๋ฒคํŠธ๋กœ ๋ณด์—ฌ์ฃผ๊ณ , logs๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค. Spark on Kubernetes ๊ธ€์—์„œ "๋””๋ฒ„๊น… ๊ด€์ ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๊นŒ์ง€ ๋„“์–ด์ง„๋‹ค"๊ณ  ํ–ˆ๋˜ ๊ฒŒ ๋ฐ”๋กœ ์ด ์ง€์ ์ด๋‹ค.


7. ์–ธ์ œ Kubernetes๋ฅผ ์จ์•ผ ํ•˜๋‚˜ — ๊ทธ๋ฆฌ๊ณ  ๋งค๋‹ˆ์ง€๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด๋ฅผ ์šด์˜ํ•˜๋Š” ๋ถ€๋‹ด, ๋„คํŠธ์›Œํ‚น·์Šคํ† ๋ฆฌ์ง€·๋ณด์•ˆ(RBAC·Secret) ์„ค๊ณ„, ํ•™์Šต ๊ณก์„ ์ด ๋ชจ๋‘ ๋น„์šฉ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํŒ๋‹จ์ด ํ•„์š”ํ•˜๋‹ค.

  • ์ž˜ ๋งž๋Š” ๊ฒฝ์šฐ: ์„œ๋น„์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ชผ๊ฐœ์ ธ ์žˆ๊ณ (๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค), ํŠธ๋ž˜ํ”ฝ ๋ณ€๋™์ด ํฌ๊ฑฐ๋‚˜, ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ·์ž๋™ ํ™•์žฅ·๋ณต์›๋ ฅ์ด ์ค‘์š”ํ•˜๊ณ , ์šด์˜์„ ํ‘œ์ค€ํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.
  • ๊ณผํ•œ ๊ฒฝ์šฐ: ์ž‘์€ ๋‹จ์ผ ์„œ๋น„์Šค, ํŠธ๋ž˜ํ”ฝ์ด ์•ˆ์ •์ ์ด๊ณ , ํŒ€์˜ ์ธํ”„๋ผ ์—ฌ๋ ฅ์ด ์ž‘์„ ๋•Œ. ์ด๋Ÿด ๋• Docker Compose๋‚˜ ๋งค๋‹ˆ์ง€๋“œ PaaS(Vercel ๋“ฑ)๊ฐ€ ๋” ํ•ฉ๋ฆฌ์ ์ด๋‹ค.

์ง์ ‘ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•·์šด์˜ํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์ด๋ ค๋ฉด ๋งค๋‹ˆ์ง€๋“œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์“ด๋‹ค. AWS์˜ EKS, Google์˜ GKE, Azure์˜ AKS๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค. ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์šด์˜์„ ํด๋ผ์šฐ๋“œ๊ฐ€ ๋Œ€์‹  ๋งก์•„์ฃผ๋ฏ€๋กœ, ํŒ€์€ ์›Œํฌ๋กœ๋“œ(๋งค๋‹ˆํŽ˜์ŠคํŠธ)์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ฌธ·ํ•™์Šต์šฉ์œผ๋กœ ๋กœ์ปฌ์—์„œ ๊ฐ€๋ณ๊ฒŒ ๋„์šฐ๋ ค๋ฉด minikube๋‚˜ kind๊ฐ€ ์ข‹๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๊ณผ ์กฐ์ง์— ์ด๋“์ด๋ผ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค. "๋‚จ๋“ค์ด ์“ฐ๋‹ˆ๊นŒ"๊ฐ€ ์•„๋‹ˆ๋ผ, ์œ„์˜ "์ž˜ ๋งž๋Š” ๊ฒฝ์šฐ"์— ํ•ด๋‹นํ•  ๋•Œ ๋„์ž…ํ•˜๋Š” ๊ฒŒ ๋งž๋‹ค.


๋งˆ์น˜๋ฉฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” "์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์„ ์–ธํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ทธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค"๋Š” ์„ ์–ธ์  ์šด์˜ ๋ชจ๋ธ ์œ„์— ์„œ ์žˆ๋‹ค. Pod(์ตœ์†Œ ์‹คํ–‰ ๋‹จ์œ„)๋ฅผ Deployment(๊ฐœ์ˆ˜ ์œ ์ง€·์ž๊ฐ€๋ณต๊ตฌ·๋กค๋ง ์—…๋ฐ์ดํŠธ)๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ , Service(๊ณ ์ • ์ฃผ์†Œ·๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ)๊ฐ€ ๊ทธ ์•ž์„ ์ง€ํ‚ค๋ฉฐ, ์ด ๋ชจ๋“  ๊ฑธ kubectl๋กœ ์กฐ์ž‘ํ•œ๋‹ค. ์ด ๋„ค ๊ฐ€์ง€๋งŒ ์†์— ์ตํ˜€๋„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ 8ํ• ์€ ์ฝํžŒ๋‹ค.

ํ•ต์‹ฌ๋งŒ ๋‹ค์‹œ ์งš์œผ๋ฉด, ์ปจํ…Œ์ด๋„ˆ๋Š” Pod๋กœ ๊ฐ์‹ธ๊ณ , Pod๋Š” Deployment๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ ‘๊ทผ์€ Service๋กœ ์•ˆ์ •ํ™”ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ† ๋Œ€์—๋Š” "ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๋Š์ž„์—†์ด ๋งž์ถ˜๋‹ค"๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์ผ์ด ์žˆ๋‹ค.

์ด๋กœ์จ Docker(์ปจํ…Œ์ด๋„ˆ) → CI/CD(์ž๋™ ๋นŒ๋“œ·๋ฐฐํฌ) → ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค(์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ์˜ ์šด์˜)๋กœ ์ด์–ด์ง€๋Š” ์ธํ”„๋ผ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ•œ ๋ฐ”ํ€ด ๋Œ์•˜๋‹ค. ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๋˜ ๋ฐ์„œ ์ถœ๋ฐœํ•ด, ๊ทธ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ , ๊ทœ๋ชจ ์žˆ๊ฒŒ ์šด์˜ํ•˜๋Š” ๊ทธ๋ฆผ๊นŒ์ง€ ์˜จ ์…ˆ์ด๋‹ค.


์ฐธ๊ณ  ์ถœ์ฒ˜

Kubernetes ๋ฐ Kubernetes ๋กœ๊ณ ๋Š” The Linux Foundation์˜ ๋“ฑ๋ก ์ƒํ‘œ์ด๋ฉฐ, ๋ณธ ๊ธ€์—์„œ๋Š” ์‹๋ณ„·์„ค๋ช… ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.