KR_K8s_Basics - somaz94/DevOps-Engineer GitHub Wiki

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ ๊ฐœ๋…

1. ์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ "์™œ Kubernetes๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?" ์— ๋Œ€ํ•œ ์˜๋ฌธ์ ์— ๋Œ€ํ•ด์„œ ํฌ๊ฒŒ ์ƒ๊ฐํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Kubernetes๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

Kubernetes๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ, ํ™•์žฅ ๋ฐ ์šด์˜์„ ์ž๋™ํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์˜คํ”ˆ ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ์ด๋‹ค. Google์—์„œ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ ํ˜„์žฌ Cloud Native Computing Foundation์—์„œ ์œ ์ง€๊ด€๋ฆฌ ํ•˜๊ณ  ์žˆ๋‹ค.

์ฃผ์š” ์ด์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Container Orchestration(์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜)
    • Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๋จธ์‹  ํด๋Ÿฌ์Šคํ„ฐ ์ „๋ฐ˜์— ๊ฑธ์ณ ๋ฐฐํฌ, ํ™•์žฅ, ์ข…๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋Š” ๊ฒฉ๋ฆฌ๋˜๊ณ  ์ž์ฒด ์ข…์†์„ฑ์ด ๋ฒˆ๋“ค๋กœ ํฌํ•จ๋œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•œ๋‹ค.
  • Scalability(ํ™•์žฅ์„ฑ)
    • Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ ๋ช…๋ น์ด๋‚˜ UI๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ CPU/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ํ™•์žฅ ๋ฐ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Load Balancing(๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ)
    • Kubernetes๋Š” ๋ฐฐํฌ๊ฐ€ ์•ˆ์ •์ ์ด๋„๋ก ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹จ์ผ ์‹คํŒจ ์ง€์ ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • High Availability(๊ณ ๊ฐ€์šฉ์„ฑ)
    • Kubernetes๋Š” ์ž๋™ ๋นˆํŒจํ‚น, ์ž๊ฐ€ ๋ณต๊ตฌ(์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘), ๋ณต์ œ, ์ˆ˜ํ‰ ํ™•์žฅ(ํ•„์š”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๊ธฐ ์กฐ์ •)๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • Automated Rollouts and Rollbacks(์ž๋™ ๋กค์•„์›ƒ ๋กค๋ฐฑ)
    • Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ œ์–ด๋œ ์†๋„๋กœ ์‹ค์ œ ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Kubernetes๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • Service Discovery and Load Balancing(์„œ๋น„์Šค ๊ฒ€์ƒ‰ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ)
    • Kubernetes๋Š” DNS ์ด๋ฆ„์ด๋‚˜ ์ž์ฒด IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์ด ๋†’์œผ๋ฉด Kubernetes๋Š” ๋ฐฐํฌ๊ฐ€ ์•ˆ์ •์ ์ด๋„๋ก ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๊ณ  ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Storage Orchestration(์Šคํ† ๋ฆฌ์ง€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜)
    • Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€, ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ๋“ฑ ์›ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์„ ์ž๋™์œผ๋กœ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Secret and Configuration Management(Secret ๋ฐ Configmap ๊ด€๋ฆฌ)
    • Kubernetes๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ, OAuth ํ† ํฐ, SSH ํ‚ค์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ์Šคํƒ ๊ตฌ์„ฑ์— Secret์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ๋น„๋ฐ€๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์„ ๋ฐฐํฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Self-healing(์ž๊ฐ€ ์น˜์œ )
    • Kubernetes๋Š” ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ์ƒํƒœ ๊ฒ€์‚ฌ์— ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ต์ฒดํ•˜๋ฉฐ, ์„œ๋น„์Šค ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
  • Declarative Configuration(์„ ์–ธ์  ๊ตฌ์„ฑ)
    • ์‹œ์Šคํ…œ์˜ ์›ํ•˜๋Š” ์ƒํƒœ๋ฅผ YAML ๋˜๋Š” JSON ํŒŒ์ผ๋กœ ์„ ์–ธ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Kubernetes๋Š” ์ž๋™์œผ๋กœ ์ด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜(Container Orchestration)์ด๋ž€?

์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์€ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ช…์ฃผ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐฐํฌ, ํ™•์žฅ, ๋„คํŠธ์›Œํ‚น, ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™œ๋™์ด ํฌํ•จ๋œ๋‹ค.

์ฆ‰, ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์€ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์˜ ์ž‘์—…์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ด ์ค‘์š”ํ•œ ์ด์œ 
  • Efficiency(ํšจ์œจ์„ฑ): ๋งŽ์€ ์ˆ˜์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ํ™•์žฅํ•œ๋‹ค.
  • Load Balancing(๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ): ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ๋กœ๋“œ์™€ ํŠธ๋ž˜ํ”ฝ์„ ์ž๋™์œผ๋กœ ๋ถ„์‚ฐํ•œ๋‹ค.
  • High Availability(๊ณ ๊ฐ€์šฉ์„ฑ): ์ปจํ…Œ์ด๋„ˆ ๋ณต์ œ๋ณธ ๋ฐ ๊ต์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ
  • Container(์ปจํ…Œ์ด๋„ˆ): ์ฝ”๋“œ, ๋Ÿฐํƒ€์ž„, ์‹œ์Šคํ…œ ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์„ค์ •์„ ํฌํ•จํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋œ ๊ฒฝ๋Ÿ‰์˜ ๋…๋ฆฝํ˜• ์‹คํ–‰ ๊ฐ€๋Šฅ ํŒจํ‚ค์ง€์ด๋‹ค.
  • Pod(ํŒŒ๋“œ): ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” Kubernetes์—์„œ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ด๋‹ค.
  • Node(๋…ธ๋“œ): Kubernetes์˜ ์ž‘์—…์ž ๋จธ์‹ ์œผ๋กœ, ํด๋Ÿฌ์Šคํ„ฐ์— ๋”ฐ๋ผ ๊ฐ€์ƒ ๋จธ์‹ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋ฌผ๋ฆฌ์  ๋จธ์‹ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • Cluster(ํด๋Ÿฌ์Šคํ„ฐ): Kubernetes์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ ์ง‘ํ•ฉ์ด๋‹ค.
๊ธฐํƒ€ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ

Kubernetes ์™ธ์—๋„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Docker Swarm ๋ฐ Apache Mesos์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์žˆ๋‹ค.

Reference


2. Kubernetes ๊ตฌ์„ฑ์š”์†Œ๋ž€?

Kubernetes๋Š” ๋จธ์‹  ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ์ด๋‹ค.

๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค์™€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ์˜ ๋‹ค์–‘ํ•œ ์ธก๋ฉด์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Kubernetes ๋‚ด์—์„œ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ Pod๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

Control Plane ์ปดํฌ๋„ŒํŠธ

kube-apiserver
  • ์ „์ฒด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ค‘์•™ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
  • ๋‚ด๋ถ€ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฌผ๋ก  ์™ธ๋ถ€ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Kubernetes API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด kube-apiserver๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  Pod ์ •๋ณด๋ฅผ etcd ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•œ๋‹ค.
etcd
  • ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ Kubernetes์˜ ๋ฐฑ์—… ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ๊ด€๋˜๊ณ  ๊ฐ€์šฉ์„ฑ์ด ๋†’์€ ํ‚ค ๊ฐ’ ์ €์žฅ์†Œ์ด๋‹ค.
  • Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ•ด๋‹น ๊ตฌ์„ฑ๊ณผ ์ƒํƒœ๊ฐ€ etcd์— ์ €์žฅ๋˜๋ฏ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๊ณ  ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ณต๊ตฌ๋  ์ˆ˜ ์žˆ๋‹ค.
kube-scheduler
  • ํ• ๋‹น๋œ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Pod๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ๋ฆฌ์†Œ์Šค ์š”๊ตฌ ์‚ฌํ•ญ, ์„ ํ˜ธ๋„ ์‚ฌ์–‘, ๋ฐ์ดํ„ฐ ์ง€์—ญ์„ฑ, ์›Œํฌ๋กœ๋“œ ๊ฐ„ ๋“ฑ ๋‹ค์–‘ํ•œ ์ผ์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ์‹คํ–‰ํ•  ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • Pod๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ kube-scheduler๋Š” ์ด๋ฅผ ์ ํ•ฉํ•œ ๋…ธ๋“œ์— ํ• ๋‹นํ•œ๋‹ค.
kube-controller-manager
  • ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ผ์ƒ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” background threads ์ปจํŠธ๋กค๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • Pod ์ƒ์„ฑ ์‹œ kube-controller-manager์˜ ๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Pod์˜ ์‹ค์ œ ์ƒํƒœ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

Node ์ปดํฌ๋„ŒํŠธ

kubelet
  • ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” kubelet์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Pod์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • Pod๊ฐ€ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ kubelet์€ kube-apiserver์˜ ์š”์ฒญ์„ ๋ฐ›์•„ Pod์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
kube-proxy
  • ๊ฐ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๋„คํŠธ์›Œํฌ ํ”„๋ก์‹œ๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์˜ ๋„คํŠธ์›Œํฌ ์„ธ์…˜์—์„œ Pod๋กœ์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๊ทœ์น™์„ ์œ ์ง€ํ•œ๋‹ค.
  • Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด kube-proxy๋Š” ํŒŒ๋“œ์˜ IP ์ฃผ์†Œ๋กœ IP ์ „๋‹ฌ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๋…ธ๋“œ์˜ ๋„คํŠธ์›Œํฌ ๊ทœ์น™์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
DNS ์„œ๋น„์Šค(ex: CoreDNS)
  • Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— DNS ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„œ๋น„์Šค ๋ฐ Pod ์ด๋ฆ„์„ IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • Pod๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด IP ์ฃผ์†Œ์™€ DNS ์ด๋ฆ„์„ ์–ป๋Š”๋‹ค. CoreDNS๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ DNS ์ด๋ฆ„์„ ํ†ตํ•ด Pod์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
Container Runtime
  • ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค.
  • Containerd, CRI์™€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์„ ์ง€์›ํ•œ๋‹ค.
Addon
  • Addon์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค(๋ฐ๋ชฌ์…‹, ๋””ํด๋กœ์ด๋จผํŠธ ๋“ฑ)์„ ์ด์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ ๋‹จ์œ„์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์• ๋“œ์˜จ์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฆฌ์†Œ์Šค๋Š” kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•œ๋‹ค.

Reference


3. Kubernetes Pod ์ƒ์„ฑ ๋ฐฉ์‹

  1. kubectl (Execute):

    • ์‚ฌ์šฉ์ž๊ฐ€ kubectl apply -f k8s-deployment.yml์„ ์‹คํ–‰ํ•œ๋‹ค.
    • YAML์„ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ kube-apiserver๋กœ ์ „์†กํ•œ๋‹ค.
  2. kube-apiserver (Processing):

    • API ์„œ๋ฒ„๊ฐ€ ๋ฐฐํฌ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐฐํฌ ์„ธ๋ถ€ ์ •๋ณด(๊ฐ์ฒด ์ •์˜)๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  3. etcd (Data Storage):

    • etcd๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ตฌ์„ฑ ๋ฐ ์ƒํƒœ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์ด๋‹ค.
    • ๋ฐฐํฌ ๋ฆฌ์†Œ์Šค๊ฐ€ etcd์— ์ €์žฅ๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ๋งค๋‹ˆ์ €์—๊ฒŒ ์•Œ๋ฆผ์ด ์ „์†ก๋œ๋‹ค.
  4. kube-controller-manager (Resource Creation):

    • ์ปจํŠธ๋กค๋Ÿฌ ๋งค๋‹ˆ์ €๋Š” ๋ฐฐํฌ ์‹œ ์ง€์ •๋œ replica ์ˆ˜์— ๋”ฐ๋ผ pod ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  5. kube-scheduler (Scheduling):

    • ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜์˜ health๋ฅผ ํ‰๊ฐ€ํ•œ๋‹ค.
    • ์ตœ์ ์˜ ๋…ธ๋“œ๋ฅผ ์„ ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ ํ•„ํ„ฐ๋ง ๋ฐ ์ˆœ์œ„ ๋งค๊ธฐ๊ธฐ(ranking)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์Šค์ผ€์ค„๋Ÿฌ๋Š” nodeName ํ•„๋“œ๋กœ ์„ ํƒ๋œ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, etcd์—์„œ pod์˜ ์ƒํƒœ๋ฅผ scheduled์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  6. kubelet (Node-Level Execution):

    • ๊ฐ ์›Œ์ปค ๋…ธ๋“œ๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ/์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ๊ณผ ํ†ต์‹ ํ•˜๋Š” kubelet์„ ์‹คํ–‰ํ•œ๋‹ค.
    • kubelet์€ pod์— ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ๋…ธ๋“œ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค.
  7. Container Runtime Interface (CRI) Daemon (Container Creation):

    • ๋ฐฐํฌ๊ฐ€ ์—ฌ๋Ÿฌ ๋ณต์ œ๋ณธ์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ ์ž‘์—…์€ etcd์—์„œ scheduled์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.
    • kubelet์€ pod ํ…œํ”Œ๋ฆฟ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํŽ˜์ด์Šค(CRI) ๋ฐ๋ชฌ์—๊ฒŒ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์„ ์ง€์‹œํ•œ๋‹ค.
    • kubelet์— ์˜ํ•ด ํ˜ธ์ถœ๋˜์–ด Pod ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ ํ•œ๋‹ค.
  8. kubelet (Status Update):

    • CRI ๋ฐ๋ชฌ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด kubelet์€ readiness ๋ฐ liveness ํ”„๋กœ๋ธŒ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์ด ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด pod์˜ ์ƒํƒœ๊ฐ€ running์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

