DrawingProcess
๋“œํ”„ DrawingProcess
DrawingProcess
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
ยซ   2025/06   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (967)
    • Profile & Branding (25)
      • Career (18)
    • IT Trends (254)
      • Conference, Faire (Experien.. (31)
      • News (187)
      • Youtube (19)
      • TED (8)
      • Web Page (2)
      • IT: Etc... (6)
    • Contents (97)
      • Book (66)
      • Lecture (31)
    • Project Process (94)
      • Ideation (0)
      • Study Report (34)
      • Challenge & Award (22)
      • 1Day1Process (5)
      • Making (5)
      • KRC-FTC (Team TC(5031, 5048.. (10)
      • GCP (GlobalCitizenProject) (15)
    • Study: ComputerScience(CS) (72)
      • CS: Basic (9)
      • CS: Database(SQL) (5)
      • CS: Network (14)
      • CS: OperatingSystem (3)
      • CS: Linux (39)
      • CS: Etc... (2)
    • Study: Software(SW) (95)
      • SW: Language (29)
      • SW: Algorithms (1)
      • SW: DataStructure & DesignP.. (1)
      • SW: Opensource (15)
      • SW: Error Bug Fix (43)
      • SW: Etc... (6)
    • Study: Artificial Intellige.. (149)
      • AI: Research (1)
      • AI: 2D Vision(Det, Seg, Tra.. (35)
      • AI: 3D Vision (70)
      • AI: MultiModal (3)
      • AI: SLAM (0)
      • AI: Light Weight(LW) (3)
      • AI: Data Pipeline (7)
      • AI: Machine Learning(ML) (1)
    • Study: Robotics(Robot) (33)
      • Robot: ROS(Robot Operating .. (9)
      • Robot: Positioning (8)
      • Robot: Planning & Control (7)
    • Study: DeveloperTools(DevTo.. (83)
      • DevTool: Git (12)
      • DevTool: CMake (13)
      • DevTool: NoSQL(Elastic, Mon.. (25)
      • DevTool: Container (17)
      • DevTool: IDE (11)
      • DevTool: CloudComputing (4)
    • ์ธ์ƒ์„ ์‚ด๋ฉด์„œ (64)
      • ๋‚˜์˜ ์ทจ๋ฏธ๋“ค (7)
      • ๋‚˜์˜ ์ƒ๊ฐ๋“ค (42)
      • ์—ฌํ–‰์„ ๋– ๋‚˜์ž~ (10)
      • ๋ถ„๊ธฐ๋ณ„ ํšŒ๊ณ  (5)

๊ฐœ๋ฐœ์ž ๋ช…์–ธ

โ€œ ๋งค์ฃผ ๋ชฉ์š”์ผ๋งˆ๋‹ค ๋‹น์‹ ์ด ํ•ญ์ƒ ํ•˜๋˜๋Œ€๋กœ ์‹ ๋ฐœ๋ˆ์„ ๋ฌถ์œผ๋ฉด ์‹ ๋ฐœ์ด ํญ๋ฐœํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ผ.
์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ด๋Ÿฐ ์ผ์ด ํ•ญ์ƒ ์ผ์–ด๋‚˜๋Š”๋ฐ๋„ ์•„๋ฌด๋„ ๋ถˆํ‰ํ•  ์ƒ๊ฐ์„ ์•ˆ ํ•œ๋‹ค. โ€

- Jef Raskin

๋งฅ์˜ ์•„๋ฒ„์ง€ - ์• ํ”Œ์ปดํ“จํ„ฐ์˜ ๋งคํ‚จํ† ์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฃผ๋„

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
DrawingProcess

๋“œํ”„ DrawingProcess

[Kubernetes] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: Part II. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ ๊ฐœ๋…(์•„ํ‚คํ…์ฒ˜, ํŒŒ๋“œ, ...)
Study: DeveloperTools(DevTool)/DevTool: Container

[Kubernetes] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: Part II. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ ๊ฐœ๋…(์•„ํ‚คํ…์ฒ˜, ํŒŒ๋“œ, ...)

2023. 3. 9. 20:06
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” '์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: Part II. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ ๊ฐœ๋…'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
'์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ'์ด๋ผ๋Š” Kubernetest์˜ ๊ฐœ๋… ๋ฐ ์‹ค์Šต์„ ๋‹ค๋ฃฌ ์ฑ…์„ ์ฝ์œผ๋ฉฐ ๊ด€๋ จ ํ•ต์‹ฌ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณธ ๋ฌธ์„œ์˜ ๊ฒฝ์šฐ '์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: Part II. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ณธ ๊ฐœ๋…'์˜ ๋‚ด์šฉ์ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ผญ ์•Œ์•„์•ผ ํ•  ๋‚ด์šฉ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์—ˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ, ํ•ด๋‹น ์ฑ…์˜ ์ƒ˜ํ”Œ ์˜ˆ์ œ๋Š” [github] kubernetes-book-sample์—์„œ ๋‹ค์šด ๋ฐ›์•„ kubectl apply -f <filename>.yaml ๋ช…๋ น์„ ํ†ตํ•ด ์‹ค์Šตํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์•„ํ‚คํ…์ฒ˜

1.1 ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ „์ฒด ๊ตฌ์กฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜์˜ ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋งˆ์Šคํ„ฐ(Control Plane, cp)์™€ ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋…ธ๋“œ(Worker Node)์ž…๋‹ˆ๋‹ค.

๋งˆ์Šคํ„ฐ์—๋Š” etcd, kube-apiserver, kube-schduler, kube-controller-manager, kubelet, kube-proxy, docker ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ฐ๊ฐ์ด ๋‹ค๋ฅธ ๋งˆ์Šคํ„ฐ๋‚˜ ๋…ธ๋“œ ์„œ๋ฒ„์—์„œ ๋ณ„๊ฐœ๋กœ ์‹คํ–‰๋˜์–ด๋„ ์‹ค์ œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๋Š” ๋ฐ ์ด์ƒ์€ ์—†์œผ๋‚˜, ๋งˆ์Šคํ„ฐ๊ฐ€ ์„œ๋ฒ„ 1๋Œ€๋ผ๋ฉด ํ”„๋กœ์„ธ์Šค ํ•œ ๋ฌถ์Œ์œผ๋กœ ํ•ด๋‹น ์„œ๋ฒ„์—์„œ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค(๋ณดํ†ต ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด 3๋Œ€๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.). ๋…ธ๋“œ(์ดˆ๊ธฐ์— ๋ฏธ๋‹ˆ์–ธ์ด๋ผ๊ณ ๋„ ํ•จ)์—๋Š” kubelet, kube-proxy, docker ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

1.2 ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

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

1.2.1 ๋งˆ์Šคํ„ฐ์šฉ ์ปดํฌ๋„ŒํŠธ

etcd

  • ์ฝ”์–ด OS์—์„œ raft ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐœ๋ฐœํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” 'key-value ์ €์žฅ์†Œ'
    • raft ์•Œ๊ณ ๋ฆฌ์ฆ˜: ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ƒํƒœ ๊ณต์œ ํ•˜๋Š” ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์„œ๋ฒ„ ํ•˜๋‚˜๋‹น ํ”„๋กœ์„ธ์Šค 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณดํ†ต etcd ์ž์ฒด๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ•œ ํ›„ ์—ฌ๋Ÿฌ ๊ฐœ ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— ๋ถ„์‚ฐํ•ด์„œ ์‹คํ–‰ํ•ด ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•จ
    • ํด๋Ÿฌ์Šคํ„ฐ๋ง: ์—ฌ๋Ÿฌ ๋Œ€ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์‹œ์Šคํ…œ ํ•˜๋‚˜์ฒ˜๋Ÿผ ๊ตฌ์„ฑ
  • etcd ์ž์ฒด๋„ ๊ฝค ์•ˆ์ •์ ์ด์ง€๋งŒ, ๋” ์•ˆ์ •์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์šด์˜ํ•˜๋ ค๋ฉด ์ฃผ๊ธฐ์ ์œผ๋กœ etcd์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•  ๊ฒƒ์„ ๊ถŒ์žฅ

kube-apiserver

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ
  • Kube-api๋ฅผ ํ†ตํ•ด ํŠน์ • ์ž์›์˜ ์กฐํšŒ ๋ช…๋ น์„ ๋ฐ›์œผ๋ฉด, ์š”์ฒญ์ด ์œ ํšจํ•˜๊ณ  ์‹คํ–‰ํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ ํ›„ ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” Micro Service Architecture(MSA)์ด๋ฏ€๋กœ, ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์š”์ฒญ์€ kube-apiserver๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋จ

kube-scheduler

  • ์ƒˆ๋กญ๊ฒŒ ์‹คํ–‰ํ•  'ํŒŒ๋“œ'์˜ ์กฐ๊ฑด์— ์•Œ๋งž๋Š” ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰
  • pod์˜ ์กฐ๊ฑด: ํ•˜๋“œ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ, affinity์™€ anti-affinity ๋งŒ์กฑ ์—ฌ๋ถ€, ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์— ํ• ๋‹น ๋“ฑ
    • affinity: ํ•จ๊ป˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ํŒŒ๋“œ๋“ค์„ ๊ฐ™์€ ๋…ธ๋“œ์— ์‹คํ–‰
    • anti-affinity: ํŒŒ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ๋…ธ๋“œ๋กœ ๋ถ„์‚ฐํ•ด์„œ ์‹คํ–‰

kube-controller-manager

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” '์ปจํŠธ๋กค๋Ÿฌ(controller)' ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
  • ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ๊ฐ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค์ง€๋งŒ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋ ค๊ณ  ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ํ•˜๋‚˜๋กœ ์ปดํŒŒ์ผํ•ด ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰

cloud-controller-manager

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

1.2.2 ๋…ธ๋“œ์šฉ ์ปดํฌ๋„ŒํŠธ

kubelet

  • ๋งˆ์Šคํ„ฐ์˜ kube-apiserver์™€ ํ†ต์‹ ํ•˜๋ฉฐ pod container์˜ ์‹คํ–‰์„ ๊ด€๋ฆฌ
    • ๋‹จ, ํŒŒ๋“œ ๋‚ด์—์„œ๋„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ
  • PodSpecs ์กฐ๊ฑด์ด ๋‹ด๊ธด ์„ค์ •์„ ์ „๋‹ฌ๋ฐ›์•„์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•จ

kube-proxy

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ๋ณ„๋„ ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ์˜ ๋™์ž‘์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„(e.g. Docker)

  • ์‹ค์ œ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉฐ, ๊ฐ€์žฅ ๋งŽ์ด ์•Œ๋ ค์ง„ ๋Ÿฐํƒ€์ž„์€ Docker๊ฐ€ ์žˆ์Œ(continerd, runc ๊ฐ™์€ ๋Ÿฐํƒ€์ž„๋„ ์ง€์›)

1.2.3 ์• ๋“œ์˜จ์šฉ ์ปดํฌ๋„ŒํŠธ

ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” kube-system์ž…๋‹ˆ๋‹ค. ์• ๋“œ์˜จ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋“œ๋“ค์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ์• ๋“œ์˜จ

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•ด ์‚ฌ์šฉํ•  ๋•Œ kube-proxy ์ด์™ธ์— ๋„คํŠธ์›Œํ‚น ์—๋“œ์˜จ์„ ์‚ฌ์šฉํ•จ
  • AWS, Azure ๋“ฑ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•  ํ•„์š”๋Š” ์—†์œผ๋‚˜ ์ง์ ‘ ์„œ๋ฒ„์— ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

DNS ์• ๋“œ์˜จ

  • ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ๋™์ž‘ํ•˜๋Š” DNS ์„œ๋ฒ„๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค์— DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•จ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์•ˆ์— ์‹คํ–‰๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ์ž๋™์œผ๋กœ DNS ์„œ๋ฒ„์— ๋“ฑ๋ก๋จ
  • ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” DNS ์• ๋“œ์˜จ: kube-dns, CoreDNS

๋Œ€์‹œ๋ณด๋“œ ์• ๋“œ์˜จ(์›น UI)

  • kubectl ์ด๋ผ๋Š” CLI ์™ธ์— ์›น UI ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉ์„ ์›ํ•  ๊ฒฝ์šฐ ๋Œ€์‹œ๋ณด๋“œ ์• ๋“œ์˜จ์„ ์‚ฌ์šฉํ•จ.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ„ํ•œ ๋ฒ”์šฉ ์›น ๊ธฐ๋ฐ˜ UI๋ฅผ ์ œ๊ณต

์ปจํ…Œ์ด๋„ˆ ์ž์›(๋ฆฌ์†Œ์Šค) ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์ปจํ…Œ์ด๋„ˆ ์ž์› ๋ชจ๋‹ˆํ„ฐ๋ง ์€ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์• ๋“œ์˜จ
  • CPU, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์‹œ๊ณ„์—ด ํ˜•์‹์œผ๋กœ ๊ธฐ๋กํ•˜๋ฉฐ, kubelet ์•ˆ์— ํฌํ•จ๋œ cAdvisor๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

ํด๋Ÿฌ์Šคํ„ฐ ๋กœ๊น…

  • ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ์™€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋กœ๊ทธ๋“ค์„ ์ˆ˜์ง‘ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ค‘์•™ํ™”ํ•œ ๋กœ๊ทธ ์ˆ˜์ง‘ ์‹œ์Šคํ…œ์— ๋ชจ์•„์„œ ๋ณด๋Š” ์• ๋“œ์˜จ
  • ๋กœ๊ทธ ์ˆ˜์ง‘ํ•ด์„œ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ElasticSearch Logstash Kibana(ELK), ElasticSearch Fluentd Kibans(EFK)๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•จ

1.3 ์˜ค๋ธŒ์ ํŠธ์™€ ์ปจํŠธ๋กค๋Ÿฌ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํฌ๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์‹œํ•œ desired state๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” '์˜ค๋ธŒ์ ํŠธ'์™€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” '์ปจํŠธ๋กค๋Ÿฌ'๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. 

  • ์˜ค๋ธŒ์ ํŠธ: pod, service, volume, namespace ๋“ฑ
  • ์ปจํŠธ๋กค๋Ÿฌ: ReplicaSet, Deployment, StatefulSet, DaemonSet, Job ๋“ฑ

์˜ค๋ธŒ์ ํŠธ, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์Œ ์ณ…ํ„ฐ์—์„œ ์„ค๋ช…ํ•  ์˜ˆ์ •์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” '๋„ค์ž„์ŠคํŽ˜์ด์Šค'์™€ ์˜ค๋ธŒ์ ํŠธ ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์–ด๋–ค ์ƒํƒœ์—ฌ์•ผ ํ•˜๋Š”์ง€ ์„ค์ •ํ•˜๋Š” 'ํ…œํ”Œ๋ฆฟ'์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1.3.1 ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ํ•˜๋‚˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ฃผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ณ„๋กœ ๋ณ„๋„์˜ ์ฟผํ„ฐ๋ฅผ ์„ค์ •ํ•ด์„œ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์‚ฌ์šฉ๋Ÿ‰์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ฒ˜์Œ ์„ค์น˜ํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ ๋ช‡ ๊ฐœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, 'kubectl get namespaces' ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl get namespace
NAME              STATUS   AGE
default           Active   36d
kube-node-lease   Active   36d
kube-public       Active   36d
kube-system       Active   36d
  • default: ๊ธฐ๋ณธ ๋„ค์ด์ŠคํŽ˜์ด์Šค์ด๋ฉฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋ณ„๋„์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ญ์ƒ default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ช…๋ น์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • kube-system: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋ฉฐ, ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ฆฌ์šฉ ํŒŒ๋“œ๋‚˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • kube-public: ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • kube-node-lease: ๊ฐ ๋…ธ๋“œ์˜ lease object ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฉฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.13 ์ดํ›„ ์•ŒํŒŒ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

kubectl๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” --namespace=kube-system ์ฒ˜๋Ÿผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ด์•ผํ•˜๋ฉฐ, ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด default๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ์ผ์ผ์ด ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. kubectl๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

% kubectl config set-context {์ปจํ…์ŠคํŠธ ์ด๋ฆ„} --namespace={๋ณ€๊ฒฝํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค}

๊ทธ๋ฆฌ๊ณ  kubctx ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด, kubens ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ธฐ๋ณธ namespace ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

% brew install kubectx
% kubeens {namespace name}

1.3.2 ํ…œํ”Œ๋ฆฟ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ '์˜ค๋ธŒ์ ํŠธ'๋‚˜ '์ปจํŠธ๋กค๋Ÿฌ'๊ฐ€ ์–ด๋–ค ์ƒํƒœ์—ฌ์•ผ ํ•˜๋Š”์ง€(desired state)๋ฅผ ์ ์šฉํ•  ๋•Œ๋Š” YAML ํ˜•์‹์˜ ํ…œํ”Œ๋ฆฟ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

YAML์—์„œ ์‚ฌ์šฉํ•˜๋Š” data type์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Scalars
(strings/number)
Sequence
(arrays/lists)
Mappings
(hashes/dictionaries)
Name: choi
Birth: 2000
ProgrammingSkills:
 - C++
 - Python
Data: 
  Height: 173
  Weight: 73

ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ๋ณธ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ, ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด YAML์—์„œ ์‚ฌ์šฉํ•˜๋Š” field์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
spec:
  • apiVersion: ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๋ฒ„์ „์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. kubectl api-versions ๋ช…๋ น์„ ํ†ตํ•ด ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ API ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • kind: ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ธŒ์ ํŠธ ํ˜น์€ ์ปจํŠธ๋กค๋Ÿฌ์— ์ž‘์—…์ธ์ง€ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. pod์ด๋ผ ๋ช…์‹œํ•˜๋ฉด ํŒŒ๋“œ์— ๊ด€ํ•œ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.

2. ํŒŒ๋“œ

2.1. ํŒŒ๋“œ ๊ฐœ๋…

k8s๋Š” ํŒŒ๋“œ๋ผ๋Š” ์ตœ์†Œ ๋‹จ์œ„๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ '๋ฌถ์–ด' ๊ด€๋ฆฌํ•˜๋ฉฐ, ํŒŒ๋“œ๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌํ•  ๋•Œ๋Š” ์ปจํ…Œ์ด๋„ˆ๋งˆ๋‹ค ์—ญํ•  ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Œ€๊ฒŒ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ํ•˜๋‚˜์˜ ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค(e.g. ๋กœ๊ทธ, ๋ณผ๋ฅจ ๋“ฑ).

ํ•œ ํŒŒ๋“œ ์•ˆ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ™์€ IP ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ, ์™ธ๋ถ€์—์„œ ์ด ํŒŒ๋“œ์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด? ์ •ํ•ด์ง„ ํ•˜๋‚˜์˜ IP๋กœ ์ ‘๊ทผํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋งˆ๋‹ค ๋ถ€์—ฌ๋œ ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

2.2. ํŒŒ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

๊ต์žฌ์˜ ํŒŒ๋“œ์˜ ํƒฌํ”Œ๋ฆฟ ์„ค์ • ์˜ˆ์‹œ์ธ pod/pod-sample.yaml ํŒŒ์ผ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
    name: kubernetes-simple-pod
    labels:
    	app: kubernetes-simple-pod
spec:
    containers:
    - name: kubernetes-simple-pod
      image: arisu1000/simple-container-app:latest
      ports:
      - containerPort: 8080
  1. .metadata.name : ํŒŒ๋“œ ์ด๋ฆ„ ์„ค์ •.
  2. .metatdata.labels.app : ์˜ค๋ธŒ์ ํŠธ ์‹๋ณ„ ๋ ˆ์ด๋ธ” ์„ค์ •.
  3. .spec.containers[].name : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ์„ค์ •. name ์•ž์˜ '-' ํ‘œ์‹œ๋Š” ๋ฐฐ์—ด์„ ์˜๋ฏธํ•จ. .spec.containers์˜ ํ•˜์œ„ ํ•„๋“œ๋ฅผ ๋ฐฐ์—ดํ˜•ํƒœ๋กœ ๋ฌถ๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ๋Œ€๊ฒŒ .spec.containers[] ๋ผ๊ณ  ํ‘œ๊ธฐํ•จ.
  4. .spec.containers[].image : ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •.
  5. .spec.containers[].ports[].containerPort : ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•  ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•จ.

ํ•ด๋‹น ์ƒ˜ํ”Œ์˜ ๊ฒฝ์šฐ, ์ €์ž์˜ github์—์„œ pod/pod-sample.yaml์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋‹ˆ ํ•ด๋‹น yaml ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ์‹œ๋‹ค. ์ดํ›„ 'kubectl get pod' ๋ช…๋ น์œผ๋กœ STATUS ํ•ญ๋ชฉ์ด Running ์ด๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

% kubectl apply -f pod/pod-sample.yaml
pod/kubernetes-simple-pod created

% kubectl get pod                     
NAME                    READY   STATUS    RESTARTS   AGE
kubernetes-simple-pod   1/1     Running   0          8s

2.3 ํŒŒ๋“œ ์ƒ๋ช… ์ฃผ๊ธฐ

ํŒŒ๋“œ๋Š” ์ƒ์„ฑ๋ถ€ํ„ฐ ์‚ญ์ œ๊นŒ์ง€์˜ ๊ณผ์ •์— ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pending: k8s system์— ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ค‘์ž„. ์ด ์ƒํƒœ์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ.
  • Running: ํŒŒ๋“œ ์•ˆ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ.
  • Succeeded: ํŒŒ๋“œ ์•ˆ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ ์‹คํ–‰ ์ข…๋ฃŒ๋œ ์ƒํƒœ๋กœ ์žฌ์‹œ์ž‘๋˜์ง€ ์•Š์Œ.
  • Failed: ํŒŒ๋“œ ์•ˆ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ค‘ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ. ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ๋น„์ •์ƒ ์ข…๋ฃŒ์ด๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์ด ์ง์ ‘ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•œ ๊ฒƒ.
  • Unknown: ํŒŒ๋“œ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ด๋‹ค ๋ณดํ†ต ํŒŒ๋“œ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์—†์„ ๋•Œ.

'kubectl get pod', 'kubectl describe pod kubernetes-simple-pod' ๋ช…๋ น์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl get pod                     
NAME                    READY   STATUS    RESTARTS   AGE
kubernetes-simple-pod   1/1     Running   0          8s

% kubectl describe pod kubernetes-simple-pod 
Name:             kubernetes-simple-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             docker-desktop/192.168.65.4
Start Time:       Sun, 26 Mar 2023 13:55:52 +0900
Labels:           app=kubernetes-simple-pod
Annotations:      <none>
Status:           Running
IP:               10.1.0.14
IPs:
  IP:  10.1.0.14
Containers:
  kubernetes-simple-pod:
  
...

Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
  
...

Condition ํ•ญ๋ชฉ์€ ํŒŒ๋“œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, Type๊ณผ Status๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Status๋Š” ํ•ด๋‹น Type์ด ํ™œ์„ฑํ™”(True), ๋น„ํ™œ์„ฑํ™”(False), ์•Œ ์ˆ˜ ์—†์Œ(Unknown) ์ธ์ง€์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ, Type์—๋Š” ๋‹ค์Œ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค.

  • Initialized: ๋ชจ๋“  ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๋œป.
  • Ready: ํŒŒ๋“œ๋Š” ์š”์ฒญ๋“ค์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ’€์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป.
  • ContainersReady: ํŒŒ๋“œ ์•ˆ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค€๋น„ ์ƒํƒœ๋ผ๋Š” ๋œป.
  • PodScheduled: ํŒŒ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ์Šค์ผ€์ค„์„ ์™„๋ฃŒํ–ˆ๋‹ค๋Š” ๋œป.
  • Unschedulable: ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ž์›์˜ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ œ์•ฝ ๋“ฑ์œผ๋กœ ์ง€๊ธˆ ๋‹น์žฅ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋œป.

2.4. kubelet์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ง„๋‹จ

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„์—๋Š” kubelet์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ ํ”„๋กœ๋ธŒ(probe)์—๋Š” ๋‹ค์Œ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • livenessProbe: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ, ์ด ์ง„๋‹จ์ด ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ์ •์ฑ…์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•จ.
  • readinessProbe: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋œ ํ›„ ์‹ค์ œ ์„œ๋น„์Šค ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ง„๋‹จ
    • ํŠนํžˆ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ๋กœ ์„œ๋น„์Šค ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์„๋•Œ ๊นŒ์ง€์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋น„์Šค์— ์œ ๋ฆฌ
    • e.g. ์ž๋ฐ” app ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ ํ›„ ์•ฑ์ด ์ดˆ๊ธฐํ™”๋  ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ƒํ™ฉ, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์•ฑ ๋“ฑ์— ์œ ์šฉ

์ปจํ…Œ์ด๋„ˆ ์ง„๋‹จ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ตฌํ˜„ํ•œ ํ•ธ๋“ค๋Ÿฌ(handler)๋ฅผ kubelet์ด ํ˜ธ์ถœํ•˜๋ฉฐ, handler์—๋Š” ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ExecAction: ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์ง€์ •๋œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ผ๋•Œ Success๋ผ๊ณ  ์ง„๋‹จ.
  • TCPSocketAction: ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์ง€์ •๋œ IP์™€ ํฌํŠธ๋กœ TCP ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ํฌํŠธ๊ฐ€ ์—ด๋ ค ์žˆ์œผ๋ฉด Success๋ผ๊ณ  ์ง„๋‹จ.
  • HTTPGetAction: ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์ง€์ •๋œ IP, ํฌํŠธ, ๊ฒฝ๋กœ๋กœ HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 200~400์ด๋ฉด Success๋ผ๊ณ  ์ง„๋‹จํ•œ๋‹ค.

์ง„๋‹จ ๊ฒฐ๊ณผ ์—ญ์‹œ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Success : ์ปจํ…Œ์ด๋„ˆ ์ง„๋‹จ ์„ฑ๊ณต
  • Failure : ์ปจํ…Œ์ด๋„ˆ ์ง„๋‹จ ์‹คํŒจ
  • Unknown : ์ง„๋‹จ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•ด ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ

2.5 ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ(init container)

์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ(init container)๋Š” app container๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ํŒŒ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ, ๋ณด์•ˆ์ƒ ์ด์œ ๋กœ ๊ฐ™์ด ๋‘๋ฉด ์•ˆ๋˜๋Š” ์•ฑ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณ„๋„ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ๋Š” ์—ฌ๋Ÿฌ๊ฐœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋ฉฐ, pod tamplate์— ๋ช…์‹œํ•œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹คํ–‰ ์‹คํŒจํ•˜๋ฉด ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด k8s์˜ '์„ ์–ธ์ ' ํŠน์ง•์—์„œ ๋ฒ—์–ด, ํ•„์š”ํ•œ ๋ช…๋ น๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋œ ํ›„์—์•ผ app container๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ํŠน์ง•์„ ์ด์šฉํ•ด pod ์‹คํ–‰ ์‹œ app container๊ฐ€ ์™ธ๋ถ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹จ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. pod๊ฐ€ ๋ชจ๋‘ ์ค€๋น„๋˜๊ธฐ ์ „ ์‹คํ–‰ํ•œ ํ›„ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— readinessProbe๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ค์ •ํ•œ ํŒŒ๋“œ ์„ค์ •์˜ ์˜ˆ์‹œ๋Š” pod/pod-init.yaml๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

spec:
  initContainers:
  - name: init-myservice
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld01;']
  - name: init-mydb
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'sleep 2; echo helloworld02;']
  containers:
  - name: kubernetes-simple-pod 
    image: arisu1000/simple-container-app:latest
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

์ดˆ๊ธฐํ™” ์ปจํ…Œ์ด๋„ˆ๋Š” .spec.initContainers[] ์˜ ํ•˜์œ„ ํ•„๋“œ์— ์ •์˜๋˜๋ฉฐ, ์•ฑ ์ปจํ…Œ์ด๋„ˆ๋Š” .spec.containers[] ํ•˜์œ„์— ์ •์˜๋ฉ๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ํ•ด๋‹น yaml ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด? ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— 'init-service', 'init-mydb' ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ 'kubernetes-simple-pod' ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œ์ผœ ํ•˜๋‚˜์˜ pod๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2.6 ํŒŒ๋“œ ์ธํ”„๋ผ ์ปจํ…Œ์ด๋„ˆ

k8s์—๋Š” ๋ชจ๋“  ํŒŒ๋“œ์—์„œ ํ•ญ์ƒ ์‹คํ–‰๋˜๋Š” pause๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด pause๋ฅผ 'ํŒŒ๋“œ ์ธํ”„๋ผ ์ปจํ…Œ์ด๋„ˆ(Pod infrastructure container)' ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

pause๋Š” ํŒŒ๋“œ ์•ˆ ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ์‹๋ณ„์ž๊ฐ€ 1(PID 1)๋กœ ์„ค์ •๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋Š” pause๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ๊ณต์œ ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ๋“œ ์•ˆ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋์„ ๋•Œ๋Š” ํŒŒ๋“œ์˜ IP๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ, pause๊ฐ€ ์žฌ์‹œ์ž‘๋œ๋‹ค๋ฉด ํŒŒ๋“œ ์•ˆ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋„ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

kubelet์—๋Š” ๋ช…๋ น ์˜ต์…˜์œผ๋กœ '--pod-infra-container-image'๋กœ pause๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŒŒ๋“œ ์ธํ”„๋ผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.7. ์Šคํƒœํ‹ฑ ํŒŒ๋“œ

์Šคํƒœํ‹ฑ ํŒŒ๋“œ(static pod)๋Š” kube-apiserver๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  kubelet์ด ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ์ž…๋‹ˆ๋‹ค. kubelet ์„ค์ •์˜ '--pod-manifest-path'๋ผ๋Š” ์˜ต์…˜์— ์ง€์ •ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— static pod๋กœ ์‹คํ–‰ํ•˜๋ ค๋Š” ํŒŒ๋“œ๋ฅผ ๋„ฃ์–ด๋‘๋ฉด, kubelet์ด ๊ทธ๊ฑธ ๊ฐ์ง€ํ•ด static pod๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

static pod๋Š” kubelet์ด ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ด์ƒ์ด ์ƒ๊ธด๋‹ค๋ฉด ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋˜ kubelet์ด ์‹คํ–‰์ค‘์ธ ๋…ธ๋“œ์—์„œ๋งŒ ์‹คํ–‰๋˜๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. kube-apiserver๋กœ pod๋ฅผ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ static pod์— ์–ด๋– ํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ณดํ†ต static pod๋Š” kube-apiserver, etcd๊ฐ™์€ system pod๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์šฉ๋„๋กœ ๋งŽ์ด ์“ฐ์ž…๋‹ˆ๋‹ค. k8s์—์„œ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด kube-apiserver๊ฐ€ ํ•„์š”ํ•œ๋ฐ kube-apiserver ์ž์ฒด๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” ๋ณ„๋„์˜ ์ˆ˜๋‹จ์œผ๋กœ static pod๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2.8 ํŒŒ๋“œ์— CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์ž์› ํ• ๋‹น

๋…ธ๋“œ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ผ์ด ์ž์ฃผ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ž์› ์‚ฌ์šฉ๋Ÿ‰์ด ํฐ ํŒŒ๋“œ๊ฐ€ ๋…ธ๋“œ ํ•˜๋‚˜์— ๋ชจ์—ฌ์žˆ๋‹ค๋ฉด ํŒŒ๋“œ๋“ค์˜ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง€๋ฉฐ ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ ์ž์› ํšจ์œจ๋„ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

k8s์—์„œ๋Š” ์ด๋ฅผ ๋ง‰๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์€ ํŒŒ๋“œ ์„ค์ •์‹œ ํŒŒ๋“œ ์•ˆ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ์†Œ ์š”๊ตฌ๋Ÿ‰(request)์™€ ์ƒํ•œ์„ (limits)์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. pod/pod-resource.yaml ํŒŒ์ผ์—์„œ ์ž์› ํ• ๋‹น๋Ÿ‰์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜€๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    resources:
      requests:
        cpu: 0.1 --- 1
        memory:200M --- 2
      limits:
        cpu: 0.5 --- 3
        memory: 1G --- 4
    ports:
    - containerPort: 8080
  • .spec.continers[].resource.request ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ตœ์†Œ ์ž์› ์š”๊ตฌ๋Ÿ‰์„ ์ง€์ •
    • ์ด ํ•„๋“œ์— ์„ค์ •๋œ ๋งŒํผ ์ž์› ์—ฌ์œ ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์—ฌ์•ผ ๊ทธ๊ณณ์— ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง๋˜์–ด ์‹คํ–‰๋จ
    • ์ž์›์ด ์š”๊ตฌํ•˜๋Š” ๋งŒํผ ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ํŒŒ๋“œ๋Š” Pending ์ƒํƒœ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ์ž์› ์—ฌ์œ ๊ฐ€ ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•จ.
  • .spec.continers[].resource.request ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ž์› ์ƒํ•œ์„ ์„ ์ง€์ •
    • ํ‰์†Œ์— ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๋”๋ผ๋„ ๊ฐ‘์ž๊ธฐ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ limit ์„ค์ •์ด ๋”ฐ๋กœ ์—†๋‹ค๋ฉด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์›์„ ์‚ฌ์šฉํ•  ๊ฒƒ
    • ๊ทธ๋Ÿผ ๊ฐ™์€ ๋…ธ๋“œ์— ์‹คํ–‰๋œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ๋‘ ์˜ํ–ฅ์„ ๋ฐ›์„์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ์•…์—” ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ๋ชจ๋“  ์„œ๋น„์Šค์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜๋„ ์žˆ๊ธฐ์— limit์„ค์ •์œผ๋กœ ์ด๋ฅผ ๋ง‰์•„์คŒ
  • ์ถ”๊ฐ€๋กœ, ์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ CPU ํ•„๋“œ๋Š” 0.1, 0.5 ๋“ฑ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ 1์€ ์ฝ”์–ด ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ์ „๋ถ€ ์“ฐ๋„๋ก ์„ค์ •ํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ 0.1์ด๋ผ๋ฉด CPU ์ฝ”์–ด ํ•˜๋‚˜์˜ 10%๋งŒํผ ์—ฐ์‚ฐ๋Šฅ๋ ฅ์„ ํ• ๋‹นํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

2.9. ํŒŒ๋“œ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐ

ํŒŒ๋“œ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ๋ฐฉ๋ฒ•์€ .spec.containers[].env[] ํ•„๋“œ์—์„œ ์„ค์ •ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ์ง€๋‹™๋‹ˆ๋‹ค.

  • name : ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์„ค์ •.
  • value : ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž ํ˜•์‹์˜ ๊ฐ’์„ ์„ค์ •.
  • valueFrom: ๊ฐ’์„ ์ง์ ‘ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ด๋”˜๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’ ์„ค์ •.
  • fieldRef : ํŒŒ๋“œ์˜ ํ˜„์žฌ ์„ค์ • ๋‚ด์šฉ์„ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค๋Š” ์„ ์–ธ.
  • fieldPath : .fieldRef์—์„œ ์–ด๋””์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ธ์ง€ ์ง€์ •. ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์˜ ์œ„์น˜๋ฅผ ์ง€์ •.
  • resourceFieldRef : ์ปจํ…Œ์ด๋„ˆ์— CPU, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์–ผ๋งˆ๋‚˜ ํ• ๋‹นํ–ˆ๋Š”์ง€์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด.
  • containerName: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ๊ฐ€์ ธ์˜ฌ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์„ค์ •.
  • resource : ์–ด๋–ค ์ž์›์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ์ง€ ์„ค์ •.

์‚ฌ์šฉ์˜ˆ์‹œ๋Š” 'pod/pod-env.yaml' ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค. ํ•ด๋‹น ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€, ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•˜์—ฌ env๋ช…๋ น์–ด๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

% kubectl apply -f pod/pod-env.yaml

% kubectl exec -it kubernetes-simple-pod sh

- # env
POD_IP=10.1.0.5
...(ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋‚ด์šฉ)

2.10. ํŒŒ๋“œ ๊ตฌ์„ฑ ํŒจํ„ด

ํŒŒ๋“œ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฌถ์–ด์„œ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ๋•Œ ๋ช‡๊ฐ€์ง€ ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ตฌ๊ธ€์˜ '์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋””์ž์ธ ํŒจํ„ด' ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

2.10.1. ์‚ฌ์ด๋“œ์นด ํŒจํ„ด(Sidecar)

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

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

2.10.2. ์•ฐ๋ฒ„์„œ๋” ํŒจํ„ด(Ambassador)

ํŒŒ๋“œ ์•ˆ์—์„œ ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํŒŒ๋“œ ์•ˆ์—์„œ ์™ธ๋ถ€ ์„œ๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ ๋‚ด๋ถ€ ํ”„๋ก์‹œ์— ์ ‘๊ทผํ•˜๋„๋ก ์„ค์ •ํ•˜๊ณ , ์‹ค์ œ ์™ธ๋ถ€์™€ ์—ฐ๊ฒฐ์€ ํ”„๋ก์‹œ์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์›น ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ๋Š” ์บ์‹œ์— localhost๋กœ๋งŒ ์ ‘๊ทผํ•˜๊ณ , ์™ธ๋ถ€ ์บ์‹œ ์ค‘ ์–ด๋””๋กœ ์ ‘๊ทผํ• ์ง€๋Š” ํ”„๋ก์‹œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ํŒŒ๋“œ์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2.10.3. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด(Adapter)

ํŒŒ๋“œ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋Š” ์ •๋ณด๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์–ด๋Œ‘ํ„ฐ ์ปจํ…Œ์ด๋„ˆ๋กœ ํŒŒ๋“œ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ณ , ์™ธ๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š”๋ฐ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

3. ์ปจํŠธ๋กค๋Ÿฌ

์ปจํŠธ๋กค๋Ÿฌ(controller)๋Š” ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ ReplicaSet, Deployment, StatefulSet, DaemonSet, Job ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชฉ์ ์— ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Replication Controller, ReplicaSet, Deployment: ์˜ค๋žœ ์‹œ๊ฐ„๋™์•ˆ ๊ณ„์† ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•  ๋•Œ
  • DaemonSet: ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ „์ฒด ๋…ธ๋“œ์— ๊ฐ™์€ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ
  • StatefulSet: ๋ณดํ†ต stateless ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ stateful ์•ฑ์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋„๋ก
  • Job: 1ํšŒ์„ฑ ์ž‘์—…์„ ํ•  ๋•Œํ•˜๋ฉฐ, ์ฃผ๊ธฐ์ ์ธ ๋ฐฐ์น˜ ์ž‘์—…์„ ์‹คํ–‰ํ• ๋•Œ๋Š” cronjob์„ ์‚ฌ์šฉ

3.1. ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ

๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ(Replication Controller)๋Š” ์ง€์ •ํ•œ ์ˆซ์ž๋งŒํผ์˜ ํŒŒ๋“œ๊ฐ€ ํ•ญ์ƒ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์žฅ์• ์™€ ๊ฐ™์€ ์ด์œ ๋กœ ํŒŒ๋“œ๊ฐ€ ์ฃฝ๋”๋ผ๋„ ์ง€์ •ํ•œ ์ˆซ์ž๋งŒํผ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” k8s ์ดˆ๊ธฐ๋ถ€ํ„ฐ ์žˆ์—ˆ์œผ๋‚˜ ์š”์ฆ˜์€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ฑ์˜ ๋ฐฐํฌ์—๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3.2. ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ

๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ(ReplicaSet)๋Š” ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฐœ์ „ํ˜•์œผ๋กœ '์ง‘ํ•ฉ ๊ธฐ๋ฐ˜์˜ ์…€๋ ‰ํ„ฐ(set-based selector)'๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฒฝ์šฐ ์…€๋ ‰ํ„ฐ๊ฐ€ ๋“ฑํ˜ธ๊ธฐ๋ฐ˜์œผ๋กœ ๋ ˆ์ด๋ธ”์„ ์„ ํƒํ•  ๋•Œ ๊ฐ™์€์ง€ ๋‹ค๋ฅธ์ง€๋งŒ ํ™•์ธํ–ˆ์œผ๋‚˜, ์ง‘ํ•ฉ๊ธฐ๋ฐ˜์˜ ์…€๋ ‰ํ„ฐ๋Š” in, notin, exists ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๋Š” ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์›ํ•˜๋˜ rolling-update ์˜ต์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์•„ ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

3.2.1. ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๋ฅผ ์ด์šฉํ•ด ํŒŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ replicaset/replicaset-nginx.yaml์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

% kubectl apply -f replicaset-nginx.yaml
replicaset.apps/nginx-replicaset created
% kubectl get pods
nginx-replicaset-4v65n       1/1     Running   0               78s
nginx-replicaset-jhd5g       1/1     Running   0               78s
nginx-replicaset-r6hrk       1/1     Running   0               78s

์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํ…œํ”Œ๋ฆฟ ๋‚ด Kind๊ฐ€ ReplicaSet์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด replicas์— ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฐœ์ˆ˜๋Œ€๋กœ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰๋  ๋•Œ  .spec.selector.matchLabels ํ•˜์œ„์— ์ง€์ •๋œ ๋ผ๋ฒจ๊ณผ ๋™์ผํ•œ ๋ผ๋ฒจ์„ .spec.template.metadata.labels์˜ ํ•˜์œ„์—์„œ ์ฐพ์•„์„œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ replicas ์— ์ง€์ •๋œ ๊ฐœ์ˆ˜๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ด๋•Œ ํŠน์ • ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ 'kubectl delete pods <pod name>'๋กœ ์ง€์šฐ๋”๋ผ๋„ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋ ค๋ฉด ํ…œํ”Œ๋ฆฟ(*.yaml) ๋‚ด์˜ .spec.replicas ํ•„๋“œ ๊ฐ’์„ ์ˆ˜์ •ํ•œ ํ›„ 'kubectl apply -f replicaset-nginx.yaml' ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3.2.2. ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ์™€ ํŒŒ๋“œ์˜ ์—ฐ๊ด€ ๊ด€๊ณ„

ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl get pods,replicaset
NAME                             READY   STATUS    RESTARTS      AGE
pod/nginx-replicaset-4v65n       1/1     Running   0             21m
pod/nginx-replicaset-jhd5g       1/1     Running   0             22m
pod/nginx-replicaset-r6hrk       1/1     Running   0             21m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-replicaset       3         3         3       59s

์—ฌ๊ธฐ์„œ DESIRED๋Š” ๋ ˆํ”Œ๋ฆฌ์นด ์„ธํŠธ ์„ค์ •์— ์ง€์ •ํ•œ ํŒŒ๋“œ์˜ ๊ฐœ์ˆ˜์ด๋ฉฐ, CURRENT๋Š” ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์ž‘ํ•˜๋Š” ์‹ค์ œ ํŒŒ๋“œ์˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ๋„์›Œ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ ? ์—ฌ๊ธฐ์„œ ํŒŒ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๋งŒ ์ฃฝ์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ด๋Š” ํŒŒ๋“œ์™€ ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ์™€์˜ ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ๋“œ๋Š” ๋ ˆ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ์™€ ํŒŒ๋“œ๋Š” ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ์™€ ํŒŒ๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œํ•  ๋•Œ๋Š” kubectl delete replicaset <์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„> ๋ช…๋ น์œผ๋กœ ์‚ญ์ œํ•˜์ง€๋งŒ, ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๋งŒ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” --cascade=orphan ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

% kubectl delete replicaset nginx-replicaset --cascade=orphan 
replicaset.apps "nginx-replicaset" deleted

% kubectl get pods,replicaset                                
NAME                             READY   STATUS    RESTARTS      AGE
pod/nginx-replicaset-4v65n       1/1     Running   0             24m
pod/nginx-replicaset-jhd5g       1/1     Running   0             26m
pod/nginx-replicaset-r6hrk       1/1     Running   0             24m

3.3 ๋””ํ”Œ๋กœ์ด๋จผํŠธ

๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment)๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ stateless ์•ฑ์„ ๋ฐฐํฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•  ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ฑ์„ ๋ฐฐํฌํ•  ๋•Œ ๋กค๋ง ์—…๋ฐ์ดํŠธ, ์•ฑ ๋ฐฐํฌ ๋„์ค‘ ์ž ์‹œ ๋ฉˆ์ท„๋‹ค๊ฐ€ ์žฌ๋ฐฐํฌ, ๋ฐฐํฌ ํ›„ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ ๊ธฐ๋Šฅ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ์‚ฌ์šฉํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์€ ์˜ˆ์ œ deployment/deployment-nginx.yaml๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

% kubectl apply -f deployment/deployment-nginx.yaml
deployment.apps/nginx-deployment created

% kubectl get deploy,rs,rc,pods
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           69s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-dfcbd5fd6   3         3         3       69s

NAME                                   READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-dfcbd5fd6-jdtrh   1/1     Running   0          69s
pod/nginx-deployment-dfcbd5fd6-s8mx7   1/1     Running   0          69s
pod/nginx-deployment-dfcbd5fd6-x4n5d   1/1     Running   0          69s

์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํ…œํ”Œ๋ฆฟ ๋‚ด Kind๊ฐ€ Deployment์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด nginx-deployment๋ผ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์„ธํŠธ๋„ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒ์„ฑํ™•์ธ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ 'kubectl get deploy,rs,rc,pods'์—์„œ deploy๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ, rs๋Š” ๋ฆฌํ”Œ๋ฆฌ์นด์„ธํŠธ, pods๋Š” ํŒŒ๋“œ, rc๋Š” ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€๋‹ˆ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํƒœ์—์„œ nginx-deployment์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์„ค์ • ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

% kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}{'\n'}"
nginx

nginx ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1. kubectl set ๋ช…๋ น์œผ๋กœ ์ง์ ‘ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •

% kubectl set image deployment/nginx-deployment nginx-deployment=nginx:1.10.1                    
deployment.apps/nginx-deployment image updated

2. kubectl edit ๋ช…๋ น์œผ๋กœ ํ˜„์žฌ ํŒŒ๋“œ์˜ ์„ค์ • ์ •๋ณด๋ฅผ ์—ฐ ๋‹ค์Œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ •

% kubectl edit deploy nginx-deployment

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ editor(e.g. vi ์—๋””ํ„ฐ)์— ์‹คํ–‰ํ–ˆ๋˜ ํ…œํ”Œ๋ฆฟ์ด ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ๊ธฐ์„œ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก , ๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜ *.yaml ํŒŒ์ผ์€ ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.).

3. ์ฒ˜์Œ ์ ์šฉํ–ˆ๋˜ ํ…œํ”Œ๋ฆฟ์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•œ ๋‹ค์Œ kubectl apply ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์„œ ๋ณ€๊ฒฝ

์‹ค์ œ ํŒŒ์ผ๋กœ ๋‚จ๊ธฐ์— ํ•„์ž๊ฐ€ ๊ฐ€์žฅ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, ๊ฐ€์žฅ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

3.3.2. ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋กค๋ฒกํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์€ ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ๋ฒ„์ „์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด --rivision=<๋ฆฌ๋น„์ „ ์ˆซ์ž> ์˜ต์…˜์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl rollout history deploy nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>

% kubectl rollout history deploy nginx-deployment --revision=3  
deployment.apps/nginx-deployment with revision #3
Pod Template:
  Labels:       app=nginx-deployment
        pod-template-hash=748b8dbccc
  Containers:
   nginx-deployment:
    Image:      nginx:1.10.1
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

์—ฌ๊ธฐ์„œ ํŠน์ • ๋ฆฌ๋น„์ „์œผ๋กœ ์‹คํ–‰์ค‘์ธ ํŒŒ๋“œ๋ฅผ ๋˜๋Œ๋ฆฌ๋ ค๋ฉด --to-revision=<๋ฆฌ๋น„์ „ ์ˆซ์ž> ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl rollout undo deploy nginx-deployment --to-revision=3
deployment.apps/nginx-deployment rolled back

์ด๋ ‡๊ฒŒ ๋กค๋ฐฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฆฌ๋น„์ „๋งˆ๋‹ค ๋ฒ„์ „์ •๋ณด๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด ๊ด€๋ฆฌํ•˜๋ฉด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” *.yaml ํŒŒ์ผ ๋‚ด์— .metadata.annotations ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด history๋ฅผ ํ™•์ธํ•  ๋•Œ CHANGE-CAUSE์— ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๊ธฐ์žฌ๋ฉ๋‹ˆ๋‹ค. 

metadata:
  name: nginx-deployment
  labels:
    app: nginx-deployment
  annotations:
    kubernetes.io/change-cause: version 1.10.1

3.3.3. ํŒŒ๋“œ ๊ฐœ์ˆ˜ ์กฐ์ •ํ•˜๊ธฐ

์‹คํ–‰ ์ค‘์ธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋ ค๋ฉด kubectl scale ๋ช…๋ น์— --replicas ์˜ต์…˜์œผ๋กœ ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl scale deploy nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled

3.3.4. ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฐฐํฌ ์ •์ง€, ๋ฐฐํฌ ์žฌ๊ฐœ, ์žฌ์‹œ์ž‘ํ•˜๊ธฐ

kubectl rollout ๋ช…๋ น์„ ์ด์šฉํ•ด์„œ ์ง„ํ–‰์ค‘์ธ ๋ฐฐํฌ๋ฅผ pause๋ฅผ ํ†ตํ•ด ์ž ์‹œ ๋ฉˆ์ท„๋‹ค๊ฐ€ resume์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl rollout pause deployment/nginx-deployment
% kubectl rollout resume deploy/nginx-deployment

pause๋ฅผ ํ†ตํ•ด ๋ฉˆ์ถ˜ ์ƒํƒœ์—์„œ set, patch์™€ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ์ˆ˜์ •ํ•œ ํ›„ resume์„ ํ†ตํ•ด ์žฌ๊ฐœํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

% kubectl set image deploy/nginx-deployment nginx-deployment=nginx:1.11
deployment.apps/nginx-deployment image updated
% kubectl patch deployment/nginx-deployment -p "{\"metadata\":{\"annotations\":{\"kubernetes.io/change-cause\":\"version 1.11\"}}}"
deployment.apps/nginx-deployment patched

3.3.5. ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ƒํƒœ

๋ฐฐํฌ ์ค‘์—๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  Progressing ์ƒํƒœ์˜€๋‹ค๊ฐ€ ์„ฑ๊ณต์ด๋ฉด Complete, ์‹คํŒจ๋ฉด Failed ์ƒํƒœ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. kubectl rollout status ๋ช…๋ น์œผ๋กœ ๋ฐฐํฌ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ…œํ”Œ๋ฆฟ์— .spec.progressDeadlineSeconds ํ•ญ๋ชฉ์ด ์žˆ์„ ๊ฒฝ์šฐ, ์—ฌ๊ธฐ์„œ ์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์„ ๋•Œ๊นŒ์ง€ ๋ฐฐํฌ๋ฅผ ํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์ƒํƒœ๋ฅผ false๋กœ ๋ฐ”๋€Œ๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.4. ๋ฐ๋ชฌ์„ธํŠธ

๋ฐ๋ชฌ์„ธํŠธ(Daemonset)๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ๋…ธ๋“œ์— ํŠน์ • ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์ƒˆ๋กญ๊ฒŒ ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ๋ฐ๋ชฌ์„ธํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋น ์งˆ๋•Œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ์žˆ๋–ค ํŒŒ๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ๋ผ์งˆ ๋ฟ ๋‹ค๋ฅธ๊ณณ์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ€์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ๋ชฌ์„ธํŠธ๋Š” ๋ณดํ†ต ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง์šฉ ๋ฐ๋ชฌ ๋“ฑ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์— ํ•ญ์ƒ ์‹คํ–‰์‹œ์ผœ๋‘์–ด์•ผ ํ•˜๋Š” ํŒŒ๋“œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3.4.1. ๋ฐ๋ชฌ์„ธํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฐ๋ชฌ์„ธํŠธ๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ์ˆ˜์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ daemonset/daemonset.yaml์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ .metadata.namespace ํ•„๋“œ๊ฐ’์œผ๋กœ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ, ๋ฐ๋ชฌ์„ธํŠธ์˜ ํŒŒ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ RollingUpdate(๊ธฐ๋ณธ๊ฐ’)๋กœ ์„ค์ •ํ•˜์—ฌ ํƒฌํ”Œ๋ฆฟ ๋ณ€๊ฒฝ์‹œ ๋ฐ”๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ .spec.updateStrategy.rollingUpdate.maxUnavailable ํ•„๋“œ๋กœ ํ•œ๋ฒˆ์— ์‚ญ์ œํ•˜๋Š” ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, .spec.minReadySeconds ํ•„๋“œ๋กœ ์ƒˆ๋กœ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ๊ฐ€ ์ค€๋น„์ƒํƒœ๊ฐ€ ๋˜๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl apply -f daemonset/daemonset.yaml
daemonset.apps/fluentd-elasticsearch created
% kubectl get daemonset -n kube-system
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
fluentd-elasticsearch   1         1         1       1            1           <none>                   14s
kube-proxy              1         1         1       1            1           kubernetes.io/os=linux   67d

 3.4.2. ๋ฐ๋ชฌ์„ธํŠธ์˜ ํŒŒ๋“œ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝํ•˜๊ธฐ

'kubectl edit daemonset fluentd-elasticsearch -n kube-system' ๋ช…๋ น์œผ๋กœ ์•ž์—์„œ ์‹คํ–‰ํ•œ ๋ฐ๋ชฌ์„ธํŠธ์˜ ์„ค์ •์„ ์—ด์–ด ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋กœ .spec.template.spec.containers[].env[].value ํ•„๋“œ๊ฐ’์„ value01๋กœ ๋ฐ”๊พธ๊ณ  ์ €์žฅํ•˜์˜€์œผ๋ฉฐ, ํ˜„์žฌ ์—…๋ฐ์ดํŠธ๋ฐฉ์‹์ด RollingUpdate์ด๋ฏ€๋กœ ํŒŒ๋“œ๋Š” ์ฆ‰์‹œ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. 'kubectl describe daemonset -n kube-system'์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl edit daemonset fluentd-elasticsearch -n kube-system
% kubectl describe daemonset -n kube-system

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์ด RollingUpdate๊ฐ€ ์•„๋‹Œ OnDelete๋ผ๋ฉด? ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ๋ฐ๋ชฌ์„ธํŠธ๋กœ ์‹คํ–‰ํ•œ ํŒŒ๋“œ๋ฅผ ์ง์ ‘ ์ง€์›Œ์•ผ ํ•ด๋‹น ๋…ธ๋“œ์— ์ƒˆ๋กœ์šด ํƒฌํ”Œ๋ฆฟ๋ฒ„์ „์˜ ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด .spec.template.spec.containers[].env[].value ํ•„๋“œ๊ฐ’์„ value02๋กœ, .spec.updateStrategy.type ํ•„๋“œ๊ฐ’์„ OnDelete๋กœ ๋ณ€๊ฒฝ ํ›„ 'kubectl get daemonset -n kube-system'๋กœ ๋ฐ๋ชฌ์„ธํŠธ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด? UP-TO-DATE ํ•ญ๋ชฉ์ด 0์œผ๋กœ ๋ณ€๊ฒฝ์€ ํ–ˆ์œผ๋‚˜ ์ตœ์‹  ์„ค์ •์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

% kubectl delete pods [ํŒŒ๋“œ์ด๋ฆ„] -n kube-system

์ด๋•Œ ์œ„์™€ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ํ•ด๋‹นํŒŒ๋“œ๋ฅผ ์ง€์› ๋‹ค๊ฐ€ ๋‹ค์‹œ 'kubectl describe daemonset -n kube-system'๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๋ฐ๋ชฌ์„ธํŠธ๊ฐ€ ์ตœ์‹ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

3.5. ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ

์•ž์„œ ๋ฐฐ์› ๋˜ 1,2,3์ ˆ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์€ ๋ชจ๋‘ ์ƒํƒœ๊ฐ€ ์—†๋Š”(Stateless) ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„์˜€์œผ๋ฉฐ, ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ(StatefullSets)๋Š” ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ํŒŒ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณผ๋ฅจ(volume)์„ ์‚ฌ์šฉํ•ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ํ›„ ํŒŒ๋“œ๋ฅผ ์žฌ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ ์‚ฌ์ด์— ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์–ด๋– ํ•œ ์ƒํƒœ๊ฐ€ ์žˆ์–ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3.5.1. ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ statefulset/statefulset.yaml์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์˜ kind๋Š” Service๋กœ 7์žฅ์—์„œ ์„ค๋ช…ํ•  ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” .spec.serviceName ํ•„๋“œ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ์—์„œ ๋งŒ๋“ค์–ด์ง„ ํŒŒ๋“œ ์ด๋ฆ„์„ ์กฐํ•ฉํ•˜๋ฉด k8s ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋„๋ฉ”์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค([ํŒŒ๋“œ์ด๋ฆ„].[์„œ๋น„์Šค์ด๋ฆ„] ํ˜•์‹). ์ถ”๊ฐ€๋กœ .spec.template.spec.terminationGracePeriodSeconds ํ•„๋“œ๋กœ ๊ทธ๋ ˆ์ด์Šคํ’€์˜ ๋Œ€๊ธฐ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ทธ๋ ˆ์ด์Šคํ’€์ด๋ž€? ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ ๋ฐ”๋กœ ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•˜๋˜ ์ž‘์—…์„ ๋งˆ๋ฌด๋ฆฌ ํ›„ ์ •์ƒ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

% kubectl apply -f statefulset/statefulset.yaml
service/nginx-statefulset-service created
statefulset.apps/web created

% kubectl get svc,statefulset,pods
NAME                                TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes                  ClusterIP   10.96.0.1    <none>        443/TCP   67d
service/nginx-statefulset-service   ClusterIP   None         <none>        80/TCP    2m26s

NAME                   READY   AGE
statefulset.apps/web   3/3     2m26s

NAME                        READY   STATUS    RESTARTS   AGE
pod/kubernetes-simple-pod   1/1     Running   2          14d
pod/web-0                   1/1     Running   0          2m26s
pod/web-1                   1/1     Running   0          2m16s
pod/web-2                   1/1     Running   0          2m13s

๊ธฐ์กด๊ณผ ๋‹ค๋ฅด๊ฒŒ ํŒŒ๋“œ์ด๋ฆ„์˜ UUID ํ˜•์‹์˜ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋ถ™๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ web- ์ด๋ž€ ์ด๋ฆ„ ๋’ค์— 0,1,2์ฒ˜๋Ÿผ ์ˆซ์ž๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋ถ™๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•ด๋‹น ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜์–ด ์•ž์— ๊ฒƒ์ด ์ •์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋’ค์˜ ํŒŒ๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ ์‚ญ์ œ๋Š” ์‹คํ–‰์˜ ์—ญ์ˆœ์ด๋ฉฐ, .spec.replicas ํ•„๋“œ๊ฐ’์„ ์ค„์ด๋ฉด ํฐ ์ˆ˜๋ถ€ํ„ฐ ์ค„์ธ ์ˆซ์ž ๊ฐœ์ˆ˜๋งŒํผ ์‚ญ์ œ๋œ๋‹ค.

% kubectl edit statefulset webโ€‹

์œ„์˜ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰์ค‘์ธ ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ์˜ ์„ค์ •์—์„œ .spec.replicas ํ•„๋“œ๊ฐ’์„ 3์—์„œ 2๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด web-2 ํŒŒ๋“œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

3.5.2. ํŒŒ๋“œ๋ฅผ ์ˆœ์„œ ์—†์ด ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒํ•˜๊ธฐ

์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ์˜ ๊ธฐ๋ณธ๋™์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ํŒŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ .spec.podManagementPolicy ํ•„๋“œ๋กœ ์ˆœ์„œ๋ฅผ ์—†์•จ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์€ OrderedReady์ด๊ณ  ํŒŒ๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ์ด๋ฅผ Parallel๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํŒŒ๋“œ๋“ค์ด ์ˆœ์„œ์—†์ด ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ์—์„  ์ด๋ฅผ ๋ณ€๊ฒฝํ• ์ˆ˜ ์—†๋‹ค๊ณ  ํ•˜๋‹ˆ ์ƒˆ๋กœ์šด ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ๋ฅผ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ๋ฅผ ์ด์šฉํ•ด ํŒŒ๋“œ๋ฅผ ์ˆœ์„œ ์—†์ด ์‹คํ–‰/์ข…๋ฃŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ statefulset/statefulset-parallel.yaml์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ด์ „๊ณผ ๋‹ค๋ฅด๊ฒŒ ํŒŒ๋“œ๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ๋งŒ๋“ค์–ด์ง€๋ฉฐ, replicas๋ฅผ ์กฐ์ •ํ•˜๋”๋ผ๋„ ๋žœ๋ค์œผ๋กœ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.5.3. ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ๋กœ ํŒŒ๋“œ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ์˜ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•์€ .spec.updateStrategy.type ํ•„๋“œ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์€ RollingUpdate์ด๋ฉฐ ํƒฌํ”Œ๋ฆฟ ๋ณ€๊ฒฝ์‹œ ์ž๋™์œผ๋กœ ์˜ˆ์ „ ํŒŒ๋“œ ์‚ญ์ œ ํ›„ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

web ์Šคํ…Œ์ดํŠธํ’€ ์„ธํŠธ์— kubectl edit statefulset web ๋ช…๋ น์„ ์‹คํ–‰ํ•ด .spec.template.spec.containers[].env[] ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ํƒฌํ”Œ๋ฆฟ์„ ๋ณ€๊ฒฝํ•จ์— ๋”ฐ๋ผ ํŒŒ๋“œ๋“ค์ด ์žฌ์‹œ์ž‘๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ .spec.updateStrategy. rollingUpdate.partition ํ•„๋“œ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ํ•ด๋‹น ํ•„๋“œ์— ์ง€์ •๋œ ๊ฐ’๋ณด๋‹ค ํฐ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ํŒŒ๋“œ๋“ค๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉ์‹œํ‚จ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ๋“œ๋“ค์„ ๋ถ„ํ• ํ•˜๋Š” ์—ญํ• ์ด๋ฉฐ, ์ด ๊ฐ’์„ 1๋กœ ์ง€์ •ํ•˜๊ณ  .spec.containers[].env[].value ํ•„๋“œ๊ฐ’์„ testvalue04๋กœ ๋ณ€๊ฒฝํ•ด ์ €์žฅํ•ด๋ณด๋ฉด partition ํ•„๋“œ์— ๊ฐ’๋ณด๋‹ค ํฐ 1, 2๋ฒˆ ํŒŒ๋“œ๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl get pods -o jsonpath="{range .items[*]}{.metadata.name}{.spec.containers[0].env}{'\n'}{end}"

๋งŒ์•ฝ partition ํ•„๋“œ ๊ฐ’์ด replicas ํ•„๋“œ๋ณด๋‹ค ํฌ๋‹ค๋ฉด .spec.template ํ•„๋“œ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์–ด๋„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

% kubectl describe pod web-0

 ์œ„ ๋ช…๋ น์œผ๋กœ ํŒŒ๋“œ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด labels ํ•ญ๋ชฉ์— statefulset.kubernetes.io/pod-name=web-0์ฒ˜๋Ÿผ ๋ ˆ์ด๋ธ”์ด ์ถ”๊ฐ€๋œ ๊ฒƒ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ ˆ์ด๋ธ”์„ ์ด์šฉํ•˜๋ฉด ์Šคํ…Œ์ดํŠธํ’€์„ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ „์ฒด ํŒŒ๋“œ์ค‘ ํŠน์ • ํŒŒ๋“œ์—๋งŒ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์„œ๋น„์Šค

์„œ๋น„์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” IP ํ•˜๋‚˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ณธ์งˆ์ ์œผ๋กœ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ์ž…๋‹ˆ๋‹ค. ์ด์žฅ์—์„œ๋Š” ์„œ๋น„์Šค์˜ ๊ฐœ๋…, ํƒ€์ž…, ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋‹ค๋ฃจ๋Š” kube-proxy๋„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

4.1. ์„œ๋น„์Šค์˜ ๊ฐœ๋…

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ํŒŒ๋“œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ํŒŒ๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ํ•œ๊ตฐ๋ฐ์— ๊ณ ์ •ํ•ด์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์„ ์˜ฎ๊ฒจ ๋‹ค๋‹™๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋…ธ๋“œ๋ฅผ ์˜ฎ๊ธฐ๋ฉด์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ํŒŒ๋“œ์˜ IP๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ํŒŒ๋“œ๋“ค์— ๊ณ ์ •์ ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ์–ด๋””์— ์žˆ๋“  ๊ณ ์ • ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. '5. ์ธ๊ทธ๋ ˆ์Šค(์ฑ… ๋‚ด 8์žฅ)'์—์„œ ์„ค๋ช…ํ•  ์ธ๊ทธ๋ ˆ์Šค๋กœ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋น„์Šค๋Š” ์ฃผ๋กœ L4 ์˜์—ญ์ด๋ฉฐ ์ธ๊ทธ๋ ˆ์Šค๋Š” L7 ์˜์—ญ์—์„œ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

4.2. ์„œ๋น„์Šค ํƒ€์ž…

์„œ๋น„์Šค ํƒ€์ž…์—๋Š” ํฌ๊ฒŒ ๋„ค๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ClusterIP:
    • ๊ธฐ๋ณธ ์„œ๋น„์Šค ํƒ€์ž…์ด๋ฉฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ๋Š” ์ด์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ๋…ธ๋“œ๋‚˜ ํŒŒ๋“œ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. 
  • NodePort:
    • ์„œ๋น„์Šค ํ•˜๋‚˜์— ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ง€์ •๋œ ํฌํŠธ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • ๋…ธ๋“œ์— ์ƒ๊ด€์—†์ด ์„œ๋น„์Šค์— ์ง€์ •๋œ ํฌํŠธ๋ฒˆํ˜ธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋…ธ๋“œ์˜ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
  • LoadBalancer:
    • AWS, GCP ๊ฐ™์€ ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค, ์˜คํ”ˆ์Šคํƒ๊ฐ™์€ ํ”„๋ผ์ด๋น— ํด๋ผ์šฐ๋“œ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์žฅ๋น„์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์šฐ๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์™€ ํŒŒ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ ํ›„ ํ•ด๋‹น ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์˜ IP๋ฅผ ์ด์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
    • kubectl get service ๋ช…๋ น์œผ๋กœ ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ฉด EXTERNAL -IP ํ•ญ๋ชฉ์— ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ IP๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ํŒŒ๋“œ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
  • ExternalName: 
    • ์„œ๋น„์Šค๋ฅผ .spec.externalName ํ•„๋“œ์— ์„ค์ •ํ•œ ๊ฐ’๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ์™ธ๋ถ€์— ์ ‘๊ทผํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์„œ๋น„์Šค๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ์ ‘๊ทผํ•˜๋ฉด ์„ค์ •ํ•ด๋‘” CNAME ๊ฐ’์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ ์„ค์ •ํ•  ๋•Œ ์…€๋ ‰ํ„ฐ(spec.selector ํ•„๋“œ)๊ฐ€ ํ•„์š”์—†์Šต๋‹ˆ๋‹ค.

4.3. ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋น„์Šค ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” service/service.yaml ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  clusterIP: 10.0.10.10
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
  • .spec.type ํ•„๋“œ์—์„œ ์„œ๋น„์Šค ํƒ€์ž…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .spec.type ํ•„๋“œ ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ํƒ€์ž…์ธ ClusterIP์ž…๋‹ˆ๋‹ค.
  • .spec.clusterIP ํ•„๋“œ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ IP ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  • .spec.selector ํ•„๋“œ์—๋Š” ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐํ•  ํŒŒ๋“œ์— ์„ค์ •ํ•œ .labels ํ•„๋“œ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • .spec.ports[] ํ•„๋“œ๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค์—์„œ ํ•œ๊บผ๋ฒˆ์— ํฌํŠธ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์™ธ๋ถ€์— ์ œ๊ณตํ•  ๋•Œ๋Š” .spec.ports[] ํ•˜์œ„์— ํ•„๋“œ ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๋ถ€ํ„ฐ ์„œ๋น„์Šค ํƒ€์ž… ๊ฐ๊ฐ์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋กœ ์ƒ์„ฑํ•˜๋Š” ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•  ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

% kubectl create deployment nginx-for-service --image=nginx --replicas=2 --port=80 
deployment.apps/nginx-for-service created

nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” nginx-for-service๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ๋“œ์ž…๋‹ˆ๋‹ค. ํฌํŠธ ๋ฒˆํ˜ธ๋Š” 80, ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ๋ ˆ์ด๋ธ”์€ ํ‚ค app, ๊ฐ’์€ nginx-for-svc๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

4.3.1. ClusterIP ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋น„์Šคํƒ€์ž…์ด ClustreIP์ธ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์„ค์ •์€ service/clusterip.yaml ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

% kubectl apply -f ./service/clusterip.yaml     
service/clusterip-service created
% kubectl get svc
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
clusterip-service           ClusterIP   10.104.210.96   <none>        80/TCP    72s
kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP   80d
nginx-statefulset-service   ClusterIP   None            <none>        80/TCP    13d
  • TYPE ํ•ญ๋ชฉ์ด ClusterIP๊ณ  CLUSTER-IP ํ•ญ๋ชฉ์— 10.104.210.96๋กœ ํด๋Ÿฌ์Šคํ„ฐ IP๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, PORT๋Š” 80 ํฌํŠธ์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ClusterIP์€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์™ธ๋ถ€ IP๊ฐ€ ์—†์œผ๋ฏ€๋กœ EXTERNAL-IP ํ•ญ๋ชฉ์€ <none>์ž…๋‹ˆ๋‹ค.

kubectl describe service <NAME>์œผ๋กœ ํ•ด๋‹น ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋”์šฑ ์ž์„ธํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl describe service clusterip-service
Name:              clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-for-svc
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.104.210.96
IPs:               10.104.210.96
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.1.0.22:80
Session Affinity:  None
Events:            <none>
์ด์ œ 10.104.210.96๋ผ๋Š” IP๋กœ ํŒŒ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ IP๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” IP ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— ํŒŒ๋“œ๋ฅผ ํ•˜๋‚˜ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น ํŒŒ๋“œ ์•ˆ์—์„œ ์•ž์„œ ๋งŒ๋“  ํด๋Ÿฌ์Šคํ„ฐ IP๋กœ ์ ‘์†ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ netshoot ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
% kubectl run -it --image nicolaka/netshoot testnet -- bash

bash-5.0# curl 10.104.210.96
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

4.3.2. NodePort ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋น„์Šคํƒ€์ž…์ด NodePort์ธ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์„ค์ •์€ service/nodeport.yaml ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

% kubectl apply -f ./service/nodeport.yaml
service/nodeport-service created

NodePort์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํฌํŠธ๋กœ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” .spec.ports[].nodePort: 30080๋กœ ํฌํŠธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:30080์œผ๋กœ ์ ‘์†ํ•˜๋ฉด nginx ๊ธฐ๋ณธ ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.3.3. LoadBalancer ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋น„์Šคํƒ€์ž…์ด LoadBalancer์ธ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์„ค์ •์€ service/loadbalancer.yaml ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

% kubectl apply -f ./service/loadbalancer.yaml
service/loadbalancer-service created

% kubectl get svc
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)       80d
loadbalancer-service        LoadBalancer   10.104.228.235   localhost     80:30920/TCP   58s

ํ˜„์žฌ ์‹ค์Šตํ™˜๊ฒฝ์ด ๋„์ปค ๋ฐ์ŠคํŠธํ†ฑ์ด๊ธฐ์— ์™ธ๋ถ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์—†์–ด EXTERNAL-IP ํ•ญ๋ชฉ์ด localhost๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์™ธ๋ถ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์™€ ์—ฐ๊ณ„๋˜์–ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์„ค์ •๋œ ์ƒํƒœ๋ผ๋ฉด ์‹ค์ œ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ IP๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4.3.3. ExternalName ํƒ€์ž… ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์„œ๋น„์Šคํƒ€์ž…์ด ExternalName์ธ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์„ค์ •์€ service/externalname.yaml ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

% kubectl apply -f ./service/externalname.yaml
service/externalname-service created

% kubectl get svc                             
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
externalname-service        ExternalName   <none>           google.com    <none>         15s

 ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ CLUSTER-IP ํ•ญ๋ชฉ์ด <none>์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ EXTERNAL-IP๋Š” .spec.externalName์—์„œ ์„ค์ •ํ•œ google.com์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

% kubectl run -it --image nicolaka/netshoot testnet -- bash

bash-5.0# curl externalname-service.default.svc.cluster.local
<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 404 (Not Found)!!1</title>
...

ExternalName ํƒ€์ž… ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ๋„๋ฉ”์ธ์€ externalname-service.default.svc.cluster.local์ด๋ฉฐ, curl๋กœ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ ‘์†๋ณด๋ฉด ์‹ค์ œ google.com์˜ HTML ๋งˆํฌ์—…์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.4. ํ—ค๋“œ๋ฆฌ์Šค ์„œ๋น„์Šค

.spec.clusterIP ํ•„๋“œ ๊ฐ’์„ None์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ IP๊ฐ€ ์—†๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ—ค๋“œ๋ฆฌ์Šค ์„œ๋น„์Šค๋ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์ด ํ•„์š” ์—†๊ฑฐ๋‚˜ ๋‹จ์ผ ์„œ๋น„์Šค IP๊ฐ€ ํ•„์š”์—†์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋“œ๋ฆฌ์Šค ์„œ๋น„์Šค์— ์…€๋ ‰ํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์…€๋ ‰ํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์œผ๋ฉฐ ์…€๋ ‰ํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„ DNS ์‹œ์Šคํ…œ์€ ExternalName ํƒ€์ž…์˜ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•œ CNAME ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

% kubectl apply -f ./service/headless.yaml    
service/headless-service created

% kubectl get svc
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
headless-service            ClusterIP      None             <none>        80/TCP         7s

% kubectl describe svc headless-service
...
Endpoints:         10.1.0.22:80

IP ํ•ญ๋ชฉ์€ None์ด์ง€๋งŒ Endpoints ํ•ญ๋ชฉ์—๋Š” .spec.selectorํ•„๋“œ์—์„œ  ์„ ํƒํ•œ ์กฐ๊ฑด์— ๋งž๋Š” ํŒŒ๋“œ๋“ค์˜ IP์™€ ํฌํŠธ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

DNS A ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด nicolaka/netshoot ์ด๋ฏธ๋ฅผ ์ด์šฉํ•œ ํŒŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  dig <๋„๋ฉ”์ธ ์ด๋ฆ„> ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

% kubectl run -it --image nicolaka/netshoot testnet -- bash

bash-5.0# dig headless-service.default.svc/cluster.local

4.5. kube-proxy

kube-proxy๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ IP๋‚˜ ๋…ธ๋“œ ํฌํŠธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ์‹ค์ œ ์กฐ์ž‘์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฉด์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ IP๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ์š”์ฒญ์„ ์ ์ ˆํ•œ ํŒŒ๋“œ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

kube-proxy๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ userspace, iptables, IPVS๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์— userspace๊ฐ€ ๊ธฐ๋ณธ ๊ด€๋ฆฌ๋ชจ๋“œ์˜€๊ณ  ํ˜„์žฌ iptables๊ฐ€ ๊ธฐ๋ณธ ๊ด€๋ฆฌ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” IPVS๋กœ ๊ธฐ๋ณธ ๊ด€๋ฆฌ ๋ชจ๋“œ๊ฐ€ ๋ฐ”๋€” ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

4.5.1. userspace ๋ชจ๋“œ

https://kubernetes.io/ko/docs/concepts/services-networking/service/#proxy-mode-userspace
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์š”์ฒญ์„ ํ•˜๋ฉด iptable์„ ๊ฑฐ์ณ์„œ kube-proxy๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP๋Š” ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ์ ์ ˆํ•œ ํŒŒ๋“œ๋กœ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.
  • ์ด๋•Œ ์š”์ฒญ์„ ๋‚˜์›Œ์ค„ ๋•Œ๋Š” ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

4.5.2. iptables ๋ชจ๋“œ

https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-iptables
  • userspace ๋ชจ๋“œ์™€ ๋‹ค๋ฅธ ์ ์€ kube-proxy๊ฐ€ iptable๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜์—ฌ, ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.5.3. IPVS ๋ชจ๋“œ

https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-ipvs
  • IPVS ๋ชจ๋“œ๋Š” ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ์•ˆ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ํ”„๋ ˆ์ž„์›Œํฌ์ธ ๋„ทํ•„ํ„ฐ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” L4 ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IPVS ์ปค๋„ ๋ชจ๋“ˆ์ด ๋…ธ๋“œ์— ์„ค์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
  • IPVS ๋ชจ๋“œ๋Š” ์ปค๋„ ๊ณต๊ฐ„์—์„œ ๋™์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— iptables ๋ชจ๋“œ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ƒ…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋” ๋งŽ์€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์–ด์„œ ์ด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • ์ •์›์ฒœ, ํ™์„์šฉ, ์ •๊ฒฝ๋ก, ๊ณต์šฉ์ค€. ใ€Ž์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: 90๊ฐ€์ง€ ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์ž๋™ํ™” ํ‘œ์ค€ใ€. ์˜ฎ๊ธด์ด(์—ญ). ๋™์–‘๋ถ์Šค(๋™์–‘books), 2020.01.
  • [Github] kubernetes-book-sample: https://github.com/arisu1000/kubernetes-book-sample
  • [Official Docs] Hello Minikube: https://kubernetes.io/docs/tutorials/hello-minikube/
  • [Official Docs] : https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Study: DeveloperTools(DevTool) > DevTool: Container' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Docker] ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ tar ํŒŒ์ผ๋กœ ์ €์žฅ (export / import / save / load)  (0) 2023.10.10
[Docker] Slicon M1 Mac์—์„œ Lima๋กœ Docker Desktop ๋Œ€์ฒด ํ•˜๊ธฐ  (0) 2023.04.28
[Kubernetes] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: Part I. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์ž‘ํ•˜๊ธฐ  (0) 2023.02.23
[Docker] docker-compose์—์„œ links์™€ depends_on์˜ ์ฐจ์ด์   (0) 2023.01.11
[Docker] ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•  (0) 2022.12.20
    'Study: DeveloperTools(DevTool)/DevTool: Container' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Docker] ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ tar ํŒŒ์ผ๋กœ ์ €์žฅ (export / import / save / load)
    • [Docker] Slicon M1 Mac์—์„œ Lima๋กœ Docker Desktop ๋Œ€์ฒด ํ•˜๊ธฐ
    • [Kubernetes] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž…๋ฌธ: Part I. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์ž‘ํ•˜๊ธฐ
    • [Docker] docker-compose์—์„œ links์™€ depends_on์˜ ์ฐจ์ด์ 
    DrawingProcess
    DrawingProcess
    ๊ณผ์ •์„ ๊ทธ๋ฆฌ์ž!

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”