๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Kubernetes

[Kubernetes] ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• : ์ธ๊ทธ๋ ˆ์Šค(Ingress)

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
 

Kubernetes


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ ์š”์ฒญ(์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ)์ด ๋“ค์–ด์™”์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ธ๊ทธ๋ ˆ์Šค(Ingress) ๋ผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

1. ์„œ๋น„์Šค vs ์ธ๊ทธ๋ ˆ์Šค

๋จผ์ € ์ธ๊ทธ๋ ˆ์Šค๋ผ๋Š” ์šฉ์–ด์˜ ์ •์˜์— ๋Œ€ํ•ด์„œ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž. ์ธ๊ทธ๋ ˆ์Šค๋ž€, ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ ํ–ฅํ•˜๋Š” ๊ฒƒ์„ ์ผ์ปซ๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์ธ๊ทธ๋ ˆ์Šค ํŠธ๋ž˜ํ”ฝ์ด๋ผ ํ•จ์€ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ ํ–ฅํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋งํ•˜๊ณ , ์ธ๊ทธ๋ ˆ์Šค ๋„คํŠธ์›Œํฌ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ ํ–ฅํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ(์ธ๊ทธ๋ ˆ์Šค ํŠธ๋ž˜ํ”ฝ)์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

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

 

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

 

์ธ๊ทธ๋ ˆ์Šค์™€ ์„œ๋น„์Šค์˜ ์ฐจ์ด

 

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

 

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

 

  • ์™ธ๋ถ€ ์š”์ฒญ์˜ ๋ผ์šฐํŒ… : ์˜ˆ๋ฅผ ๋“ค์–ด, /predict, /zedd ์ฒ˜๋Ÿผ ํŠน์ • ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์–ด๋– ํ•œ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ• ์ง€ ์ •์˜ํ•˜๋Š” ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ •์˜
  • ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ : ๊ฐ™์€ IP ์ฃผ์†Œ์— ๋Œ€ํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ์ด ๋„์ฐฉํ–ˆ์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ์ •์˜
  • SSL/TLS ๋ณด์•ˆ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋น„์Šค๋กœ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•  ๋•Œ, ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ธ์ฆ์„œ๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉ

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

2. ์ธ๊ทธ๋ ˆ์Šค๋Š” ์™œ ํ•„์š”ํ•œ๊ฐ€?

1๋ฒˆ ๋ชฉ์ฐจ์˜ ๋‚ด์šฉ ๋ง๋ฏธ์—์„œ ์†Œ๊ฐœํ•œ ์ธ๊ทธ๋ ˆ์Šค์˜ ๋Œ€ํ‘œ์ ์ธ 3๊ฐ€์ง€ ๊ธฐ๋Šฅ๋งŒ ๋ณด์•˜์„ ๋•Œ๋Š” ๊ตณ์ด ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์„œ๋„ ํ•ด๋‹น ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์€๊ฐ€? ์— ๋Œ€ํ•ด์„œ๋„ ์˜๋ฌธ์„ ํ’ˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ ๊ทธ ์ค‘์—์„œ๋„ NodePort ๋‚˜ LoadBalancer ์œ ํ˜•์˜ ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ์ธ๊ทธ๋ ˆ์Šค ํŠธ๋ž˜ํ”ฝ์„ ๋ถ€ํ•˜ ๋ถ„์‚ฐ(๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ)ํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š” ๋“ฑ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋น„์Šค๋งŒ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋” ํฐ ์žฅ์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด ์žฅ์ ์„ ์ฒด๊ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋น„์Šค๋งŒ์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ์„œ๋น„์Šค์™€ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฐจ์ด์ ์„ ๋น„๊ตํ•ด๋ณด๋„๋ก ํ•˜์ž. ๋จผ์ € ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

 

์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์„œ๋น„์Šค๋กœ๋งŒ ์šด์˜ํ•  ๊ฒฝ์šฐ

 