Reference


4. Kubernetes API Group & RBAC(Role Based Access Control)

API Group

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๊ทธ๋ฃน(API Group)์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๋ฆฌ์†Œ์Šค๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ฃนํ™”ํ•œ ๊ฒƒ์ด๋‹ค. API ๊ทธ๋ฃน์„ ํ†ตํ•ด ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ , ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋Š” ํฌ๊ฒŒ Core Group๊ณผ Named Group์œผ๋กœ ๋‚˜๋‰œ๋‹ค. Kubernetes API Group

1. Core Group

Core Group์€ ๊ธฐ๋ณธ์ ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๊ทธ๋ฃน์œผ๋กœ, API ๊ทธ๋ฃน ์ด๋ฆ„์ด ๊ณต๋ฐฑ ๋ฌธ์ž์—ด("")๋กœ ์ง€์ •๋œ๋‹ค.

์ด ๊ทธ๋ฃน์—๋Š” ํŒŒ๋“œ(Pods), ์„œ๋น„์Šค(Services), ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์ปจํŠธ๋กค๋Ÿฌ(ReplicationControllers), ๋…ธ๋“œ(Nodes), ๋„ค์ž„์ŠคํŽ˜์ด์Šค(Namespaces) ๋“ฑ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด Core Group์˜ pods ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

apiGroups: [""]
resources: ["pods"]
2. Named Group

Named Group์€ Core Group ์™ธ์˜ ํŠน์ •ํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ API ๊ทธ๋ฃน์ด๋‹ค.

์ด ๊ทธ๋ฃน์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค, ๋ณด์•ˆ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค, ๊ตฌ์„ฑ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค, ๊ทธ ์™ธ ๋‹ค์–‘ํ•œ ํ™•์žฅ ๋ฆฌ์†Œ์Šค ๋“ฑ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ Named Group์œผ๋กœ๋Š” extensions, apps, networking.k8s.io, rbac.authorization.k8s.io ๋“ฑ์ด ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, apps API ๊ทธ๋ฃน์˜ deployments ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

apiGroups: ["apps"]
resources: ["deployments"]

RBAC(Role Based Access Control)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ RBAC (Role-Based Access Control)์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์‚ฌ์šฉ์ž๋‚˜ ๊ทธ๋ฃน์—๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜(Authorization)์ด๋‹ค. RBAC์„ ํ†ตํ•ด ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ์†Œ์Šค์™€ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” Role, ClusterRole, RoleBinding, ClusterRoleBinding ์ด๋ ‡๊ฒŒ ๋„ค ๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RBAC์„ ๊ตฌํ˜„ํ•œ๋‹ค.

1. Role

Role์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace) ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