A, B, C ๋ผ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์‹ค์งˆ์ ์ธ ์›น์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋“œ๋Š” Deployment๋กœ ๋ฐฐํฌํ–ˆ๊ณ , Deployment๋„ ๊ฐ ์„œ๋น„์Šค์— ๋”ฐ๋ผ A, B, C๋กœ ๊ฐ๊ฐ ๋ฐฐํฌํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  ์ด Deployment๋“ค์„ ์™ธ๋ถ€(Client)์—์„œ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ Deployment์— ๋Œ€ํ•ด์„œ ์„œ๋น„์Šค๋„ ํ•จ๊ป˜ ๋ฐฐํฌํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. 

 

๊ทธ๋Ÿฐ๋ฐ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” A, B, C ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๋ผ์šฐํŒ… ๊ทœ์น™์ด๋‚˜ SSL/TLS ์„ค์ •๊ฐ’ ๋“ฑ์ด ๋ชจ๋‘ ๋™์ผํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ณดํ†ต์€ ๋‹ค๋ฅผ ํ™•๋ฅ ์ด ๋†’๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด k8s๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ๊ฐ ์„ค์ •๊ฐ’์„ ์„œ๋น„์Šค ๋˜๋Š” Deployment์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ๋งˆ๋‹ค ๋ณ„๋„๋กœ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

 

์„œ๋น„์Šค๋กœ๋งŒ ์šด์˜ํ•œ๋‹ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋งˆ๋‹ค ์„ค์ •๊ฐ’์„ ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผ ํ•จ

 

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

 

ํ•˜์ง€๋งŒ ์ธ๊ทธ๋ ˆ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด URL ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ด๋ ‡๊ฒŒ ๊ด€๋ฆฌํฌ์ธํŠธ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์ถ”๊ฐ€๋œ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์ถ”๊ฐ€๋œ ๊ตฌ์กฐ

 

์œ„์™€ ๊ฐ™์ด ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์„œ๋น„์Šค ์•ž๋‹จ์— ์ถ”๊ฐ€๊ฐ€ ๋˜๋ฉด ์™ธ๋ถ€(ํด๋ผ์ด์–ธํŠธ) ์ž…์žฅ์—์„œ๋Š” 3๊ฐœ์˜ ์„œ๋น„์Šค์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ URL ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํžˆ ์ธ๊ทธ๋ ˆ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ URL ์—”๋“œํฌ์ธํŠธ๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” 1๊ฐœ์˜ ์ธ๊ทธ๋ ˆ์Šค URL๋กœ ์ ‘๊ทผ ํ•˜๊ฒŒ ๋˜๋ฉด ์ธ๊ทธ๋ ˆ์Šค์— ์ •์˜๋œ ๊ทœ์น™์— ๋”ฐ๋ผ ์š”์ฒญ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค Deployment์— ์ „๋‹ฌ๋ ์ง€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์ถ”๊ฐ€๋จ์œผ๋กœ์จ ์•„๊นŒ ์„œ๋น„์Šค๋งŒ ์žˆ๋˜ ๊ตฌ์กฐ์—์„œ ๋ฐœ๊ฒฌ๋˜์—ˆ๋˜ ํ•œ๊ณ„์ ์ธ "๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค" ๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค. ์ฆ‰, ์ธ๊ทธ๋ ˆ์Šค๋ผ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ 1๊ฐœ๋งŒ์œผ๋กœ ๊ฐ ์„œ๋น„์Šค ๋˜๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ์ ์šฉ๋  ์„ค์ •๊ฐ’์„ ๋งˆ์น˜ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ์…ˆ์ด๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ธ๊ทธ๋ ˆ์Šค์˜ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์ด๋‹ค.

 

์„œ๋น„์Šค์— ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ผ์šฐํŒ… ๊ทœ์น™ ๋ช…์‹œ์ด๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ์ž ์‹œ ์‚ดํŽด๋ณด์ž. ๋จผ์ € ์ธ๊ทธ๋ ˆ์Šค์™€ ์„œ๋น„์Šค ๊ฐ„์˜ ์ฐจ์ด์ ์„ ๋„คํŠธ์›Œํฌ OSI 7 ๊ณ„์ธต ๊ด€์ ์—์„œ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋จผ์ € ์ธ๊ทธ๋ ˆ์Šค๋Š” OSI Layer ์ค‘ L7 ๊ณ„์ธต์ธ Application ๊ณ„์ธต์ด๋ฉฐ ํ•ด๋‹น ๊ณ„์ธต์˜ ๊ตฌํ˜„์ฒด๋Š” HTTP๋กœ ์‹๋ณ„์ž๊ฐ€ IP ์ฃผ์†Œ, PORT ๋ฒˆํ˜ธ, URL PATH ๊นŒ์ง€์ด๋‹ค. ๋ฐ˜๋ฉด์— ์„œ๋น„์Šค๋Š” L4 ๊ณ„์ธต์ธ Transport ๊ณ„์ธต์ด๋ฉฐ ํ•ด๋‹น ๊ณ„์ธต์˜ ๊ตฌํ˜„์ฒด๋Š” TCP/UDP๋กœ ์‹๋ณ„์ž๊ฐ€ IP ์ฃผ์†Œ์™€ PORT ๋ฒˆํ˜ธ์ด๋‹ค. 

 

์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ์‹๋ณ„์ž๊ฐ€ URL PATH ๊นŒ์ง€ ์—ฌ๋ถ€์ด๋ƒ์ธ๋ฐ, ์ธ๊ทธ๋ ˆ์Šค๋Š” ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ‘์—์„œ ์•Œ์•„๋ณด๊ฒ ์ง€๋งŒ ๋ผ์šฐํŒ… ๊ทœ์น™๊นŒ์ง€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด์—, ์„œ๋น„์Šค๋Š” URL PATH๊ฐ€ ์‹๋ณ„์ž์— ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์šฐํŒ… ๊ทœ์น™๊นŒ์ง€๋Š” ์ •์˜ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. 

3. ์ธ๊ทธ๋ ˆ์Šค์˜ ๊ตฌ์กฐ

์ง์ „ ๋ชฉ์ฐจ๊นŒ์ง€๋Š” ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์–ด๋–ค ๊ฐœ๋…์ด๊ณ , ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” ์ข€ ๋” ์„ธ๋ถ€์ ์œผ๋กœ k8s ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ค ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

 

์ง€๊ธˆ๊นŒ์ง€ ์ด์•ผ๊ธฐํ–ˆ๋˜ '์ธ๊ทธ๋ ˆ์Šค'๋Š” ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๊ทœ์น™์„ ์ •์˜ํ•œ ๋‚ด์šฉ์ด ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ ํ˜•ํƒœ์— ๋ถˆ๊ณผํ•˜๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ๊ฐ€? ์ง์ „ ๋ชฉ์ฐจ์—์„œ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ๋„์‹ํ™”ํ•œ ๊ฒƒ์„ ๋ณด๋ฉด ์ธ๊ทธ๋ ˆ์Šค ์ž์ฒด๊ฐ€ ์ผ์ข…์˜ ์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋ฉด์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ๋„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ธ๊ทธ๋ ˆ์Šค์˜ ์‹ค์ฒด(?)๋Š” ๋‹จ์ˆœํ•œ YAML ํŒŒ์ผ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์—๋Š” ์ง์ „์—์„œ ์ธ๊ทธ๋ ˆ์Šค์˜ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์†Œ๊ฐœํ–ˆ๋˜ ๋ผ์šฐํŒ… ๊ทœ์น™, SSL/TLS ์„ค์ •๊ฐ’ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋ช…์‹œํ•˜๋Š” ๋‚ด์šฉ์ด ๋“ค์–ด์žˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์†Œ๊ฐœ๋˜๋Š” ์ธ๊ทธ๋ ˆ์Šค ์˜ˆ์ œ ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

 