Role์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ• ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ถŒํ•œ์ด ์–ด๋–ค ๋™์ž‘(์˜ˆ: get, list, create, update ๋“ฑ)์„ ํฌํ•จํ•˜๋Š”์ง€ ๋ช…์‹œํ•œ๋‹ค.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: gitlab-runner-role
  # kubectl apply ํ•  ๋•Œ ์ ์šฉํ•  namespace ์ง€์ •
  #namespace:
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: [""]
    resources: ["pods", "services", "secrets", "pods/exec", "serviceaccounts"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
์ถœ์ฒ˜: https://somaz.tistory.com/199 [Somaz์˜ IT ๊ณต๋ถ€ ์ผ์ง€:ํ‹ฐ์Šคํ† ๋ฆฌ]

extensions ๋ฐ apps API ๊ทธ๋ฃน์— ์†ํ•˜๋Š” deployments ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ

  • get: ๋ฆฌ์†Œ์Šค ์กฐํšŒ
  • list: ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก ์กฐํšŒ
  • watch: ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฐ์‹œ
  • create: ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
  • update: ๋ฆฌ์†Œ์Šค ์ˆ˜์ •
  • patch: ๋ฆฌ์†Œ์Šค ์ผ๋ถ€ ์ˆ˜์ •
  • delete: ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

core API ๊ทธ๋ฃน (apiGroups ํ•„๋“œ์— ๋นˆ ๋ฌธ์ž์—ด ""์ด ์‚ฌ์šฉ)์— ์†ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ

  • pods, services, secrets, serviceaccounts: ์œ„์™€ ๋™์ผํ•œ ๋™์ž‘ ๊ถŒํ•œ
  • pods/exec: ํŒŒ๋“œ ๋‚ด์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ
2. RoleBinding

RoleBinding์€ Role์— ์ •์˜๋œ ๊ถŒํ•œ์„ ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน, ๋˜๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค ๊ณ„์ •์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

์ฆ‰, RoleBinding์„ ํ†ตํ•ด ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ Role์— ๋ช…์‹œ๋œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. RoleBinding์€ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋งŒ ๊ตญํ•œ๋˜์–ด ์ž‘๋™ํ•œ๋‹ค.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  # kubectl apply ํ•  ๋•Œ ์ ์šฉํ•  namespace ์ง€์ •
  #namespace:
  name: gitlab-runner-role-binding
subjects:
  - kind: ServiceAccount
    name: default
    # kubectl apply ํ•  ๋•Œ ์ ์šฉํ•  namespace ์ง€์ •
    #namespace:
roleRef:
  kind: Role
  name: gitlab-runner-role
  apiGroup: rbac.authorization.k8s.io

Reference


5. Kubernetes Secret

Kubernetes ์‹œํฌ๋ฆฟ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ, API ํ‚ค, ํ† ํฐ ๋˜๋Š” ์ธ์ฆ์„œ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ฐ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์‹œํฌ๋ฆฟ์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŒŒ๋“œ ๋ฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ํŒŒ์ผ ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

Kubernetes Secrets์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Opaque Secrets: ์ž„์˜์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์˜ ์‹œํฌ๋ฆฟ
  • Service account token Secrets: ์„œ๋น„์Šค ๊ณ„์ • ์ธ์ฆ์„ ์œ„ํ•œ ํ† ํฐ์„ ์ €์žฅ
  • Docker config Secrets: ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅ
  • Basic authentication Secret: ๊ธฐ๋ณธ ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅ
  • SSH authentication secrets: SSH ์ธ์ฆ ํ‚ค๋ฅผ ์ €์žฅ
  • TLS secrets: TLS ์ธ์ฆ์„œ์™€ ํ‚ค๋ฅผ ์ €์žฅ
  • Bootstrap token Secrets: ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์„ ์ €์žฅ
  • External Secrets: ์™ธ๋ถ€ ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์‹œํฌ๋ฆฟ

์‹œํฌ๋ฆฟ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ:

  • ์‹œํฌ๋ฆฟ์€ base64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์ €์žฅ๋˜์ง€๋งŒ, ์ด๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹˜
  • ETCD์— ์ €์žฅ๋  ๋•Œ ์•”ํ˜ธํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
  • RBAC๋ฅผ ํ†ตํ•ด ์‹œํฌ๋ฆฟ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œํ•œํ•ด์•ผ ํ•จ
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‹œํฌ๋ฆฟ์„ Pod์— ๋งˆ์šดํŠธ

Reference


6. Kubernetes Service Type & ExternalTrafficPoilcy

Kubernetes Service Type

Kubernetes์—์„œ ์„œ๋น„์Šค๋Š” ๋…ผ๋ฆฌ์  Pod ์„ธํŠธ์™€ ์ด์— ์•ก์„ธ์Šคํ•˜๋Š” ์ •์ฑ…์„ ์ •์˜ํ•œ๋‹ค. ์„œ๋น„์Šค ์œ ํ˜•์€ ์„œ๋น„์Šค๊ฐ€ ๋„คํŠธ์›Œํฌ์— ๋…ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์„ ์ง€์ •ํ•œ๋‹ค.

์ฃผ์š” ์„œ๋น„์Šค ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ClusterIP: ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ๋งŒ ์ ‘์† ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์„œ๋น„์Šค ์œ ํ˜•์ด๋‹ค.
  • NodePort: ์ •์  ํฌํŠธ์—์„œ ๊ฐ ๋…ธ๋“œ์˜ IP์— ๋Œ€ํ•œ ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. <NodeIP>:<NodePort>๋ฅผ ์š”์ฒญํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ NodePort ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • LoadBalancer: ํ˜„์žฌ ํด๋ผ์šฐ๋“œ์— ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ (์ง€์›๋˜๋Š” ๊ฒฝ์šฐ) ๊ณ ์ • ์™ธ๋ถ€ IP๋ฅผ ์„œ๋น„์Šค์— ํ• ๋‹นํ•œ๋‹ค.
  • ExternalName: ํ•ด๋‹น ๊ฐ’๊ณผ ํ•จ๊ป˜ CNAME ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ externalName ํ•„๋“œ(์˜ˆ: foo.bar.example.com)์˜ ์ฝ˜ํ…์ธ ์— ์„œ๋น„์Šค๋ฅผ ๋งคํ•‘ํ•œ๋‹ค.

ExternalTrafficPolicy

externalTrafficPolicy๋Š” ์ˆ˜์‹  ํŠธ๋ž˜ํ”ฝ์ด ๋ผ์šฐํŒ…๋˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹LoadBalancer ๋˜๋Š” NodePort ์œ ํ˜•์˜ ์„œ๋น„์Šค ์˜ต์…˜์ด๋‹ค. Cluster ๋˜๋Š” Local์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • Cluster: ํŠธ๋ž˜ํ”ฝ์€ ์ž„์˜์˜ ๋…ธ๋“œ๋กœ ๋ผ์šฐํŒ…๋˜๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์— ์„œ๋น„์Šค์šฉ Pod๊ฐ€ ์—†์œผ๋ฉด ํŠธ๋ž˜ํ”ฝ์€ ์žˆ๋Š” ๋…ธ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์ถ”๊ฐ€ ํ™‰์ด ๋ฐœ์ƒํ•˜๊ณ  ์†Œ์Šค IP ์ฃผ์†Œ๊ฐ€ ๋ชจํ˜ธํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • Local: ํŠธ๋ž˜ํ”ฝ์€ ์„œ๋น„์Šค์šฉ Pod๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋กœ๋งŒ ๋ผ์šฐํŒ…๋œ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ํŒŒ๋“œ ์—†์ด ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๋ฉด ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  ์‚ญ์ œ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜ ์†Œ์Šค IP ์ฃผ์†Œ๊ฐ€ ์œ ์ง€๋˜์ง€๋งŒ ํŒŒ๋“œ ์ „์ฒด์— ํŠธ๋ž˜ํ”ฝ์ด ๊ณ ๋ฅด์ง€ ์•Š๊ฒŒ ๋ถ„์‚ฐ๋  ์ˆ˜ ์žˆ๋‹ค.

7. Kubernetes Persistent Volumes (PV) and Persistent Volume Claims (PVC) and StorageClass and CSI(Constainer Storage Interface)

graph TD
    PV("Persistent Volume (PV)")
    PVC("Persistent Volume Claim (PVC)")
    Pod("Pod")
    Retain("Retain Policy")
    Delete("Delete Policy")
    Recycle("Recycle Policy")
    Provisioning("Provisioning")
    Binding("Binding")
    Using("Using")
    Releasing("Releasing")
    Reclaiming("Reclaiming")
    SC("Storage Class")
    Dynamic("Dynamic Provisioning")
    Static("Static Provisioning")
    CSI("CSI-Driver")
    Block("Block Storage")
    File("File Storage")
    Object("Object Storage")

    PV -- "Bound by" --> PVC
    PVC -- "Referenced by" --> Pod

    PV -- "Retain" --> Retain
    PV -- "Delete" --> Delete
    PV -- "Recycle" --> Recycle

    Provisioning -- "leads to" --> Binding
    Binding -- "leads to" --> Using
    Using -- "leads to" --> Releasing
    Releasing -- "leads to" --> Reclaiming

    SC -- "creates" --> PV
    SC -- "Defines provisioning" --> Dynamic
    SC -- "Defines provisioning" --> Static

    CSI -- "Manages" --> Block
    CSI -- "Manages" --> File
    CSI -- "Manages" --> Object

    PVC -- "Can specify" --> SC
    PV -- "Managed by" --> CSI
Loading

Persistent Volumes(PV)

  • Persistent Volumes(PV)์€ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ํ”„๋กœ๋น„์ €๋‹๋˜๊ฑฐ๋‚˜ ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ์ €์žฅ์†Œ์ด๋‹ค.

  • PV๋Š” ๋…ธ๋“œ์ฒ˜๋Ÿผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ์†Œ์Šค๋กœ ์กด์žฌํ•˜๋ฉฐ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ํด๋ ˆ์ž„๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฃผ์š” ํŠน์ง•:

    • ํŒŒ๋“œ์™€ ๋…๋ฆฝ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ: PV๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ณ„ ํŒŒ๋“œ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ ์ด๋‹ค.
    • ์ €์žฅ์†Œ ์ถ”์ƒํ™”: ์ €์žฅ์†Œ ํ”„๋กœ๋น„์ €๋‹ ๋ฐ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถ”์ƒํ™”ํ•œ๋‹ค.
    • ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ชจ๋“œ ์ง€์›: ReadWriteOnce, ReadOnlyMany, ReadWriteMany ๋“ฑ์˜ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.
      • ReadWriteOnce: ๋ณผ๋ฅจ์ด ๋‹จ์ผ ๋…ธ๋“œ์— ์˜ํ•ด ์ฝ๊ธฐ-์“ฐ๊ธฐ๋กœ ๋งˆ์šดํŠธ๋  ์ˆ˜ ์žˆ๋‹ค.
      • ReadOnlyMany: ๋ณผ๋ฅจ์ด ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์˜ํ•ด ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธ๋  ์ˆ˜ ์žˆ๋‹ค.
      • ReadWriteMany: ๋ณผ๋ฅจ์ด ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์˜ํ•ด ์ฝ๊ธฐ-์“ฐ๊ธฐ๋กœ ๋งˆ์šดํŠธ๋  ์ˆ˜ ์žˆ๋‹ค.

Persistent Volume Claims(PVC)

  • Persistent Volume Claims(PVC)์€ ์‚ฌ์šฉ์ž์˜ ์ €์žฅ์†Œ ์š”์ฒญ์ด๋‹ค.

  • ํŒŒ๋“œ๊ฐ€ ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, PVC๋Š” PV ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ฃผ์š” ํŠน์ง•:

    • ์ €์žฅ์†Œ ์š”์ฒญ: ์‚ฌ์šฉ์ž๋Š” ํŠน์ • ํฌ๊ธฐ์™€ ์ ‘๊ทผ ๋ชจ๋“œ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
    • ๋ฐ”์ธ๋”ฉ: PVC๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ์ ํ•ฉํ•œ PV์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
    • ํŒŒ๋“œ์—์„œ์˜ ์‚ฌ์šฉ: PVC๋Š” ํŒŒ๋“œ ๋‚ด์—์„œ ๋ณผ๋ฅจ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•œ๋‹ค.
  • persistentVolumeReclaimPolicy

    • PV์— ์„ค์ •๋œ ์ด ํ•„๋“œ๋Š” ํด๋ ˆ์ž„์—์„œ ํ•ด์ œ๋œ ํ›„ ๋ณผ๋ฅจ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ง€์ •ํ•œ๋‹ค.
  • ์ •์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

    • Retain: ๊ธฐ๋ณธ ์ •์ฑ…์œผ๋กœ ํ•ด์ œ ํ›„ ๋ณผ๋ฅจ์„ ์œ ์ง€ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•œ๋‹ค.
    • Delete: ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋œ PV์˜ ๊ฒฝ์šฐ PVC๊ฐ€ ์‚ญ์ œ๋  ๋•Œ ๊ธฐ๋ณธ ์ €์žฅ์†Œ์—์„œ ๋ณผ๋ฅจ์„ ์‚ญ์ œํ•œ๋‹ค.
    • Recycle: ๋™์  ํ”„๋กœ๋น„์ €๋‹์„ ์œ„ํ•ด ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์ •์ฑ…์€ ๋ณผ๋ฅจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํฌ๋Ÿฌ๋น™ํ•˜๊ณ  ์ƒˆ ํด๋ ˆ์ž„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.
PV and PVC Lifecycle
  • Provisioning(ํ”„๋กœ๋น„์ €๋‹): ์˜๊ตฌ ๋ณผ๋ฅจ(PV)์€ ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ์ˆ˜๋™์œผ๋กœ ์‚ฌ์ „ ํ”„๋กœ๋น„์ €๋‹๋  ์ˆ˜ ์žˆ๋‹ค.
  • Binding(๋ฐ”์ธ๋”ฉ): ์‚ฌ์šฉ์ž๋Š” ํŠน์ • ํฌ๊ธฐ ๋ฐ ์ ‘๊ทผ ๋ชจ๋“œ๋ฅผ ์š”์ฒญํ•˜๋Š” ์˜๊ตฌ ๋ณผ๋ฅจ ํด๋ ˆ์ž„(PVC)์„ ์ƒ์„ฑํ•œ๋‹ค. PVC๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ PV์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  • Using(์‚ฌ์šฉ): ๋ฐ”์ธ๋”ฉ๋˜๋ฉด PVC๋Š” ํŒŒ๋“œ์— ์˜ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋“œ๋Š” PVC๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ๊ธฐ๋ณธ PV๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธ ํ•œ๋‹ค.
  • Releasing(๋ฆด๋ฆฌ์Šค): ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ๋ฅจ์„ ์™„๋ฃŒํ•˜๋ฉด PVC๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์ˆ˜ ์ •์ฑ…์— ๋”ฐ๋ผ ๊ธฐ๋ณธ PV๊ฐ€ ๋‹ค์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๊ฑฐ๋‚˜ ์‚ญ์ œ๋œ๋‹ค.
  • Reclaiming(ํšŒ์ˆ˜): Reclaim ์ •์ฑ…์ด Retain๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ PVC ์‚ญ์ œ ํ›„ PV๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์œ ์ง€๋˜๋ฉฐ, Delete์ธ ๊ฒฝ์šฐ PV ๋ฐ ์™ธ๋ถ€ ์ธํ”„๋ผ์˜ ๊ด€๋ จ ์Šคํ† ๋ฆฌ์ง€ ์ž์‚ฐ์ด ์‚ญ์ œ๋œ๋‹ค.

StorageClass

StorageClass๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€์˜ "ํด๋ž˜์Šค"๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ํ”Œ๋žซํผ์˜ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  PV๋ฅผ ๋™์ ์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

์ฃผ์š” ์ธก๋ฉด:

  • ํ”„๋กœ๋น„์ €๋‹(Provisioning): ๋™์  ๋˜๋Š” ์ •์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์Šคํ† ๋ฆฌ์ง€ ํ• ๋‹น ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜(Parameters): ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์ œ๊ณต์ž์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ StorageClass๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ”์ธ๋”ฉ(Binding): PVC๋Š” StorageClass๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํด๋ž˜์Šค์˜ PV๋งŒ PVC์— ๋ฐ”์ธ๋”ฉ๋  ์ˆ˜ ์žˆ๋‹ค.
Container Storage Interface(CSI)

์ปจํ…Œ์ด๋„ˆ ์Šคํ† ๋ฆฌ์ง€ ์ธํ„ฐํŽ˜์ด์Šค(CSI)๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ(COS)์—์„œ ๋‹ค์–‘ํ•œ ๋ธ”๋ก ๋ฐ ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์„ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์›Œํฌ๋กœ๋“œ์— ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ด๋‹ค. CSI์˜ ๋ชฉํ‘œ๋Š” ์Šคํ† ๋ฆฌ์ง€ ์†”๋ฃจ์…˜์„ ์œ„ํ•œ ์ผ๊ด€๋˜๊ณ  ํ‘œ์ค€ํ™”๋œ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ƒํƒœ๊ณ„์—์„œ ์Šคํ† ๋ฆฌ์ง€ ์ œํ’ˆ์„ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

CSI์—์„œ์˜ ๋ณผ๋ฅจ ์œ ํ˜•

CSI๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ณผ๋ฅจ์„ ์ง€์›ํ•œ๋‹ค.

  • ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€: ๊ธฐ๋ณธ ๋ธ”๋ก ์ˆ˜์ค€์˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€: ๊ณต์œ  ๋˜๋Š” ์ „์šฉ ํŒŒ์ผ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ ์Šคํ† ๋ฆฌ์ง€: ํ‰๋ฉด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜๋ฉฐ, ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
ํŒŒ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ ์œ ํ˜•

CSI ๋ณผ๋ฅจ ์œ ํ˜• ์™ธ์—๋„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒŒ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋ณผ๋ฅจ์ด ์žˆ๋‹ค.

  • hostPath: ํ˜ธ์ŠคํŠธ ๋…ธ๋“œ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํŒŒ๋“œ ๋‚ด๋ถ€๋กœ ๋งˆ์šดํŠธํ•œ๋‹ค. ํŠน์ • ๋…ธ๋“œ์— ์ข…์†์ ์ธ ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ…Œ์ŠคํŠธ์— ์ ํ•ฉํ•˜๋‹ค.
  • emptyDir: ํŒŒ๋“œ์˜ ์ˆ˜๋ช…๊ณผ ๊ณต์œ ๋˜๋Š” ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ์ด๋‹ค. ์ž„์‹œ ์ €์žฅ์†Œ ๋ฐ ๋™์ผ ํŒŒ๋“œ ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํŒŒ์ผ ๊ณต์œ ์— ์œ ์šฉํ•˜๋‹ค.

8. Kubernetes Autoscaling

Kubernetes Auto Scaling์€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์›Œํฌ๋กœ๋“œ์— ๋”ฐ๋ผ ์šฉ๋Ÿ‰์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•œ๋‹ค.

ํŒŒ๋“œ(Pod)์— ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋™์‹œ์— ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

Kubernetes Autoscaler

์ผ๋ฐ˜์ ์œผ๋กœ stateless ์„œ๋ฒ„๋Š” HPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค. VPA๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •์—์„œ pod์˜ ์žฌ์‹œ์ž‘์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๊ณ , ํ•˜๋‚˜์˜ node๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค(CPU, ๋ฉ”๋ชจ๋ฆฌ)์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • HPA(Horizontal Pod Autoscaler): CPU ์‚ฌ์šฉ๋ฅ  ๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Replication Controller, Deployment, Replication set, Statefulset์˜ Pod ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•œ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๊ด€์ฐฐ๋œ ๋ฉ”ํŠธ๋ฆญ ๊ฐ’์ด ์„ค์ •๋œ ๋ชฉํ‘œ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ Replica ์ˆ˜๋ฅผ ์กฐ์ •ํ•œ๋‹ค. Scale out ํ•˜๋Š” ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ ์ด๋‹ค.
  • VPA(Vertical Pod Autoscaler): Pod์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ˆ์•ฝ์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. request ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๊ธฐ๋ก์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๊ฐ ํŒŒ๋“œ๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๊ฐ–๋„๋ก ํ•œ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ถŒ์žฅํ•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. Scale up ํ•˜๋Š” ์˜คํ† ์Šค์ผ€์ผ๋Ÿฌ ์ด๋‹ค.
  • CA(Cluster Autoscaler): Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด์˜ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•œ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์‹คํ–‰์— ์‹คํŒจํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ํŒŒ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋…ธ๋“œ ์‚ฌ์šฉ๋ฅ ์ด ๋‚ฎ๊ณ  ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์˜ˆ์•ฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Scale up vs Scale out

์Šค์ผ€์ผ์—…(์ˆ˜์ง ์Šค์ผ€์ผ๋ง)๊ณผ ์Šค์ผ€์ผ์•„์›ƒ(์ˆ˜ํ‰ ์Šค์ผ€์ผ๋ง)์€ ๋” ํฐ ๋ถ€ํ•˜๋‚˜ ์ˆ˜์š”๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ปดํ“จํŒ… ์ „๋žต์ด๋‹ค.

์Šค์ผ€์ผ์—…์€ ๊ธฐ์กด ์„œ๋ฒ„์— CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ๋งŽ์ด ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๊ธฐ์กด ํ•˜๋“œ์›จ์–ด๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค. ๋ฐ˜๋ฉด ์Šค์ผ€์ผ์•„์›ƒ์€ ์‹œ์Šคํ…œ์— ๋” ๋งŽ์€ ๋…ธ๋“œ๋‚˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋‚˜ ์ธ์Šคํ„ด์Šค์— ๊ฑธ์ณ ๋ถ€ํ•˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ฒƒ์„ ํฌํ•จํ•œ๋‹ค.

์Šค์ผ€์ผ์—…์€ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”์ง€๋งŒ ์Šค์ผ€์ผ์•„์›ƒ์€ ๋” ํฐ ์ธํ”„๋ผ์— ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•œ๋‹ค. ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…๊ณผ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ๊ด€๋ฆฌ์—์„œ ํŠนํžˆ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. Scale UP and Scale Out

Reference


9. Kubernetes Probe

Kubernetes ํ”„๋กœ๋ธŒ๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ Pod ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณด์žฅํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Kubernetes๋Š” ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ •๊ธฐ์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

Kubernetes๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ํ”„๋กœ๋ธŒ ์œ ํ˜•์ด ์žˆ๋‹ค.

  • Liveness Probes: Liveness Probe๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. Liveness Probes๊ฐ€ ์‹คํŒจํ•˜๋ฉด Kubernetes๋Š” ํŒŒ๋“œ์˜ ๋‹ค์‹œ ์‹œ์ž‘ ์ •์ฑ…์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ(e.g., a deadlock)์„ ํฌ์ฐฉํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • Readiness Probes: Readiness Probe๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŠธ๋ž˜ํ”ฝ ์ˆ˜์‹ ์„ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. Readiness Probes์— ์‹คํŒจํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” Kubernetes Service๋กœ๋ถ€ํ„ฐ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋œ ํŒŒ๋“œ์—๋งŒ ํŠธ๋ž˜ํ”ฝ์ด ์ „์†ก๋˜๋„๋ก ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜๋ฉฐ, ์ด๋Š” ์‹œ์ž‘ ์ค‘์ด๋‚˜ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค.
  • Startup Probes: Startup Probe๋Š” ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋œ ์‹œ๊ธฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŒŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๊ธด ์ดˆ๊ธฐํ™” ํ”„๋กœ์„ธ์Šค๋กœ ์ธํ•ด) ์‹œ์ž‘ ํ”„๋กœ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ๊ฐ€ ์‹œ์ž‘ ๋‹จ๊ณ„์—์„œ ํ™œ์„ฑ ํ”„๋กœ๋ธŒ์— ์˜ํ•ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. Startup Probe๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์„ฑ๊ณตํ•˜๋ฉด ์ž์ฒด์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  Liveness Probe๊ฐ€ ํ›„์† ๊ฒ€์‚ฌ๋ฅผ ๋Œ€์‹ ํ•œ๋‹ค.

Configuring Probes