์œ„ ํŒŒ์ผ์˜ ๋‚ด์šฉ์—์„œ ํ•ญ๋ชฉ๋“ค์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์ธ๊ทธ๋ ˆ์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์ข€ ๋” ๊นŠ์ˆ™ํžˆ ํŒŒํ—ค์ณ๋ณด๋„๋ก ํ•˜์ž.

 

์ธ๊ทธ๋ ˆ์Šค ๋ง๊ณ ๋„ ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…์ด ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์ด๋‹ค. ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ธ๊ทธ๋ ˆ์Šค๋ผ๋Š” ๊ฒƒ์— ๋ช…์‹œ๋œ ๊ทœ์น™์„ ์‹คํ–‰์‹œํ‚ค๋„๋ก ํ•˜๋Š” ์ฃผ์ฒด์ด๋‹ค. ์ด๋ฆ„์— '์ปจํŠธ๋กค๋Ÿฌ' ๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์—์„œ ๋ˆˆ์น˜์ฑŒ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ œ์–ดํ•œ๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ, ๋ฐ”๋กœ ์ธ๊ทธ๋ ˆ์Šค์— ๋ช…์‹œ๋œ ๊ทœ์น™์„ ์ œ์–ดํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ง์ „ ๋ชฉ์ฐจ์—์„œ ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค๊ณ  ํ–ˆ์ง€๋งŒ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณ„๋„๋กœ ์žˆ๋Š”๋ฐ, ์ด ์„œ๋ฒ„๊ฐ€ ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ช…๋ นํ•œ ๊ทœ์น™์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์‹ค์งˆ์ ์ธ ์ฃผ์ฒด๊ฐ€ ๋œ๋‹ค. ์ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ผ๋Š” ์„œ๋ฒ„๋Š” ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ข…๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ, ๋งŒ์•ฝ NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ผ๋ฉด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์„œ๋ฒ„๋Š” NGINX ์›น์„œ๋ฒ„๊ฐ€ ๋œ๋‹ค. ์ด์™ธ์— ๋Œ€ํ‘œ์ ์ธ ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ ์ข…๋ฅ˜๋กœ๋Š” NGINX, Istio, Kong, GCE ๋“ฑ์ด ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ GCE๋Š” ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋งค๋‹ˆ์ง€๋“œ k8s๋ฅผ ์ œ๊ณตํ•˜๋Š” GKE ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.

 

๊ฒฐ๊ตญ ์œ„ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด์„œ ์ธ๊ทธ๋ ˆ์Šค, ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ธ๊ทธ๋ ˆ์Šค์— ๋ช…์‹œ๋œ ๊ทœ์น™์„ ๋ณธ๋‹ค
  2. ๊ทธ ๊ทœ์น™์„ ๋ณธ NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ(์‹ค์งˆ์ ์ธ ์„œ๋ฒ„์ด๋ฉฐ ์ด ๊ฒฝ์šฐ NGINX ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ๋จ)์—๊ฒŒ ๋ช…๋ น์„ ๋‚ด๋ฆฐ๋‹ค
  3. ๊ทธ ๋ช…๋ น(์ธ๊ทธ๋ ˆ์Šค์— ๋ช…์‹œ๋œ ๊ทœ์น™) ๋Œ€๋กœ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์„œ๋ฒ„๊ฐ€ ๋™์ž‘ํ•œ๋‹ค

๊ทธ๋ž˜์„œ ์ด ๊ด€๊ณ„๋ฅผ ๋ฐ˜์˜ํ•ด์„œ k8s ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๋„์‹ํ™”ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

์ธ๊ทธ๋ ˆ์Šค ๊ตฌ์กฐ

 

์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ฃผ๋กœ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์กด์žฌํ•˜๋ฉฐ ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ ์ž์ฒด๋„ ์‚ฌ์‹ค์ƒ์€ ์ปจํ”ผ๊ทธ๋งต์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ๊ทธ๋ ˆ์Šค์™€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์ฃผ๋กœ ์›Œ์ปค ๋…ธ๋“œ์— ์กด์žฌํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ฐ„์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ๋„ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ฐ˜๋“œ์‹œ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ? ์•„๋‹ˆ๋‹ค ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋งŒ์•ฝ 5๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์กด์žฌํ•˜๊ณ , ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ 3๊ฐœ์˜ ์„œ๋น„์Šค๋Š” NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ, ๋‚˜๋จธ์ง€ 2๊ฐœ์˜ ์„œ๋น„์Šค๋Š” Kong ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด๋Ÿด ๊ฒฝ์šฐ, ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ๊ฐ๊ฐ ๋ช‡ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ? ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” 2๊ฐœ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” 5๊ฐœ์ด๋‹ค. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ 5๊ฐœ์ธ ์ด์œ ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ 1๊ฐœ ๋‹น ํ•˜๋‚˜์˜ ์„œ๋น„์Šค์— ๋ถ™์–ด์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋“ค์— ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ๊ฐœ์ˆ˜ ๋ณ„๋กœ ์กด์žฌํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด, ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ•˜๋‚˜ ์„ ์ •ํ•ด ์ƒ์„ฑํ•œ๋‹ค
  2. ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  3. ๊ทœ์น™์„ ์ •์˜ํ•˜๋Š” ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  4. ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ˆœ๊ฐ„, ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ , ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ๋กœ๋“œํ•ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ์ „๋‹ฌํ•œ๋‹ค
  5. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค

์ฐธ๊ณ ๋กœ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ˆœ๊ฐ„์— ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” Watch API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด Watch API๋Š” ์ธ๊ทธ๋ ˆ์Šค ๋ง๊ณ ๋„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์—์„œ ํŠน์ • ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ, ์‚ญ์ œ, ์ˆ˜์ • ๋“ฑ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. kubectl CLI ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ ํŒŒ๋“œ๋ฅผ Watch API๋กœ ์‚ดํŽด๋ณด๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

kubectl get pods -w

4. ์ธ๊ทธ๋ ˆ์Šค ๊ทœ์น™ ์ดํ•ดํ•˜๊ธฐ : ๊ธฐ์ดˆ

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ธ๊ทธ๋ ˆ์Šค ์˜ˆ์ œ ํŒŒ์ผ์„ ๋ณด๋ฉด์„œ ๊ทœ์น™์„ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž. ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ˆ์ œ ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zedd-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: zedd.example.com
    http:
      paths:
      - path: /echo-hello
        pathType: Prefix
        backend:
          service:
            name: hello-service
            port:
              number: 80

 

  • spec.host : ํ•ด๋‹น ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ฒ˜๋ฆฌ ๊ทœ์น™์„ ์ ์šฉํ•œ๋‹ค. ์ด host ๋„ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • spec.http.paths.path : ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์–ด๋Š ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•  ๊ฒƒ์ธ์ง€ ์ •์˜ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ path๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
  • spec.http.paths.backend.service.port : ํ•ด๋‹น path๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์ด ์ „๋‹ฌ๋  ์„œ๋น„์Šค์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ •์˜ํ•œ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” hello-service ๋ผ๋Š” ์„œ๋น„์Šค ๋ช…์„ ๊ฐ–๋Š” ํŒŒ๋“œ์˜ 80 ํฌํŠธ๋ฒˆํ˜ธ๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค

๊ทธ๋Ÿฐ๋ฐ ๋ฐฉ๊ธˆ spec.http.paths.backend.service.port ํ•ญ๋ชฉ์„ ์„ค๋ช…ํ•˜๋ฉด์„œ ์ •์˜๋œ ์„œ๋น„์Šค ์ฆ‰, hello-service ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์š”์ฒญ์ด ์ „๋‹ฌํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์ธ๊ทธ๋ ˆ์Šค๋Š” ํ•ด๋‹น ์„œ๋น„์Šค๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•ด๋‹น ์„œ๋น„์Šค์— ๋ถ™์–ด์žˆ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ฆ‰, ์‹ค์งˆ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ๋กœ ์ง์ ‘ ์ „๋‹ฌ๋˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๋ฐ”์ดํŒจ์Šค(bypass)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ฐธ๊ณ ํ•ด๋ณด๋„๋ก ํ•˜์ž.