Probe๋Š” ํŒŒ๋“œ ์‚ฌ์–‘์—์„œ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ Probe ์œ ํ˜•์€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค.

  • HTTP GET: Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด HTTP GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 200~399 ๋ฒ”์œ„ ๋‚ด์˜ ์‘๋‹ต ์ฝ”๋“œ๋Š” ์„ฑ๊ณต์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ธฐํƒ€ ์‘๋‹ต ์ฝ”๋“œ ๋˜๋Š” ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์—ฐ๊ฒฐ์— ์‹คํŒจํ•˜๋ฉด ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • TCP Socket: Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ TCP ์†Œ์ผ“์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ์„ฑ๊ณต์€ ์—ฐ๊ฒฐ ์„ค์ • ๊ธฐ๋Šฅ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ , ์‹คํŒจ๋Š” ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์†Œ์ผ“์„ ์—ด ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  • exec: Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค. ์„ฑ๊ณต์€ ๋ฐ˜ํ™˜ ์ฝ”๋“œ 0์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Prode ๋™์ž‘ ์ˆœ์„œ

Kubernetes ํ”„๋กœ๋ธŒ๋Š” ํŒŒ๋“œ ์‚ฌ์–‘(์ผ๋ฐ˜์ ์œผ๋กœ .spec.containers[] ํ•„๋“œ ์•„๋ž˜)์—์„œ ๊ตฌ์„ฑ๋œ๋‹ค. Pod์˜ YAML ํŒŒ์ผ ๋‚ด์—์„œ ๊ฐ ํ”„๋กœ๋ธŒ ์œ ํ˜•์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ์ด๋Ÿฌํ•œ ํ”„๋กœ๋ธŒ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ˆœ์„œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: my-application
spec:
  containers:
    - name: my-container
      image: my-image
      ports:
        - containerPort: 8080
      livenessProbe:
        httpGet:
          path: /healthz
          port: 8080
        initialDelaySeconds: 15
        timeoutSeconds: 2
        periodSeconds: 5
        failureThreshold: 3
      readinessProbe:
        httpGet:
          path: /ready
          port: 8080
        initialDelaySeconds: 5
        timeoutSeconds: 1
        periodSeconds: 5
        failureThreshold: 1
      startupProbe:
        exec:
          command:
            - cat
            - /app/initialized
        initialDelaySeconds: 5
        periodSeconds: 5
        failureThreshold: 30
  • 1. Startup Probe: Pod๊ฐ€ ์‹œ์ž‘๋˜๋ฉด Startup Probe๋Š” ์ •์˜๋œ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. Startup Probe๊ฐ€ ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ ํ™œ์„ฑ ๋ฐ ์ค€๋น„ ํ”„๋กœ๋ธŒ๋Š” ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค. ๊ตฌ์„ฑ๋œ ์ œํ•œ ์‹œ๊ฐ„ ๋ฐ ์‹คํŒจ ์ž„๊ณ„๊ฐ’ ๋‚ด์— Startup Probe๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ํŒŒ๋“œ์˜ ๋‹ค์‹œ ์‹œ์ž‘ ์ •์ฑ…์— ๋”ฐ๋ผ ๋‹ค์‹œ ์˜ˆ์•ฝ๋œ๋‹ค.
  • 2. Readiness Probe: Startup Probe๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด Readiness Probe๊ฐ€ ์‹œ์ž‘๋œ๋‹ค. Readiness Probe๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์‹คํŒจํ•˜๋ฉด Readiness ํ™•์ธ์„ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋น„์Šค์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  • 3. Liveness Probe: Readiness Probe์™€ ํ•จ๊ป˜ Liveness Probe๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๊ณ„์† ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. Liveness Probe๊ฐ€ ์‹คํŒจํ•˜๋ฉด(์ดˆ๊ธฐ ์ง€์—ฐ ์ดํ›„ ๋ฐ ์‹คํŒจ ์ž„๊ณ„๊ฐ’ ๋‚ด์—์„œ) ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋œ๋‹ค.

Reference


10. Kubernetes Affinity and Scheduling

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋˜๋Š” ์œ„์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ(NodeSelector)
  • ์–ดํ”ผ๋‹ˆํ‹ฐ(Affinity)
  • ํ…Œ์ธํŠธ & ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(Taints & Toleration)
  • ์ปค๋“ (Cordon)
  • ๋“œ๋ ˆ์ธ(Drain)

1. ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ(NodeSelector):

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์Šค์ผ€์ค„๋ง ์ œ์•ฝ ์กฐ๊ฑด์ด๋‹ค.
  • ํ‚ค-๊ฐ’ ์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • ์˜ˆ์ œ:
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
      nodeSelector:
        disktype: ssd

2. ์–ดํ”ผ๋‹ˆํ‹ฐ(Affinity):

  • ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ๋ณด๋‹ค ๊ณ ๊ธ‰์ด๋ฉฐ, ํŠน์ • ํŒŒ๋“œ ๋ฐฐ์น˜์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์„ค์ •ํ•œ๋‹ค.

  • ์ฃผ์š” ์œ ํ˜•: ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ(Node Affinity) ๋ฐ ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ(Pod Affinity).

  • ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ:

    • requiredDuringSchedulingIgnoredDuringExecution ๋˜๋Š” preferredDuringSchedulingIgnoredDuringExecution์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ์ œ:
      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
      spec:
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
                - matchExpressions:
                    - key: disktype
                      operator: In
                      values:
                        - ssd
        containers:
          - name: nginx
            image: nginx
    • requiredDuringSchedulingIgnoredDuringExecution
      • ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•œ๋‹ค. ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋  ์ˆ˜ ์žˆ๋‹ค.
      • ํŠน์ • ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋ผ๋ฒจ์ด ์žˆ๋Š” ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์ด ๊ทœ์น™์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋งŒ์•ฝ ์ด ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด, ํŒŒ๋“œ๋Š” ์Šค์ผ€์ค„๋˜์ง€ ์•Š๋Š”๋‹ค.
    • preferredDuringSchedulingIgnoredDuringExecution
      • ์Šค์ผ€์ค„๋Ÿฌ์—๊ฒŒ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ๋•Œ ์„ ํ˜ธ๋˜๋Š”(ํ•˜์ง€๋งŒ ํ•„์ˆ˜๋Š” ์•„๋‹Œ) ์š”๊ตฌ์‚ฌํ•ญ์„ ์•Œ๋ฆฐ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ด ๊ทœ์น™์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ถฉ์กฑ์‹œํ‚ค๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ, ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์–ด๋„ ํŒŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋  ์ˆ˜ ์žˆ๋‹ค.
      • ํŒŒ๋“œ์˜ ๋ฐฐ์น˜์— ๋” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์„ ํ˜ธ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ๊ทธ๋Ÿฌํ•œ ๋…ธ๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋…ธ๋“œ์—๋„ ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ด ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ์šฐ์„ ์ ์œผ๋กœ ์Šค์ผ€์ค„๋˜์ง€๋งŒ, ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์–ด๋„ ํŒŒ๋“œ๋Š” ์Šค์ผ€์ค„๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์š”์•ฝํ•˜์ž๋ฉด, requiredDuringSchedulingIgnoredDuringExecution์€ ํŒŒ๋“œ์˜ ์Šค์ผ€์ค„๋ง์— ์žˆ์–ด์„œ ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ์—„๊ฒฉํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•˜๋Š” ๋ฐ˜๋ฉด, preferredDuringSchedulingIgnoredDuringExecution์€ ์„ ํ˜ธ๋˜๋Š” ์กฐ๊ฑด์„ ์ •์˜ํ•˜์ง€๋งŒ, ์ด ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š๋”๋ผ๋„ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋  ์ˆ˜ ์žˆ๋„๋ก ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๋…ธ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ:

    • ํŠน์ • ๋…ธ๋“œ์˜ ์†์„ฑ์ด๋‚˜ ๋ผ๋ฒจ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ํŒŒ๋“œ๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ€๋ฆฌ ๋ฐฐ์น˜ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋…ธ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋Š” ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ๋ฐ˜๋Œ€์˜ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • ์˜ˆ์ œ : ์ด ์˜ˆ์ œ์—์„œ requiredDuringSchedulingIgnoredDuringExecution์€ disktype์ด hdd๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋„๋ก ์š”๊ตฌํ•œ๋‹ค. ์ฆ‰, SSD ๋˜๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๊ฐ€ ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, preferredDuringSchedulingIgnoredDuringExecution ์„ค์ •์€ cpu๊ฐ€ high๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๋ฅผ ์„ ํ˜ธํ•˜์ง€๋งŒ, ์ด๋Š” ํ•„์ˆ˜ ์กฐ๊ฑด์ด ์•„๋‹ค. weight๋Š” ์ด ์„ ํ˜ธ๋„์˜ ์ค‘์š”์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: disktype
                    operator: NotIn
                    values:
                      - hdd
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              preference:
                matchExpressions:
                  - key: cpu
                    operator: NotIn
                    values:
                      - high
      containers:
        - name: mycontainer
          image: myimage
  • ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ:

    • ๋‹ค๋ฅธ ํŒŒ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ๊ทœ์น™์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • ์—ญ์‹œ ํ•˜๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์†Œํ”„ํŠธ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹ค๋ฅธ ํŒŒ๋“œ์™€ ๊ฐ€๊น๊ฒŒ ๋ฐฐ์น˜๋˜๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์˜ˆ์ œ : requiredDuringSchedulingIgnoredDuringExecution ์˜ˆ์ œ์—์„œ, mypod๋Š” app=database ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ํŒŒ๋“œ์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ(kubernetes.io/hostname)์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•œ๋‹ค.
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - database
              topologyKey: "kubernetes.io/hostname"
        containers:
          - name: mycontainer
            image: myimage
  • ํŒŒ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ:

    • ํŒŒ๋“œ๋ฅผ ํŠน์ • ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ํŒŒ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ€๋ฆฌ ๋ฐฐ์น˜ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์˜ˆ์ œ : requiredDuringSchedulingIgnoredDuringExecution ์˜ˆ์ œ์—์„œ, mypod๋Š” app=webserver ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ํŒŒ๋“œ์™€๋Š” ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ(kubernetes.io/hostname)์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•œ๋‹ค.
    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - webserver
              topologyKey: "kubernetes.io/hostname"
        containers:
          - name: mycontainer
            image: myimage
  1. ํ…Œ์ธํŠธ & ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(Taints & Toleration):

    • ํ…Œ์ธํŠธ๋Š” ํŠน์ • ๋…ธ๋“œ์— ์ ์šฉ๋˜์–ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ๊ฐ–์ง€ ์•Š๋Š” ํŒŒ๋“œ๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค.
    • ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์€ ํ…Œ์ธํŠธ๊ฐ€ ์ ์šฉ๋œ ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋ง๋  ์ˆ˜ ์žˆ๋„๋ก ํŒŒ๋“œ์— ์„ค์ •ํ•œ๋‹ค.
    • ํ…Œ์ธํŠธ ์ ์šฉ ์˜ˆ์ œ:
      kubectl taint nodes ๋…ธ๋“œ์ด๋ฆ„ ํ‚ค=๊ฐ’:ํšจ๊ณผ
      
    • ํ†จ๋Ÿฌ๋ ˆ์ด์…˜ ์„ค์ • ์˜ˆ์ œ:
      tolerations:
        - key: "key"
          operator: "Equal"
          value: "value"
          effect: "NoSchedule"
  2. ์ปค๋“ (Cordon):

    • ํŠน์ • ๋…ธ๋“œ๋ฅผ ์Šค์ผ€์ค„ ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • ์˜ˆ์ œ ๋ช…๋ น์–ด:
      kubectl cordon ๋…ธ๋“œ์ด๋ฆ„
      
  3. ๋“œ๋ ˆ์ธ(Drain):

    • ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ์ถ”๋ฐฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋˜๋Š” ๋…ธ๋“œ ํ๊ธฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • PodDisruptionBudgets๋ฅผ ์กด์ค‘ํ•˜๋ฉฐ --ignore-daemonsets=true ์˜ต์…˜์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ DaemonSet์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ํŒŒ๋“œ๋Š” ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์˜ˆ์ œ ๋ช…๋ น์–ด:
      kubectl drain ๋…ธ๋“œ์ด๋ฆ„
      

Reference


11. Kubernetes Security

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”Œ๋žซํผ์ด๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋ณด์•ˆ

  • API ์„œ๋ฒ„ ๋ณด์•ˆ: API ์„œ๋ฒ„๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ•ต์‹ฌ์ด๋ฉฐ, ์ ์ ˆํ•œ ์ธ์ฆ, ์Šน์ธ ๋ฐ ์ธ๊ฐ€๋ฅผ ํ†ตํ•ด ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋…ธ๋“œ ๋ณด์•ˆ: ๋…ธ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ผ๋ถ€์ด๋ฉฐ, ์ด๋“ค์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์—„๊ฒฉํ•˜๊ฒŒ ํ†ต์ œ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์ •์ฑ…: ํŒŒ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋ณด์•ˆ

  • ์ด๋ฏธ์ง€ ๋ณด์•ˆ: ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋Š” ์ทจ์•ฝ์ ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฏธ์ง€ ์Šค์บ๋‹ ๋ฐ ์„œ๋ช…์„ ํ†ตํ•ด ๋ณด์•ˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ: ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์„œ๋น„์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํžŒ๋‹ค.
  • ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ: ์ปจํ…Œ์ด๋„ˆ์˜ ๊ถŒํ•œ๊ณผ ๋Šฅ๋ ฅ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ‘๊ทผ ์ œ์–ด

์ ‘๊ทผ์ œ์–ด๋Š” K8S(API ์ ‘๊ทผ) ์ธ์ฆ/์ธ๊ฐ€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

์ธ์ฆ(Authentication)
  • X.509 Client Certs: kubeconfig ์— CA crt(๋ฐœ๊ธ‰ ๊ธฐ๊ด€ ์ธ์ฆ์„œ) , Client crt(ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ) , Client key(ํด๋ผ์ด์–ธํŠธ ๊ฐœ์ธํ‚ค) ๋ฅผ ํ†ตํ•ด ์ธ์ฆ
  • kubectl: ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ(kubeconfig)๋ฅผ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ - contexts ์— ํด๋Ÿฌ์Šคํ„ฐ์™€ ์œ ์ € ๋ฐ ์ธ์ฆ์„œ/ํ‚ค ์ฐธ๊ณ 
  • Service Account: ๊ธฐ๋ณธ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ(default) - ์‹œํฌ๋ฆฟ(CA crt ์™€ token)
์ธ๊ฐ€(Authorization)
  • ์ธ๊ฐ€ ๋ฐฉ์‹ : RBAC(Role, RoleBinding), ABAC, Webhook, Node Authorization
  • RBAC : ์—ญํ•  ๊ธฐ๋ฐ˜์˜ ๊ถŒํ•œ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž์™€ ์—ญํ• ์„ ๋ณ„๊ฐœ๋กœ ์„ ์–ธ ํ›„ ๋‘๊ฐ€์ง€๋ฅผ ์กฐํ•ฉ(binding)ํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์—ฌ kubectl or API๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
    • Namespace/Cluster - Role/ClusterRole, RoleBinding/ClusterRoleBinding, Service Account
    • Role(๋กค) - (RoleBinding ๋กค ๋ฐ”์ธ๋”ฉ) - Service Account(์„œ๋น„์Šค ์–ด์นด์šดํŠธ) : ๋กค ๋ฐ”์ธ๋”ฉ์€ ๋กค๊ณผ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ์—ฐ๊ฒฐ
    • Role(๋„ค์ž„์ŠคํŽ˜์ด์Šค๋‚ด ์ž์›์˜ ๊ถŒํ•œ) vs ClusterRole(ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€์˜ ์ž์›์˜ ๊ถŒํ•œ)

๊ฐ์‚ฌ ๋ฐ ๋กœ๊น…

  • ๊ฐ์‚ฌ ๋กœ๊ทธ: ๋ณด์•ˆ ์‚ฌ๊ณ  ์กฐ์‚ฌ๋ฅผ ์œ„ํ•ด ์ค‘์š”ํ•œ ํ™œ๋™์„ ๊ฐ์‚ฌ ๋กœ๊ทธ์— ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค.
  • ๋กœ๊น…: ์‹œ์Šคํ…œ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋Š” ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘ ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ•„์ˆ˜์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์˜ˆ์‹œ1: Network Policy ์ ์šฉ

์ด ์˜ˆ์—์„œ๋Š” Network Policy ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 3306
  • ํ•ด๋‹น ์ •์ฑ…์€ ํ”„๋ŸฐํŠธ์—”๋“œ ํŒŒ๋“œ(role: frontend)๋งŒ TCP ํฌํŠธ 3306์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ๋“œ(role: db)๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•œ๋‹ค.

์˜ˆ์‹œ 2: ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด(RBAC)

์ด ์˜ˆ์—์„œ๋Š” ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ Pod์— ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์—ญํ• ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
  - kind: User
    name: "example-user"
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

์˜ˆ์‹œ 3: ํŒŒ๋“œ ๋ณด์•ˆ ์ •์ฑ…

์ด ์˜ˆ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฃจํŠธ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํŒŒ๋“œ ๋ณด์•ˆ ์ •์ฑ…์„ ๋ณด์—ฌ์ค€๋‹ค.

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: non-root-psp
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  runAsUser:
    rule: MustRunAsNonRoot
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
    - "*"

Reference


12. Operator๋ž€? (With Kubernetes)

Kubernetes ์ƒํƒœ๊ณ„์—์„œ Operator๋Š” Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŒจํ‚ค์ง•, ๋ฐฐํฌ, ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Kubernetes์— ๋ฐฐํฌ๋˜๊ณ  Kubernetes API ๋ฐ kubectl ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ๋œ๋‹ค. Operator๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•œ ๋‹ค์Œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์š”์ฒญํ•˜๋Š” ๋ฃจํ”„์ธ ์ปจํŠธ๋กค๋Ÿฌ์˜ Kubernetes ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค. Operator๋Š” Kubernetes๋ฅผ ํ™•์žฅํ•˜์—ฌ ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•œ๋‹ค.

๊ฐœ๋… ๋ฐ ์ž‘๋™ ๋ฐฉ์‹

Operator๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋„๋ฉ”์ธ๋ณ„ ์ง€์‹์ด ๋‚ด์žฅ๋œ ๋งž์ถคํ˜• ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค. ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌ, ์—…๊ทธ๋ ˆ์ด๋“œ, ๊ตฌ์„ฑ, ๋ณต๊ตฌ ๋ฐ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค. Operator ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ , ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๊ณ , Kubernetes ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์šด์˜ ์ง€์‹์„ ํฌ์ฐฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

Operator๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์„ธํŠธ(Custom Resource)์™€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค๋Ÿฌ(Custom Controllers)๋กœ ๊ตฌํ˜„๋œ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ ์Šคํ‚ค๋งˆ ์—ญํ• ์„ ํ•˜๋ฉฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์— ์„ค๋ช…๋œ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ์ผ์น˜ํ•˜๋„๋ก ์ž‘๋™ํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค(Custom Resource): ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์œ ํ˜• ์ƒ์„ฑ์„ ํ—ˆ์šฉํ•˜๋„๋ก Kubernetes API๋ฅผ ํ™•์žฅํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋Š” ์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค๋Ÿฌ(Custom Controllers): ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ์ƒํƒœ๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์— ์ •์˜๋œ ์›ํ•˜๋Š” ์ƒํƒœ์™€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋ฉด ์ฐจ์ด์ ์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•œ๋‹ค.

์ˆ˜๋ช…์ฃผ๊ธฐ(lifecycle) ๊ด€๋ฆฌ

Operator๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Kubernetes์˜ control loop ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์›ํ•˜๋Š” ์ƒํƒœ์™€์˜ ๋ถˆ์ผ์น˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ ์กฐ์น˜๋ฅผ ์ทจํ•œ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๋ฐ ์ž ์žฌ์ ์ธ ์ง€์› ์„œ๋น„์Šค ์ž๋™ ๋ฐฐํฌ
  • ๋ณต์žกํ•œ ์ƒํƒœ ์ €์žฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํฌํ•จํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ ๋ฐ ๋น„๋ฐ€ ๊ด€๋ฆฌ
  • ๋กœ๋“œ ๋˜๋Š” ๊ธฐํƒ€ ์ง€ํ‘œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ํ™•์žฅ
  • ์˜ค๋ฅ˜ ๋ณต๊ตฌ, ๋น„์ •์ƒ ์ธ์Šคํ„ด์Šค ์ž๋™ ๊ต์ฒด ๋˜๋Š” ์žฌ๊ตฌ์„ฑ
  • ๋ฐฑ์—… ๋ฐ ๋ณต์›

์˜คํผ๋ ˆ์ดํ„ฐ ๊ฐœ๋ฐœ

์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋„๊ตฌ๋“ค์ด ์žˆ๋‹ค.

  • ์˜คํผ๋ ˆ์ดํ„ฐ SDK(Operator SDK): ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ํŒจํ‚ค์ง•์„ ๋„์™€์ค€๋‹ค.
  • ์˜คํผ๋ ˆ์ดํ„ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ์ž(Operator Lifecycle Manager) (OLM): ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์˜ ์˜คํผ๋ ˆ์ดํ„ฐ๋“ค์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ์„ค์น˜, ์—…๋ฐ์ดํŠธ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
  • ์˜คํผ๋ ˆ์ดํ„ฐ ๋ฏธํ„ฐ๋ง(Operator Metering): ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ž์›์— ๋Œ€ํ•œ ๋ณด๊ณ ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

13. Kuberntes Service Account๋ž€?

๋จผ์ € ๊ฐ„๋‹จํ•˜๊ฒŒ User Account์™€ Service Account์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, ์‚ฌ์šฉ์ž ์–ด์นด์šดํŠธ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” ํŒŒ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

Kubernetes Service Account๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ํŒŸ(Pod)์ด API ์„œ๋ฒ„์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž๊ฒฉ์ฆ๋ช…์ด๋‹ค. ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace)์— ์†ํ•˜๋ฉฐ, ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์‹œ ๋””ํดํŠธ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ฃผ์˜

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.24 ๋ฒ„์ „ ์ด์ „์—๋Š” ์„œ๋น„์Šค ๊ณ„์ •์ด ์ตœ์ดˆ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.24 ๋ฒ„์ „ ์ดํ›„, ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์„œ๋น„์Šค ๊ณ„์ •์ด ์ƒ์„ฑ๋˜์–ด๋„ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Service Account ์ฃผ์š” ์š”์†Œ

  • ServiceAccount admission ์ปจํŠธ๋กค๋Ÿฌ: ServiceAccount admission ์ปจํŠธ๋กค๋Ÿฌ๋Š” default Service account๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ Pod์— ํ• ๋‹นํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. api-server์— ํฌํ•จ๋œ๋‹ค.
  • ServiceAccount Token ์ปจํŠธ๋กค๋Ÿฌ: Token ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ServiceAccount์— ๋Œ€ํ•œ ํ† ํฐ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. controller-manager์— ํฌํ•จ๋œ๋‹ค.
  • ServiceAccount ์ปจํŠธ๋กค๋Ÿฌ: ServiceAccount ์ปจํŠธ๋กค๋Ÿฌ๋Š” ServiceAccount ๋ฐ ๊ด€๋ จ Secret ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. controller-manager์— ํฌํ•จ๋œ๋‹ค.

Service Account Secret ์ฃผ์š” ์š”์†Œ

  • Token: ํ† ํฐ์€ ์„œ๋น„์Šค ๊ณ„์ •์„ ๋Œ€์‹ ํ•˜์—ฌ Kubernetes API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” JWT(JSON ์›น ํ† ํฐ)์ด๋‹ค. ์ด ํ† ํฐ์€ Kubernetes API ์„œ๋ฒ„์˜ ๊ฐœ์ธ ํ‚ค๋กœ ์„œ๋ช…๋˜๋ฉฐ ํ•ด๋‹น ๊ณต๊ฐœ ํ‚ค(ca.crt์— ์žˆ๋Š”)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ† ํฐ์—๋Š” ํ•ด๋‹น ์ด๋ฆ„ ๋ฐ ์†ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๊ฐ™์€ ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  • ca.crt: ca.crt ํŒŒ์ผ์—๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ธ์ฆ ๊ธฐ๊ด€(CA) ์ธ์ฆ์„œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์š”์ฒญ์„ ํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ์™€ API ์„œ๋ฒ„ ๊ฐ„์˜ ์‹ ๋ขฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.ํด๋ผ์ด์–ธํŠธ๋Š” ์ด CA ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๊ฐ€ ์œ ํšจํ•˜๊ณ  ๋™์ผํ•œ CA์—์„œ ์„œ๋ช…ํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•…์˜์ ์ธ ํ–‰์œ„์ž๊ฐ€ ์•„๋‹Œ ์ธ์ฆ๋œ API ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Namespace: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” Kubernetes์˜ ๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ํŒ€์ด๋‚˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference


14. Kubernetes Custom Resource Definitions (CRDs)๋ž€?

Kubernetes ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜(CRD)๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋กœ Kubernetes ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. CRD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋“œ, ๋ฐฐํฌ ๋˜๋Š” ์„œ๋น„์Šค์™€ ๊ฐ™์€ ํ‘œ์ค€ Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ๊ณ ์œ ํ•œ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Kubernetes ํ”Œ๋žซํผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งž์ถคํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ํ†ตํ•ฉ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค(Custom Resource)๋ž€?

์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋Š” ๊ธฐ๋ณธ Kubernetes ์„ค์น˜์—์„œ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹Œ Kubernetes API์˜ ํ™•์žฅ์ด๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฆฌ์†Œ์Šค ์™ธ์— ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ Kubernetes๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

CRD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

  • ํ™•์žฅ์„ฑ(Extensibility): kubectl ๋ฐ ๊ธฐํƒ€ Kubernetes API ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด API๋กœ Kubernetes๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์œ ์—ฐ์„ฑ(Flexibility): ๊ธฐ๋ณธ Kubernetes ๋ฆฌ์†Œ์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ†ตํ•ฉ(Integration): CRD๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์ปจํŠธ๋กค๋Ÿฌ์ธ ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

CRD๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ?

CRD๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ Kubernetes ๋ฆฌ์†Œ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ YAML์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•œ๋‹ค. ์ด ์ •์˜๋Š” ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋ฆฌ์†Œ์Šค, ํ•ด๋‹น ์ด๋ฆ„ ๋ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” CRD(์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ผ๊ณ ๋„ ํ•จ) ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

CRD ์ •์˜์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # Name of the CRD
  name: crdtype.mycompany.com