5. ์ธ๊ทธ๋ ˆ์Šค ๊ทœ์น™ ์ดํ•ดํ•˜๊ธฐ : annotations(์ฃผ์„)

์ด๋ฒˆ์—๋Š” ์ธ๊ทธ๋ ˆ์Šค ๊ทœ์น™ ์ค‘ ์ข€ ๋” ์‹ฌํ™”๋œ ๋‚ด์šฉ์ธ annotations ํ•ญ๋ชฉ์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์•„๊นŒ ์œ„์—์„œ ์‚ดํŽด๋ณธ ์ธ๊ทธ๋ ˆ์Šค ์˜ˆ์ œ์™€ ๋น„์Šทํ•˜๋˜ ํ•œ ์ค„๋งŒ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. annotations ํ•ญ๋ชฉ๋งŒ ๋ณด์ž.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: zedd-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: zedd.example.com
    http:
      paths:
      - path: /echo-hello
        pathType: Prefix
        backend:
          service:
            name: hello-service
            port:
              number: 80

 

  • kubernetes.io/ingress.class : ์ธ๊ทธ๋ ˆ์Šค ๊ทœ์น™์„ ์–ด๋–ค ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์— ์ ์šฉํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•ด๋‹น ์ฃผ์„์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, GKE ํ™˜๊ฒฝ์—์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ–ˆ๊ณ  NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์ฃผ์„์— "nginx" ๋ผ๊ณ  ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ GKE ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์— GCE ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์€ NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์— ํ•œ์ •๋œ ๊ฒƒ์ด์ง€๋งŒ, nginx.ingress.kubernetes.io/rewrite-target ์ด๋ผ๋Š” ์ฃผ์„์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž. ํ•ด๋‹น ์ฃผ์„์€ ์ธ๊ทธ๋ ˆ์Šค์— ์ •์˜๋œ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ rewrite-target์— ์ •์˜ํ•œ ๊ฒฝ๋กœ(์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋ฃจํŠธ(/) ๊ฒฝ๋กœ)๋กœ ์ „๋‹ฌํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์œ„ ์˜ˆ์‹œ๋กœ ๋“ค์ž๋ฉด, ํ•ด๋‹น ์ธ๊ทธ๋ ˆ์Šค์˜ /echo-hello ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์€ hello-service ์ด๋ฆ„์ธ ์„œ๋น„์Šค๋ช…์˜ ๋ฃจํŠธ(/) ๊ฒฝ๋กœ๋กœ ๋ชจ๋‘ ์ „๋‹ฌํ•˜๋ผ๋Š” ๋œป์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, /echo-hello ๊ฒฝ๋กœ๋˜ /echo-hello/zedd ๋˜ /echo-hello/zedd/123 ์ด๋˜ ๋ชจ๋‘ hello-service ๋ผ๋Š” ์„œ๋น„์Šค์˜ ๋ฃจํŠธ(/) ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌํ•œ๋‹ค. 

 

์ด๋Ÿฌํ•œ rewrite-target์€ NGINX์˜ ์บก์ณ ๊ทธ๋ฃน๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ ๊ฒฝ๋กœ๋ฅผ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ด ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ž์„ธํ•œ ์˜ˆ์‹œ๋Š” ์ฑ…์—๋„ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๋ฌธ์„œ์—๋„ ์กด์žฌํ•˜๋‹ˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ์ •๊ทœํ‘œํ˜„์‹๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค.

 

๋ฐ˜์‘ํ˜•