spec:
  # Group name to which the CRD belongs
  group: mycompany.com
  # List of versions
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                myField:
                  type: string
  # Scope of the CRD (Namespaced or Cluster)
  scope: Namespaced
  names:
    # Plural name used in the URL
    plural: crdtypes
    # Singular name used as an alias
    singular: crdtype
    # Kind is the serialized kind of the resource
    kind: CrdType
    # ShortNames allow shorter string to match your resource on kubectl
    shortNames:
      - ct

๋ผ์ดํ”„์‚ฌ์ดํด ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ(Lifecycle and Controllers)

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ CRD๋ฅผ ์ •์˜ํ•˜๊ณ  ์ ์šฉํ•œ ํ›„์—๋Š” Kubernetes์˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค์˜ ๊ธฐ๋ณธ ์˜ˆ์ด๋‹ค.

apiVersion: mycompany.com/v1
kind: CrdType
metadata:
  name: example-crdtype
spec:
  myField: "Hello, world!"
  • ์ผ๋ฐ˜์ ์œผ๋กœ CRD๋Š” CRD ์ž์ฒด์™€ ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ตฌ์„ฑ๋œ ์—ฐ์‚ฐ์ž์˜ ์ผ๋ถ€์ด๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค์™€ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์ด์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ ๋˜๋Š” ์กฐ์ •ํ•˜์—ฌ ๋ฐ˜์‘ํ•œ๋‹ค.

๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ๊ณ ๋ ค ์‚ฌํ•ญ

  • ๋ฒ„์ „ ๊ด€๋ฆฌ(Versioning): ๊ธฐ์กด ๋ฆฌ์†Œ์Šค์— ์ง€์žฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก CRD์˜ ๋ฒ„์ „์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ์ง€์› ์ค‘๋‹จ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
  • ๊ฒ€์ฆ(Validation): CRD ์ •์˜์˜ OpenAPI ์Šคํ‚ค๋งˆ ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  Kubernetes API์— ์ €์žฅ๋˜๊ธฐ ์ „์— ๊ธฐ๋Œ€์น˜๋ฅผ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ์„ฑ๋Šฅ(Performance): ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ฃผ์‹œํ•œ๋‹ค.

15. Kubernetes Garbage Collection (GC)๋ž€?

Kubernetes GC(Garbage Collection)๋Š” ์ฃผ๋กœ ํŒŒ๋“œ, ์ปจํ…Œ์ด๋„ˆ, ์ด๋ฏธ์ง€ ๋ฐ ๊ธฐํƒ€ Kubernetes ๋ฆฌ์†Œ์Šค์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. Kubernetes์—๋Š” 3๊ฐ€์ง€ ์ฃผ์š” ์œ ํ˜•์˜ Garbage Collection์ด ์žˆ๋‹ค.

  • Garbage Collection of Pods and Controllers
  • Container Image Garbage Collection
  • Resource Finalizers

Kubernetes Garbage Collection Workflow

flowchart TB
    api["API Server"] -- "Receives Updates and Watches" --> ct["Controller"]
    ct -- "Manages Resources" --> rs["ReplicaSet, Deployments, etc."]
    rs -- "Owns" --> pods["Pods"]

    ct -- "Detects Deletions & Updates" --> gc["Garbage Collector"]
    gc -- "Removes Orphans" --> pods

    kubelet["Kubelet"] -- "Manages Pod Lifecycle" --> node["Node"]
    kubelet -- "Performs Image GC" --> img["Container Images"]
Loading

16. Kubernetes Graceful Shutdown

Kubernetes์—์„œ Graceful Shutdown(์•ˆ์ „ํ•œ ์ข…๋ฃŒ)์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜๊ณผ SIGTERM, SIGKILL ์‹ ํ˜ธ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ํ•œ ์ž์› ๊ด€๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • terminationGracePeriodSeconds
  • Prestop
  • SIGTERM
  • SIGKILL

terminationGracePeriodSeconds

Pod๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ Kubernetes๊ฐ€ ํ•ด๋‹น Pod์— SIGTERM ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ณ , ์‹ค์ œ๋กœ Pod๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ(SIGKILL)ํ•˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์œ ์˜ˆ ์‹œ๊ฐ„(Grace Period) ์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์ฆ‰, SIGTERM์„ ๋ฐ›์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋„๋ก ์œ ์˜ˆ ์‹œ๊ฐ„์„ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’์€ 30์ดˆ ์ด๋ฉฐ, ์ด ์‹œ๊ฐ„ ๋™์•ˆ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด Kubernetes๋Š” ๊ฐ•์ œ๋กœ SIGKILL์„ ๋ณด๋‚ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
  • ์ด ์„ค์ •์„ ํ†ตํ•ด ์„œ๋น„์Šค๊ฐ€ ์š”์ฒญ ์ค‘๋‹จ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ฆฌ ์ž‘์—…(์˜ˆ: ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ, ์ƒํƒœ ์ €์žฅ)์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
spec:
  terminationGracePeriodSeconds: 60 # Pod๊ฐ€ SIGKILL์„ ๋ฐ›๊ธฐ ์ „์— 60์ดˆ์˜ ์œ ์˜ˆ ์‹œ๊ฐ„์„ ์คŒ

preStop Hook

preStop์€ Pod๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” Kubernetes์˜ Lifecycle Hook์ด๋‹ค. Pod๊ฐ€ SIGTERM ์‹ ํ˜ธ๋ฅผ ๋ฐ›์„ ๋•Œ ์ด preStop ํ›…์ด ๋จผ์ € ์‹คํ–‰๋˜๊ณ , ์„ค์ •๋œ ๋™์ž‘์ด ๋๋‚œ ํ›„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

  • ์ด ํ›…์„ ์‚ฌ์šฉํ•ด ์ข…๋ฃŒ ์ „์— ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์™ธ๋ถ€ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๊ฑฐ๋‚˜ ๋กœ๊ทธ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • preStop์€ SIGTERM ์‹ ํ˜ธ๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋ฉฐ, ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Graceful Shutdown์„ ์ง„ํ–‰ํ•œ๋‹ค.
lifecycle:
  preStop:
    exec:
      command: ["/bin/sh", "-c", "sleep 10"] # ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์ „ 10์ดˆ ๋Œ€๊ธฐ
  • preStop ํ›…์„ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์ „์— 10์ดˆ ๋Œ€๊ธฐํ•˜๋„๋ก ํ•˜๊ณ , ์ดํ›„์— SIGTERM์ด ๋ฐœ์ƒํ•œ ํ›„ terminationGracePeriodSeconds ๋™์•ˆ ์ •๋ฆฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

SIGTERM (Terminate Signal)

  • SIGTERM์€ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค์— ์ •์ƒ์ ์ธ ์ข…๋ฃŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์‹ ํ˜ธ์ด๋‹ค.
  • Graceful Shutdown์„ ์ง€์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด ์‹ ํ˜ธ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์—ด๋ ค ์žˆ๋Š” ์—ฐ๊ฒฐ์„ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Kubernetes์—์„œ๋Š” Pod๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ SIGTERM์„ ๋จผ์ € ๋ณด๋‚ธ๋‹ค. ์ด ์‹ ํ˜ธ๋ฅผ ๋ฐ›์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…๋ฃŒ๋ฅผ ์œ„ํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

SIGKILL (Kill Signal)

  • SIGKILL์€ ๊ฐ•์ œ ์ข…๋ฃŒ ์‹ ํ˜ธ๋กœ, ํ”„๋กœ์„ธ์Šค๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฆ‰์‹œ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
  • ์ด ์‹ ํ˜ธ๋Š” ๊ฐ•์ œ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๋ฏ€๋กœ ์ •๋ฆฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์†์‹ค์ด๋‚˜ ์—ฐ๊ฒฐ ๋Š๊น€์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Kubernetes์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ terminationGracePeriodSeconds ๋™์•ˆ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด SIGKILL์„ ๋ณด๋‚ด ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

Graceful Shutdown ํ๋ฆ„ ์š”์•ฝ

  1. Pod ์ข…๋ฃŒ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉด Kubernetes๋Š” ๋จผ์ € ํ•ด๋‹น Pod์— SIGTERM ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ๋‹ค.
  2. preStop ํ›…์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ›…์ด ์‹คํ–‰๋˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ SIGTERM ์‹ ํ˜ธ๊ฐ€ ์ฒ˜๋‚ธ๋  ์ค€๋น„๋ฅผ ํ—Œ๋‹ค.
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ terminationGracePeriodSeconds ๋‚ด์— SIGTERM ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  4. terminationGracePeriodSeconds ๋‚ด์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด Kubernetes๋Š” SIGKILL์„ ๋ณด๋‚ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•œ๋‹ค.
graph LR
    A[Pod termination request] --> B[SIGTERM sent to Pod]
    B --> C{preStop hook defined?}
    C -- Yes --> D[Execute preStop hook]
    D --> E[SIGTERM signal handled by application]
    C -- No --> E
    E --> F[Graceful shutdown within terminationGracePeriodSeconds]
    F -->|Success| G[Pod terminates cleanly]
    F -->|Timeout| H[SIGKILL sent to force termination]
Loading

17. Kubernetes imagePullPolicy

Kubernetes์—์„œ imagePullPolicy ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์„ค์ •์ด๋‹ค. ์ด๋Š” Pod ์‚ฌ์–‘์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋˜๋ฉฐ Kubernetes๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๋กœ์ปฌ๋กœ ์บ์‹œ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ์„ธ ๊ฐ€์ง€ ์ฃผ์š” imagePullPolicy ๊ฐ’์ด ์žˆ๋‹ค.

  • Always
  • IfNotPresent
  • Never

Always

  • Kubernetes๋Š” Pod๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€๊ฐ€ ์ด๋ฏธ ๋…ธ๋“œ์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ํ•ญ์ƒ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ์ด๋Š” ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค(์˜ˆ: ์ง€์†์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด 'latest' ํƒœ๊ทธ ๋˜๋Š” 'fixed tag'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ).

IfNotPresent

  • Kubernetes๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋…ธ๋“œ์— ์•„์ง ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ๋กœ์ปฌ ์บ์‹œ์— ์žˆ์œผ๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”๋‹ค์˜จ
  • ํŠน์ • ์ด๋ฏธ์ง€ ํƒœ๊ทธ(latest ์ œ์™ธ)๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ •์ฑ…์ด๋‹ค. ๋™์ผํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋…ธ๋“œ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„๊ณผ ๋Œ€์—ญํญ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

Never

  • Kubernetes๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉฐ ์ด๋ฏธ์ง€๊ฐ€ ๋…ธ๋“œ์— ์ด๋ฏธ ์กด์žฌํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•œ๋‹ค.
  • ์ด๋Š” ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋Š” ํ™˜๊ฒฝ์ด๋‚˜ ์™ธ๋ถ€ ์†Œ์Šค์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

๊ธฐ๋ณธ ์„ค์ •

  • ์ตœ์‹  ํƒœ๊ทธ ์‚ฌ์šฉ: ์ตœ์‹  ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Kubernetes๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ํ’€์ •์ฑ…์„ Always ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  • ๋‹ค๋ฅธ ํƒœ๊ทธ ํฌํ•จ: ์ตœ์‹  ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋ฉด Kubernetes๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ IfNotPresent ๋กœ ์„ค์ •๋œ๋‹ค.

18. Kubernetes Deployment Strategy

Kubernetes์—์„œ ๋ฐฐํฌ ์ „๋žต(deployment strategies) ์€ ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ„์ „ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐํฌํ•  ๋•Œ, Pod(๋˜๋Š” Pod ์ง‘ํ•ฉ)๋ฅผ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ• ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ฐฐํฌ ์ „๋žต์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค.

  • RollingUpdate (๊ธฐ๋ณธ ์ „๋žต)
  • Recreate

RollingUpdate (๊ธฐ๋ณธ๊ฐ’)

  • RollingUpdate๋Š” Kubernetes์˜ ๊ธฐ๋ณธ๊ฐ’์ด์ž ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ „๋žต์ด๋‹ค. ๋ฐฐํฌ ๋‚ด์˜ Pod์„ ์ ์ง„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ
  • ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋™์•ˆ Kubernetes๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ Pod์„ ์ƒ์„ฑํ•˜๊ณ , ๋™์‹œ์— ์˜ค๋ž˜๋œ Pod์„ ์†Œ๊ทœ๋ชจ ๋ฐฐ์น˜๋กœ ์ข…๋ฃŒํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ผ๋ถ€ Pod์ด ๊ณ„์† ์‹คํ–‰๋˜๋ฏ€๋กœ ๋‹ค์šดํƒ€์ž„์ด ์ตœ์†Œํ™”
  • ์ด ์ „๋žต์€ ๊ณ ๊ฐ€์šฉ์„ฑ ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ƒ์ 
  • maxUnavailable: ์—…๋ฐ์ดํŠธ ์ค‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” Pod์˜ ์ตœ๋Œ€ ์ˆ˜(๋˜๋Š” ๋น„์œจ)๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, maxUnavailable: 25%๋Š” ์—…๋ฐ์ดํŠธ ์ค‘ ์ตœ๋Œ€ 25%์˜ Pod์ด ๋‹ค์šด๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ
  • maxSurge: ์›ํ•˜๋Š” ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์ž„์‹œ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ Pod์˜ ์ตœ๋Œ€ ์ˆ˜(๋˜๋Š” ๋น„์œจ)๋ฅผ ์ง€์ •ํ•ฉํ•œ. ์˜ˆ๋ฅผ ๋“ค์–ด, maxSurge: 1์€ ์—…๋ฐ์ดํŠธ ์ค‘ ์ž„์‹œ๋กœ ํ•˜๋‚˜์˜ ์ถ”๊ฐ€ Pod์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ
  • ์žฅ์ : ์ƒˆ๋กœ์šด Pod์„ ์ ์ง„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฐฐํฌํ•˜์—ฌ ์„œ๋น„์Šค ๋‹ค์šดํƒ€์ž„์ด ์—†๋‹ค.
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ์—…๋ฐ์ดํŠธ ์ค‘ ์—ฐ์†์ ์ธ ๊ฐ€์šฉ์„ฑ์ด ํ•„์š”ํ•œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ด์ƒ์ 
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1 # ์—…๋ฐ์ดํŠธ ์ค‘ ์ตœ๋Œ€ 1๊ฐœ์˜ Pod๊ฐ€ ๋‹ค์šด๋  ์ˆ˜ ์žˆ๋‹ค.
      maxSurge: 1 # ์—…๋ฐ์ดํŠธ ์ค‘ ์ž„์‹œ๋กœ 1๊ฐœ์˜ ์ถ”๊ฐ€ Pod์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

Recreate

  • Recreate ์ „๋žต์—์„œ๋Š” Kubernetes๊ฐ€ ๊ธฐ์กด Pod์„ ๋ชจ๋‘ ์‚ญ์ œํ•œ ํ›„ ์ƒˆ๋กœ์šด Pod์„ ์ƒ์„ฑ
  • ์ด ์ „๋žต์€ ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ๋ฐฐํฌ๋  ๋•Œ ์˜ค๋ž˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ
  • ์žฅ์ : ๋‹จ์ˆœํ•˜๊ณ  ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชจ๋‘ ์ข…๋ฃŒํ•œ ํ›„ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๊นจ๋—ํ•˜๊ฒŒ ๋ฐฐํฌ
  • ๋‹จ์ : ์ƒˆ๋กœ์šด Pod์ด ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  Pod์ด ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ๋‹ค์šดํƒ€์ž„์ด ๋ฐœ์ƒ
  • ์‚ฌ์šฉ ์‚ฌ๋ก€: ์งง์€ ๋‹ค์šดํƒ€์ž„์ด ํ—ˆ์šฉ๋˜๊ฑฐ๋‚˜ ์ด์ „ ๋ฒ„์ „์„ ์™„์ „ํžˆ ์ค‘์ง€ํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉ
spec:
  strategy:
    type: Recreate

19. Kubernetes Network Packet Flow (์™ธ๋ถ€ โ†’ ํด๋Ÿฌ์Šคํ„ฐ)

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์ด ์ „๋‹ฌ๋˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•˜๋ฉด ๋„คํŠธ์›Œํ‚น ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒจํ‚ท์ด ์™ธ๋ถ€์—์„œ Pod๊นŒ์ง€ ์ „๋‹ฌ๋˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์ž.

ํŒจํ‚ท ํ๋ฆ„ ๋‹จ๊ณ„

graph LR
    A[External Traffic] --> B[Ingress Controller / LoadBalancer]
    B --> C[Service ClusterIP]
    C --> D[kube-proxy iptables/IPVS]
    D --> E[CNI Network]
    E --> F[Pod Container Port]
    
    D -.DNAT.-> E
    E -.Overlay Network.-> F
Loading

1. ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ์ง„์ž…์ 

์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์€ ๋จผ์ € Ingress Controller ๋˜๋Š” LoadBalancer๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ง„์ž…ํ•œ๋‹ค.

  • Ingress Controller: HTTP/HTTPS ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์˜ˆ: NGINX Ingress, Traefik, HAProxy
  • LoadBalancer: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์ œ๊ณตํ•˜๋Š” ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ
    • ์˜ˆ: AWS ELB, GCP Load Balancer, Azure Load Balancer
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: my-app

2. Service ๊ฐ์ฒด๋กœ ์ „๋‹ฌ

ํŠธ๋ž˜ํ”ฝ์€ Service ๊ฐ์ฒด์˜ ClusterIP๋กœ ์ „๋‹ฌ๋œ๋‹ค.

  • ClusterIP๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ์  IP๊ฐ€ ์•„๋‹Œ **๊ฐ€์ƒ IP(Virtual IP)**์ด๋‹ค.
  • ์ด ๊ฐ€์ƒ IP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ, ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์— ํ• ๋‹น๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Service๋Š” Selector๋ฅผ ํ†ตํ•ด ๋งค์นญ๋˜๋Š” Pod๋“ค์„ ์ฐพ๊ณ , ์ด๋“ค์˜ IP๋ฅผ Endpoints ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

3. kube-proxy์— ์˜ํ•œ ํŒจํ‚ท ๋ผ์šฐํŒ…

kube-proxy๊ฐ€ ๊ฐ ๋…ธ๋“œ์—์„œ iptables ๋˜๋Š” IPVS ๊ทœ์น™์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, Service IP๋กœ ์˜ค๋Š” ํŒจํ‚ท์„ ์‹ค์ œ Pod IP๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

kube-proxy ๋™์ž‘ ๋ชจ๋“œ
  • iptables ๋ชจ๋“œ (๊ธฐ๋ณธ๊ฐ’):

    • Service IP๋ฅผ Pod IP๋กœ DNAT(Destination NAT) ๋ณ€ํ™˜
    • ๋žœ๋ค ๋ฐฉ์‹์œผ๋กœ Pod ์„ ํƒ
    • ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ
  • IPVS ๋ชจ๋“œ:

    • Linux ์ปค๋„์˜ IPVS(IP Virtual Server) ํ™œ์šฉ
    • ๋” ํšจ์œจ์ ์ธ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ œ๊ณต
    • ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ํ•ฉ
# kube-proxy ๋ชจ๋“œ ํ™•์ธ
kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode

# iptables ๊ทœ์น™ ํ™•์ธ (๋…ธ๋“œ์—์„œ ์‹คํ–‰)
sudo iptables -t nat -L -n | grep my-service

4. CNI๋ฅผ ํ†ตํ•œ Pod ๋„คํŠธ์›Œํฌ ์ „๋‹ฌ

CNI(Container Network Interface) ๊ฐ€ ๊ตฌ์„ฑํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น Pod์˜ Container ํฌํŠธ๋กœ ํŒจํ‚ท์ด ์ „๋‹ฌ๋œ๋‹ค.

CNI ์—ญํ• 
  • Pod์— IP ์ฃผ์†Œ ํ• ๋‹น
  • Pod ๊ฐ„ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ตฌ์„ฑ
  • ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy) ์ ์šฉ
์ฃผ์š” CNI ํ”Œ๋Ÿฌ๊ทธ์ธ
  • Calico: NetworkPolicy ์ง€์›, ํ™•์žฅ์„ฑ ์šฐ์ˆ˜
  • Flannel: ๊ฐ„๋‹จํ•œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ
  • Weave Net: ์•”ํ˜ธํ™” ์ง€์›
  • Cilium: eBPF ๊ธฐ๋ฐ˜, ๊ณ ์„ฑ๋Šฅ
# NetworkPolicy ์˜ˆ์ œ
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-frontend
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 8080

5. ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹  (Overlay Network)

Pod๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ๊ฒฝ์šฐ, Overlay ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

Overlay Network ๊ธฐ์ˆ 
  • VXLAN: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜ค๋ฒ„๋ ˆ์ด ํ”„๋กœํ† ์ฝœ
  • IPIP: IP-in-IP ํ„ฐ๋„๋ง
  • WireGuard: ์•”ํ˜ธํ™”๋œ ํ„ฐ๋„๋ง
# VXLAN ์ธํ„ฐํŽ˜์ด์Šค ํ™•์ธ
ip -d link show type vxlan

# CNI ์„ค์ • ํ™•์ธ
cat /etc/cni/net.d/10-calico.conflist

์ผ๋ฐ˜์ ์ธ ๋„คํŠธ์›Œํ‚น ๋ฌธ์ œ์™€ ๋””๋ฒ„๊น…

1. Service Endpoints ๋ฌธ์ œ

Service๊ฐ€ Selector์™€ ๋งค์นญ๋˜๋Š” Pod๊ฐ€ ์—†์œผ๋ฉด Endpoints๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•„ 503 ์—๋Ÿฌ ๋ฐœ์ƒ

# Endpoints ํ™•์ธ
kubectl get endpoints my-service

# Service์™€ Pod Selector ๋งค์นญ ํ™•์ธ
kubectl get pods -l app=my-app
2. NetworkPolicy๋กœ ์ธํ•œ ํ†ต์‹  ์ฐจ๋‹จ

NetworkPolicy ์„ค์ •์œผ๋กœ Pod ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค.

# NetworkPolicy ํ™•์ธ
kubectl get networkpolicies

# NetworkPolicy ์ƒ์„ธ ํ™•์ธ
kubectl describe networkpolicy allow-from-frontend
3. CNI ๋ฌธ์ œ

CNI ์žฅ์•  ์‹œ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

# CNI Pod ์ƒํƒœ ํ™•์ธ (Calico ์˜ˆ์‹œ)
kubectl get pods -n kube-system | grep calico

# CNI ๋กœ๊ทธ ํ™•์ธ
kubectl logs -n kube-system calico-node-xxxxx
4. kube-proxy ์žฅ์• 

kube-proxy ์žฅ์•  ์‹œ Service ๋ผ์šฐํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

# kube-proxy Pod ์ƒํƒœ ํ™•์ธ
kubectl get pods -n kube-system | grep kube-proxy

# kube-proxy ๋กœ๊ทธ ํ™•์ธ
kubectl logs -n kube-system kube-proxy-xxxxx

ํŒจํ‚ท ํ๋ฆ„ ๋””๋ฒ„๊น… ๋„๊ตฌ

# 1. Pod ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
kubectl exec -it my-pod -- curl http://my-service:80

# 2. DNS ํ™•์ธ
kubectl exec -it my-pod -- nslookup my-service

# 3. ๋„คํŠธ์›Œํฌ ์ถ”์  (tcpdump)
kubectl exec -it my-pod -- tcpdump -i any -n port 8080

# 4. Service ์ƒ์„ธ ์ •๋ณด
kubectl describe service my-service

# 5. Pod ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ํ™•์ธ
kubectl exec -it my-pod -- ip addr show

์ „์ฒด ํŒจํ‚ท ํ๋ฆ„ ์š”์•ฝ

  1. External Traffic โ†’ Ingress/LoadBalancer๋กœ ์ง„์ž…
  2. Ingress/LoadBalancer โ†’ Service ClusterIP๋กœ ๋ผ์šฐํŒ…
  3. Service (Virtual IP) โ†’ kube-proxy๊ฐ€ ์ธ์‹
  4. kube-proxy โ†’ iptables/IPVS ๊ทœ์น™์œผ๋กœ Pod IP๋กœ DNAT ๋ณ€ํ™˜
  5. CNI Network โ†’ Pod๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋กœ ํŒจํ‚ท ์ „๋‹ฌ (ํ•„์š”์‹œ Overlay Network)
  6. Pod Container Port โ†’ ์ตœ์ข… ๋ชฉ์ ์ง€ ๋„์ฐฉ

์ด ํ๋ฆ„์„ ์ดํ•ดํ•˜๋ฉด Kubernetes ๋„คํŠธ์›Œํ‚น ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference



Q22. Pod ์žฅ์•  ์ƒํƒœ(ImagePullBackOff, ErrImagePull, CrashLoopBackOff)์˜ ์›์ธ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜์„ธ์š”.

์งˆ๋ฌธ: Kubernetes์—์„œ Pod๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฃผ์š” ์žฅ์•  ์ƒํƒœ์ธ ImagePullBackOff, ErrImagePull, CrashLoopBackOff, CreateContainerConfigError์˜ ์›์ธ๊ณผ ๋™์ž‘ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜์„ธ์š”.

๋‹ต๋ณ€:

Pod ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ์žฅ์•  ์ƒํƒœ

Pod๋Š” ์ƒ์„ฑ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค:

Pending โ†’ ContainerCreating โ†’ Running โ†’ Succeeded/Failed
   โ†“           โ†“                  โ†“
์—๋Ÿฌ ์ƒํƒœ๋“ค ๋ฐœ์ƒ ๊ฐ€๋Šฅ

์ฃผ์š” ์žฅ์•  ์ƒํƒœ๋Š” kubelet์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.


1. ImagePullBackOff / ErrImagePull

์›์ธ: ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ๋ชปํ•  ๋•Œ ๋ฐœ์ƒ

๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ (์ž˜๋ชป๋œ ์ด๋ฏธ์ง€ ์ด๋ฆ„/ํƒœ๊ทธ)
  • Private Registry ์ธ์ฆ ์‹คํŒจ
  • ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Rate Limit ์ดˆ๊ณผ (DockerHub ๋ฌด๋ฃŒ ๊ณ„์ •)

๋™์ž‘ ๋ฐฉ์‹:

1. kubelet์ด CRI์— ์ด๋ฏธ์ง€ Pull ์š”์ฒญ
2. CRI๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ด๋ฏธ์ง€ ์š”์ฒญ
3. ์‹คํŒจ ์‹œ ErrImagePull ์ƒํƒœ
4. kubelet์ด ์žฌ์‹œ๋„ (exponential backoff)
5. ๊ณ„์† ์‹คํŒจ ์‹œ ImagePullBackOff ์ƒํƒœ๋กœ ์ „ํ™˜
6. ์žฌ์‹œ๋„ ๊ฐ„๊ฒฉ: 10s โ†’ 20s โ†’ 40s โ†’ 80s โ†’ 160s (์ตœ๋Œ€ 5๋ถ„)

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…:

# 1. Pod ์ƒํƒœ ํ™•์ธ
kubectl describe pod my-pod
# Events ์„น์…˜์—์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ™•์ธ:
# "Failed to pull image "nginx:invalidtag": rpc error: code = NotFound"

# 2. ์ด๋ฏธ์ง€ ์ด๋ฆ„/ํƒœ๊ทธ ํ™•์ธ
kubectl get pod my-pod -o jsonpath='{.spec.containers[*].image}'

# 3. ImagePullSecrets ํ™•์ธ (Private Registry)
kubectl get pod my-pod -o jsonpath='{.spec.imagePullSecrets}'

# 4. Secret ํ™•์ธ
kubectl get secret my-registry-secret -o yaml

# 5. ์ง์ ‘ ์ด๋ฏธ์ง€ Pull ํ…Œ์ŠคํŠธ (๋…ธ๋“œ์—์„œ)
# ํ•ด๋‹น ๋…ธ๋“œ์— SSH ์ ‘์† ํ›„
sudo crictl pull docker.io/library/nginx:latest

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# ๋ฐฉ๋ฒ• 1: ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์ง€์ •
spec:
  containers:
  - name: app
    image: nginx:1.21  # ์กด์žฌํ•˜๋Š” ํƒœ๊ทธ ์‚ฌ์šฉ

---
# ๋ฐฉ๋ฒ• 2: Private Registry ์ธ์ฆ (Secret ์ƒ์„ฑ)
kubectl create secret docker-registry my-registry-secret \
  --docker-server=gcr.io \
  --docker-username=_json_key \
  --docker-password="$(cat key.json)" \
  [email protected]

# Pod์— Secret ์—ฐ๊ฒฐ
spec:
  imagePullSecrets:
  - name: my-registry-secret
  containers:
  - name: app
    image: gcr.io/my-project/my-app:v1.0

---
# ๋ฐฉ๋ฒ• 3: imagePullPolicy ์กฐ์ •
spec:
  containers:
  - name: app
    image: nginx:latest
    imagePullPolicy: IfNotPresent  # ๋กœ์ปฌ์— ์žˆ์œผ๋ฉด Pull ์•ˆํ•จ
    # Always (๊ธฐ๋ณธ๊ฐ’ for :latest)
    # Never (ํ•ญ์ƒ ๋กœ์ปฌ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ)

2. CrashLoopBackOff

์›์ธ: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ ํ›„ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜์–ด ๊ณ„์† ์žฌ์‹œ์ž‘๋˜๋Š” ์ƒํƒœ

๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์—๋Ÿฌ (Panic, Segmentation Fault)
  • ์„ค์ • ํŒŒ์ผ ์˜ค๋ฅ˜
  • ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ˆ„๋ฝ
  • Liveness Probe ์‹คํŒจ
  • ๊ถŒํ•œ ๋ฌธ์ œ (non-root ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ ์‹œ)
  • ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ (OOMKilled)

๋™์ž‘ ๋ฐฉ์‹:

1. kubelet์ด ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
2. ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ Exit Code์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ
3. kubelet์ด ์žฌ์‹œ์ž‘ ์‹œ๋„ (restartPolicy: Always ๊ธฐ๋ณธ๊ฐ’)
4. ์‹คํŒจ ์‹œ ์žฌ์‹œ์ž‘ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ฆ๊ฐ€ (exponential backoff)
5. ๋Œ€๊ธฐ ์‹œ๊ฐ„: 10s โ†’ 20s โ†’ 40s โ†’ 80s โ†’ 160s (์ตœ๋Œ€ 5๋ถ„)
6. CrashLoopBackOff ์ƒํƒœ ํ‘œ์‹œ

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…:

# 1. Pod ์ƒํƒœ ๋ฐ ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜ ํ™•์ธ
kubectl get pod my-pod
# NAME      READY   STATUS             RESTARTS   AGE
# my-pod    0/1     CrashLoopBackOff   5          3m

# 2. Pod ์ด๋ฒคํŠธ ํ™•์ธ
kubectl describe pod my-pod
# Events:
# Back-off restarting failed container

# 3. ๋กœ๊ทธ ํ™•์ธ (ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ)
kubectl logs my-pod

# 4. ์ด์ „ ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ (์žฌ์‹œ์ž‘ ์ „)
kubectl logs my-pod --previous

# 5. ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ (Multi-container Pod)
kubectl logs my-pod --all-containers=true

# 6. Exit Code ํ™•์ธ
kubectl get pod my-pod -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'
# Exit Code ์˜๋ฏธ:
# 0: ์ •์ƒ ์ข…๋ฃŒ
# 1: ์ผ๋ฐ˜ ์—๋Ÿฌ
# 137: SIGKILL (OOMKilled)
# 139: Segmentation Fault
# 143: SIGTERM

# 7. ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ
kubectl top pod my-pod

# 8. OOMKilled ํ™•์ธ
kubectl describe pod my-pod | grep -i oom

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# ๋ฐฉ๋ฒ• 1: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
spec:
  containers:
  - name: app
    image: myapp:v1.0
    env:
    - name: DATABASE_URL
      value: "postgresql://db:5432"
    - name: LOG_LEVEL
      value: "debug"

---
# ๋ฐฉ๋ฒ• 2: ๋ฆฌ์†Œ์Šค ์ œํ•œ ์กฐ์ • (OOMKilled ๋ฐฉ์ง€)
spec:
  containers:
  - name: app
    image: myapp:v1.0
    resources:
      requests:
        memory: "256Mi"
        cpu: "100m"
      limits:
        memory: "512Mi"
        cpu: "500m"

---
# ๋ฐฉ๋ฒ• 3: Liveness Probe ์กฐ์ •
spec:
  containers:
  - name: app
    image: myapp:v1.0
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30  # ์‹œ์ž‘ ์‹œ๊ฐ„ ์—ฌ์œ 
      periodSeconds: 10
      failureThreshold: 3

---
# ๋ฐฉ๋ฒ• 4: ๋””๋ฒ„๊น… ๋ชจ๋“œ๋กœ ์‹คํ–‰ (Command Override)
spec:
  containers:
  - name: app
    image: myapp:v1.0
    command: ["/bin/sh"]
    args: ["-c", "sleep 3600"]  # 1์‹œ๊ฐ„ ๋Œ€๊ธฐ (๋””๋ฒ„๊น…์šฉ)

3. CreateContainerConfigError

์›์ธ: ์ปจํ…Œ์ด๋„ˆ ์„ค์ • ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ConfigMap์ด๋‚˜ Secret์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ
  • Volume Mount ๊ฒฝ๋กœ ์˜ค๋ฅ˜
  • ์ž˜๋ชป๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ

๋™์ž‘ ๋ฐฉ์‹:

1. kubelet์ด Pod Spec์„ ์ฝ์Œ
2. ConfigMap/Secret ์ฐธ์กฐ ํ™•์ธ
3. ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด CreateContainerConfigError
4. kubelet์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์žฌ์‹œ๋„ (๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ๋Œ€๊ธฐ)

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…:

# 1. Pod ์ƒํƒœ ํ™•์ธ
kubectl describe pod my-pod
# Events:
# Error: configmap "app-config" not found

# 2. ConfigMap ์กด์žฌ ํ™•์ธ
kubectl get configmap app-config

# 3. Secret ์กด์žฌ ํ™•์ธ
kubectl get secret app-secret

# 4. Volume ์„ค์ • ํ™•์ธ
kubectl get pod my-pod -o yaml | grep -A 10 volumes

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# ๋ฐฉ๋ฒ• 1: ConfigMap ๋จผ์ € ์ƒ์„ฑ
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.conf: |
    server {
      listen 80;
    }

---
# ๋ฐฉ๋ฒ• 2: optional ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ (์—†์–ด๋„ Pod ์‹คํ–‰)
spec:
  containers:
  - name: app
    image: nginx
    envFrom:
    - configMapRef:
        name: app-config
        optional: true  # ConfigMap ์—†์–ด๋„ ์‹œ์ž‘

---
# ๋ฐฉ๋ฒ• 3: ์˜ฌ๋ฐ”๋ฅธ Volume Mount
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: config-volume
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf  # ConfigMap์˜ ํŠน์ • ํ‚ค๋งŒ ๋งˆ์šดํŠธ
  volumes:
  - name: config-volume
    configMap:
      name: nginx-config

4. Pending ์ƒํƒœ

์›์ธ: Pod๊ฐ€ ์Šค์ผ€์ค„๋ง๋˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ

๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ (๋…ธ๋“œ์˜ CPU/Memory ๋ถ€์กฑ)
  • PVC๊ฐ€ Bound๋˜์ง€ ์•Š์Œ
  • Node Selector/Affinity ์กฐ๊ฑด ๋ถˆ๋งŒ์กฑ
  • Taints/Tolerations ๋ถˆ์ผ์น˜

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…:

# 1. ์Šค์ผ€์ค„๋ง ์‹คํŒจ ์›์ธ ํ™•์ธ
kubectl describe pod my-pod
# Events:
# 0/3 nodes are available: insufficient cpu.

# 2. ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค ํ™•์ธ
kubectl top nodes
kubectl describe nodes

# 3. PVC ์ƒํƒœ ํ™•์ธ
kubectl get pvc
# STATUS๊ฐ€ Pending์ด๋ฉด PV ๋ถ€์กฑ

# 4. Node Selector ํ™•์ธ
kubectl get pod my-pod -o jsonpath='{.spec.nodeSelector}'

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# ๋ฐฉ๋ฒ• 1: ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๊ฐ์†Œ
spec:
  containers:
  - name: app
    resources:
      requests:
        cpu: "100m"  # 1000m โ†’ 100m ๊ฐ์†Œ
        memory: "128Mi"

---
# ๋ฐฉ๋ฒ• 2: ๋…ธ๋“œ ์ถ”๊ฐ€ (ํด๋Ÿฌ์Šคํ„ฐ ํ™•์žฅ)
# EKS Autoscaling ํ™œ์„ฑํ™” ๋˜๋Š” ์ˆ˜๋™ ๋…ธ๋“œ ์ถ”๊ฐ€

---
# ๋ฐฉ๋ฒ• 3: PV ํ”„๋กœ๋น„์ €๋‹
# StorageClass์˜ provisioner ํ™•์ธ ํ›„ PV ์ž๋™ ์ƒ์„ฑ ๋Œ€๊ธฐ
kubectl get storageclass

์žฅ์•  ์ƒํƒœ ํ๋ฆ„๋„

Pod ์ƒ์„ฑ ์š”์ฒญ
    โ†“
[Pending] โ† ์Šค์ผ€์ค„๋ง ์‹คํŒจ (๋ฆฌ์†Œ์Šค ๋ถ€์กฑ, Node Selector)
    โ†“
[ContainerCreating]
    โ†“
์ด๋ฏธ์ง€ Pull โ†’ [ErrImagePull] โ†’ [ImagePullBackOff]
    โ†“
Config ์ƒ์„ฑ โ†’ [CreateContainerConfigError]
    โ†“
์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ โ†’ [CrashLoopBackOff] (Exit Code != 0)
    โ†“
[Running]
    โ†“
Liveness Probe ์‹คํŒจ โ†’ ์žฌ์‹œ์ž‘ โ†’ [CrashLoopBackOff]

์ผ๋ฐ˜์ ์ธ ๋””๋ฒ„๊น… ์ˆœ์„œ

# 1๋‹จ๊ณ„: Pod ์ƒํƒœ ํ™•์ธ
kubectl get pod my-pod

# 2๋‹จ๊ณ„: ์ƒ์„ธ ์ด๋ฒคํŠธ ํ™•์ธ
kubectl describe pod my-pod

# 3๋‹จ๊ณ„: ๋กœ๊ทธ ํ™•์ธ
kubectl logs my-pod --previous

# 4๋‹จ๊ณ„: Pod YAML ํ™•์ธ
kubectl get pod my-pod -o yaml

# 5๋‹จ๊ณ„: ๋…ธ๋“œ ์ƒํƒœ ํ™•์ธ (Pending ์‹œ)
kubectl describe node <node-name>

# 6๋‹จ๊ณ„: ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ
kubectl top pod my-pod
kubectl top node

# 7๋‹จ๊ณ„: ์ž„์‹œ ๋””๋ฒ„๊น… Pod ์‹คํ–‰
kubectl run debug --image=busybox -it --rm -- /bin/sh

์š”์•ฝ

์ƒํƒœ ์›์ธ ์ฃผ์š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
ImagePullBackOff ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ์‹คํŒจ ์ด๋ฏธ์ง€ ํƒœ๊ทธ ํ™•์ธ, imagePullSecrets ์ถ”๊ฐ€
CrashLoopBackOff ์ปจํ…Œ์ด๋„ˆ ์ฆ‰์‹œ ์ข…๋ฃŒ ๋กœ๊ทธ ํ™•์ธ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜/๋ฆฌ์†Œ์Šค ์กฐ์ •
CreateContainerConfigError ConfigMap/Secret ์—†์Œ ๋ฆฌ์†Œ์Šค ๋จผ์ € ์ƒ์„ฑ, optional ํ”Œ๋ž˜๊ทธ
Pending ์Šค์ผ€์ค„๋ง ์‹คํŒจ ๋…ธ๋“œ ๋ฆฌ์†Œ์Šค ํ™•์ธ, Node Selector ์กฐ์ •

์ด๋Ÿฌํ•œ ์žฅ์•  ์ƒํƒœ๋“ค์„ ์ดํ•ดํ•˜๋ฉด Kubernetes์—์„œ Pod๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.



โš ๏ธ **GitHub.com Fallback** โš ๏ธ