๐Ÿš€ Traefik: ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ ๋งˆ๋ฒ•์‚ฌ, ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ์˜ ๋‹ฌ์ธ! ๐Ÿง™โ€โ™‚๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Traefik: ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ ๋งˆ๋ฒ•์‚ฌ, ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ์˜ ๋‹ฌ์ธ! ๐Ÿง™โ€โ™‚๏ธ

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด. ๋ฐ”๋กœ Traefik(ํŠธ๋ž˜ํ”ฝ)์ด๋ผ๋Š” ๋…€์„์ธ๋ฐ, ์ด ์นœ๊ตฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ๋งˆ๋ฒ•์„ ๋ถ€๋ฆฌ๋Š”์ง€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž๊ตฌ! ๐Ÿ˜Ž

๋จผ์ €, Traefik์ด ๋ญ”์ง€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. Traefik์€ ํ˜„๋Œ€์ ์ธ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋™์ ์ด๊ณ  ์ž๋™ํ™”๋œ HTTP ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์ด์ž ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์•ผ. ์–ด, ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ๊ฑฑ์ • ๋งˆ, ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด์ค„ ํ…Œ๋‹ˆ๊นŒ! ๐Ÿค“

๐Ÿ’ก Traefik์˜ ํ•ต์‹ฌ ํฌ์ธํŠธ:

  • ๋™์  ๊ตฌ์„ฑ: ์„ค์ •์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ผ!
  • ์ž๋™ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ: ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„๋‚ด๊ณ  ์„ค์ •ํ•ด์ค˜.
  • ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ ์ง€์›: Docker, Kubernetes, Marathon ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ๊ณผ ์ž˜ ์–ด์šธ๋ ค.
  • ์›น UI: ์˜ˆ์˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•ด.
  • Let's Encrypt ์ง€์›: SSL/TLS ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰ํ•˜๊ณ  ๊ฐฑ์‹ ํ•ด์ค˜.

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Traefik์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ? ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ์ถœ๋ฐœ! ๐Ÿš€

๐ŸŒŸ Traefik, ๋„ˆ๋Š” ๋ˆ„๊ตฌ๋‹ˆ?

Traefik(ํŠธ๋ž˜ํ”ฝ)์€ ํ”„๋ž‘์Šค ํšŒ์‚ฌ์ธ Containous์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์•ผ. Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์—ˆ๊ณ , 2015๋…„์— ์ฒ˜์Œ ๋ฆด๋ฆฌ์ฆˆ๋์–ด. ์ด๋ฆ„์ด ์žฌ๋ฐŒ์ง€? 'ํŠธ๋ž˜ํ”ฝ'์ด๋ผ๋‹ˆ, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฃจ๋Š” ๋…€์„์ด๋ผ๋Š” ๊ฑธ ์ด๋ฆ„๋งŒ ๋ด๋„ ์•Œ ์ˆ˜ ์žˆ์ž–์•„! ๐Ÿ˜„

Traefik์˜ ์ฃผ์š” ๋ชฉ์ ์€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ํšจ์œจ์ ์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ๊ฑฐ์•ผ. ํŠนํžˆ Docker๋‚˜ Kubernetes ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ๋น›์„ ๋ฐœํ•˜์ง€. ์™œ ๊ทธ๋Ÿฐ์ง€ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ?

๐ŸŠ Traefik์˜ ํŠน์ง•:

  • ์ž๋™ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ
  • ๋™์  ์„ค์ •
  • ๋‹ค์ค‘ ๋ฐฑ์—”๋“œ ์ง€์›
  • ์›น UI
  • ๋ฉ”ํŠธ๋ฆญ์Šค ๋‚ด๋ณด๋‚ด๊ธฐ
  • ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ
  • Let's Encrypt ํ†ตํ•ฉ

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•๋ถ„์— Traefik์€ ํ˜„๋Œ€์ ์ธ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ผ. ํŠนํžˆ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ธ๊ธฐ๊ฐ€ ๋งŽ์•„. ์™œ ๊ทธ๋Ÿฐ์ง€ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ?

๐Ÿ—๏ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์™€ Traefik

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋Š” ํ•˜๋‚˜์˜ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์„œ๋น„์Šค๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ด์•ผ. ๊ฐ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ํ™•์žฅ๋  ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฐ ๊ตฌ์กฐ์—์„œ๋Š” ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์ด ๋งค์šฐ ์ค‘์š”ํ•œ๋ฐ, ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ Traefik์ด ๋น›์„ ๋ฐœํ•˜๋Š” ๊ฑฐ์ง€!

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์™€ Traefik Traefik ์„œ๋น„์Šค A ์„œ๋น„์Šค B ์„œ๋น„์Šค C

์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, Traefik์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ ์ ˆํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด. ์ด ๊ณผ์ •์—์„œ Traefik์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋“ค์„ ์ˆ˜ํ–‰ํ•ด:

  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐ
  • SSL/TLS ์ข…๋ฃŒ: HTTPS ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌ
  • ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ: ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€
  • ํ—ฌ์Šค ์ฒดํฌ: ์„œ๋น„์Šค์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ๋ฉ”ํŠธ๋ฆญ์Šค ์ˆ˜์ง‘: ํŠธ๋ž˜ํ”ฝ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์— ์ œ๊ณต

์ด๋ ‡๊ฒŒ Traefik์ด ์ค‘์•™์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋‹ˆ๊นŒ, ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์–ด. ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ˆ? ๐Ÿ˜Š

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์€ ๋‹ค๋ฅธ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋‚˜ API ๊ฒŒ์ดํŠธ์›จ์ด๋„ ํ•  ์ˆ˜ ์žˆ์ž–์•„? ๊ทธ๋Ÿผ Traefik๋งŒ์˜ ํŠน๋ณ„ํ•œ ์ ์€ ๋ญ˜๊นŒ? ๋ฐ”๋กœ ๋™์  ๊ตฌ์„ฑ๊ณผ ์ž๋™ํ™”์•ผ! Traefik์€ ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ด. ์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋Œ€๋‹จํ•œ ๊ฑด์ง€, ๋‹ค์Œ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๊ตฌ!

๐Ÿ”ฎ Traefik์˜ ๋งˆ๋ฒ•: ๋™์  ๊ตฌ์„ฑ๊ณผ ์ž๋™ํ™”

์ž, ์ด์ œ Traefik์˜ ์ง„์งœ ๋งค๋ ฅ์„ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. Traefik์ด ๋‹ค๋ฅธ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์™€ ๋‹ค๋ฅธ ์ ์€ ๋ฐ”๋กœ ๋™์  ๊ตฌ์„ฑ๊ณผ ์ž๋™ํ™” ๊ธฐ๋Šฅ์ด์•ผ. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ.

๐ŸŽญ ๋™์  ๊ตฌ์„ฑ: ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋งˆ๋ฒ•

์ „ํ†ต์ ์ธ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋Š” ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ–ˆ์–ด. ํ•˜์ง€๋งŒ Traefik์€ ๋‹ฌ๋ผ! Traefik์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ๋ƒ๊ณ ?

๐ŸŒฑ ๋™์  ๊ตฌ์„ฑ์˜ ์žฅ์ :

  • ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์„ค์ • ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ์ถ”๊ฐ€๋‚˜ ์ œ๊ฑฐ๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜์˜
  • ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ •
  • SSL/TLS ์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹ 

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

๐Ÿค– ์ž๋™ํ™”: ์Šค์Šค๋กœ ํ•™์Šตํ•˜๋Š” ๋˜‘๋˜‘ํ•œ ํ”„๋ก์‹œ

Traefik์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•์ ์€ ์ž๋™ํ™”์•ผ. Traefik์€ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ผ๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋Œ€์‘ํ•ด. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ?

Traefik์˜ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค Traefik์˜ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค ์„œ๋น„์Šค ๊ฐ์ง€ ์„ค์ • ์—…๋ฐ์ดํŠธ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…

์œ„ ๊ทธ๋ฆผ์€ Traefik์˜ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด์—ฌ์ค˜. ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  1. ์„œ๋น„์Šค ๊ฐ์ง€: Traefik์€ ์ง€์†์ ์œผ๋กœ ํ™˜๊ฒฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด. ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์„œ๋น„์Šค๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ์ฆ‰์‹œ ๊ฐ์ง€ํ•ด.
  2. ์„ค์ • ์—…๋ฐ์ดํŠธ: ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๋ฉด Traefik์€ ์ž๋™์œผ๋กœ ์ž์‹ ์˜ ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ด. ์ด ๊ณผ์ •์—์„œ ์„œ๋น„์Šค ์ค‘๋‹จ์ด ์ „ํ˜€ ์—†์–ด!
  3. ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…: ์—…๋ฐ์ดํŠธ๋œ ์„ค์ •์„ ๋ฐ”ํƒ•์œผ๋กœ Traefik์€ ์ฆ‰์‹œ ํŠธ๋ž˜ํ”ฝ์„ ์ƒˆ๋กœ์šด ๊ทœ์น™์— ๋”ฐ๋ผ ๋ผ์šฐํŒ…ํ•˜๊ธฐ ์‹œ์ž‘ํ•ด.

์ด ๋ชจ๋“  ๊ณผ์ •์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋‹ˆ, ์ •๋ง ๋Œ€๋‹จํ•˜์ง€ ์•Š๋‹ˆ? ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด์ œ ์ธํ”„๋ผ ๊ด€๋ฆฌ์— ์‹œ๊ฐ„์„ ์Ÿ์ง€ ์•Š๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด. ์ด๊ฒŒ ๋ฐ”๋กœ Traefik์ด DevOps์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ์‚ฌ๋ž‘๋ฐ›๋Š” ์ด์œ ์•ผ. ๐Ÿ˜

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, ์ด๋Ÿฐ ์ž๋™ํ™” ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฑธ๊นŒ? ๋น„๋ฐ€์€ ๋ฐ”๋กœ Traefik์˜ ํ”„๋กœ๋ฐ”์ด๋” ์‹œ์Šคํ…œ์— ์žˆ์–ด. ๋‹ค์Œ ์„น์…˜์—์„œ ์ด ํ”„๋กœ๋ฐ”์ด๋”์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!

๐Ÿงฉ Traefik์˜ ๋น„๋ฐ€ ๋ฌด๊ธฐ: ํ”„๋กœ๋ฐ”์ด๋”

์ž, ์ด์ œ Traefik์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ํ”„๋กœ๋ฐ”์ด๋”์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ํ”„๋กœ๋ฐ”์ด๋”๋Š” Traefik์ด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ๊ณผ ์†Œํ†ตํ•˜๊ณ  ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ์‰ฝ๊ฒŒ ๋งํ•ด, ํ”„๋กœ๋ฐ”์ด๋”๋Š” Traefik์˜ ๋ˆˆ๊ณผ ๊ท€ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€.

๐Ÿ” ํ”„๋กœ๋ฐ”์ด๋”๋ž€?

ํ”„๋กœ๋ฐ”์ด๋”๋Š” Traefik์—๊ฒŒ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์†Œ์Šค์•ผ. ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Traefik์€ ํŠธ๋ž˜ํ”ฝ์„ ์–ด๋””๋กœ ๋ณด๋‚ด์•ผ ํ• ์ง€ ๊ฒฐ์ •ํ•˜์ง€. ํ”„๋กœ๋ฐ”์ด๋”๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด:

๐ŸŒธ ํ”„๋กœ๋ฐ”์ด๋”์˜ ์œ ํ˜•:

  1. ๋™์  ํ”„๋กœ๋ฐ”์ด๋”: ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  Traefik์— ์•Œ๋ ค์ค˜. (์˜ˆ: Docker, Kubernetes)
  2. ์ •์  ํ”„๋กœ๋ฐ”์ด๋”: ์„ค์ • ํŒŒ์ผ์ด๋‚˜ ๋ช…๋ น์ค„ ์ธ์ž๋ฅผ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด. (์˜ˆ: File, CLI)

Traefik์€ ๋‹ค์–‘ํ•œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ง€์›ํ•ด. ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์‚ดํŽด๋ณผ๊นŒ?

๐Ÿณ Docker ํ”„๋กœ๋ฐ”์ด๋”

Docker ํ”„๋กœ๋ฐ”์ด๋”๋Š” Traefik์˜ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋กœ๋ฐ”์ด๋” ์ค‘ ํ•˜๋‚˜์•ผ. Docker ํ™˜๊ฒฝ์—์„œ Traefik์„ ์‚ฌ์šฉํ•  ๋•Œ ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€. ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  1. Traefik์€ Docker ๋ฐ๋ชฌ๊ณผ ํ†ต์‹ ํ•ด์„œ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€.
  2. ์ปจํ…Œ์ด๋„ˆ์— ํŠน์ • ๋ผ๋ฒจ์„ ๋ถ™์ด๋ฉด, Traefik์ด ๊ทธ ๋ผ๋ฒจ์„ ์ฝ๊ณ  ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ƒ์„ฑํ•ด.
  3. ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜๋ฉด Traefik์ด ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜๊ณ  ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ด.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ Docker Compose ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:


version: '3'

services:
  traefik:
    image: traefik:v2.5
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
  

์ด ์„ค์ •์—์„œ Traefik์€ Docker ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , whoami ์„œ๋น„์Šค๋Š” whoami.localhost ํ˜ธ์ŠคํŠธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •๋ผ ์žˆ์–ด. Traefik์ด ์ž๋™์œผ๋กœ ์ด ์„ค์ •์„ ์ฝ๊ณ  ์ ์šฉํ•˜๋Š” ๊ฑฐ์ง€. ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ˆ? ๐Ÿ˜Š

โš“ Kubernetes ํ”„๋กœ๋ฐ”์ด๋”

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

Kubernetes์—์„œ Traefik์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค„๊ฒŒ:


apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: myingressroute
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`example.com`) && PathPrefix(`/notls`)
    kind: Rule
    services:
    - name: whoami
      port: 80
  

์ด ์„ค์ •์€ example.com/notls ๊ฒฝ๋กœ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ whoami ์„œ๋น„์Šค์˜ 80 ํฌํŠธ๋กœ ๋ผ์šฐํŒ…ํ•ด. Traefik์ด ์ด ์„ค์ •์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ ์šฉํ•˜๋‹ˆ๊นŒ, ๊ฐœ๋ฐœ์ž๋Š” ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ์„ค์ •์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋ผ. ๐Ÿ‘

๐Ÿ“ File ํ”„๋กœ๋ฐ”์ด๋”

File ํ”„๋กœ๋ฐ”์ด๋”๋Š” ์ •์  ํ”„๋กœ๋ฐ”์ด๋”์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์•ผ. YAML์ด๋‚˜ TOML ํ˜•์‹์˜ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด:


http:
  routers:
    my-router:
      rule: "Host(`example.com`) && PathPrefix(`/api`)"
      service: my-service

  services:
    my-service:
      loadBalancer:
        servers:
          - url: "http://private-ip-server-1/"
          - url: "http://private-ip-server-2/"
  

์ด ์„ค์ •์€ example.com/api ๊ฒฝ๋กœ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ my-service๋กœ ๋ผ์šฐํŒ…ํ•˜๊ณ , ์ด ์„œ๋น„์Šค๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋ฒ„๋กœ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๋ผ. File ํ”„๋กœ๋ฐ”์ด๋”๋Š” ๋™์  ํ™˜๊ฒฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

๐ŸŒˆ ๋‹ค๋ฅธ ํ”„๋กœ๋ฐ”์ด๋”๋“ค

Traefik์€ ์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ง€์›ํ•ด. ๋ช‡ ๊ฐ€์ง€๋งŒ ๋” ์†Œ๊ฐœํ• ๊ฒŒ:

  • Consul Catalog: Consul ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ์™€ ํ†ตํ•ฉ
  • Etcd: ๋ถ„์‚ฐ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ ์„ค์ •
  • Marathon: Mesos์™€ Marathon ํ™˜๊ฒฝ ์ง€์›
  • Rancher: Rancher ํ™˜๊ฒฝ๊ณผ์˜ ํ†ตํ•ฉ
  • Redis: Redis๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  ์„ค์ •

์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Traefik์€ ๊ฑฐ์˜ ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๋„ค๊ฐ€ ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ์ผํ•˜๋“ , Traefik์€ ๋„ˆ์˜ ๋“ ๋“ ํ•œ ํŒŒํŠธ๋„ˆ๊ฐ€ ๋  ๊ฑฐ์•ผ! ๐Ÿ˜„

์ž, ์ด์ œ Traefik์˜ ํ”„๋กœ๋ฐ”์ด๋”์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์ด ํ”„๋กœ๋ฐ”์ด๋” ์‹œ์Šคํ…œ ๋•๋ถ„์— Traefik์ด ๊ทธ๋ ‡๊ฒŒ ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ง€. ๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, Traefik์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์ง€ ์•Š์•„? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Traefik์˜ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์„ค์ • ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‹ˆ? ๐Ÿš€

๐Ÿ› ๏ธ Traefik ์‹ค์ „ ํ™œ์šฉ: ์„ค์ •๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€

์ž, ์ด์ œ Traefik์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. Traefik์˜ ์„ค์ • ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊นŒ์ง€, ์•„์ฃผ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ์ค€๋น„๋๋‹ˆ? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ! ๐Ÿš€

๐Ÿ”ง Traefik ์„ค์ •ํ•˜๊ธฐ

Traefik์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€์•ผ:

  1. ์ •์  ์„ค์ •: ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉ
  2. ๋™์  ์„ค์ •: ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ํ†ตํ•œ ์ž๋™ ์„ค์ •

๋จผ์ € ์ •์  ์„ค์ •๋ถ€ํ„ฐ ์‚ดํŽด๋ณผ๊ฒŒ. Traefik์˜ ์ •์  ์„ค์ •์€ ์ฃผ๋กœ traefik.yml (๋˜๋Š” traefik.toml) ํŒŒ์ผ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ. ์ด ํŒŒ์ผ์—์„œ ์ „์—ญ ์„ค์ •, ์—”ํŠธ๋ฆฌํฌ์ธํŠธ, ํ”„๋กœ๋ฐ”์ด๋” ๋“ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด.

๊ฐ„๋‹จํ•œ traefik.yml ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค„๊ฒŒ:


global:
  checkNewVersion: true
  sendAnonymousUsage: false

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

api:
  insecure: true
  dashboard: true

log:
  level: INFO

accessLog: {}
  

์ด ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์–ด:

  • HTTP(80)์™€ HTTPS(443) ๋‘ ๊ฐœ์˜ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์ •์˜
  • Docker ํ”„๋กœ๋ฐ”์ด๋” ํ™œ์„ฑํ™”
  • API์™€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ™œ์„ฑํ™” (๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”!)
  • ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ INFO๋กœ ์„ค์ •
  • ์•ก์„ธ์Šค ๋กœ๊ทธ ํ™œ์„ฑํ™”

์ด์ œ ๋™์  ์„ค์ •์„ ์‚ดํŽด๋ณผ๊นŒ? ๋™์  ์„ค์ •์€ ์ฃผ๋กœ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ. ์˜ˆ๋ฅผ ๋“ค์–ด, Docker ํ™˜๊ฒฝ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ผ๋ฒจ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด์—ฌ์ค„๊ฒŒ:


version: '3'

services:
  traefik:
    image: traefik:v2.5
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
  

์ด Docker Compose ํŒŒ์ผ์—์„œ whoami ์„œ๋น„์Šค๋Š” ๋ผ๋ฒจ์„ ํ†ตํ•ด Traefik ์„ค์ •์„ ์ •์˜ํ•˜๊ณ  ์žˆ์–ด. traefik.http.routers.whoami.rule ๋ผ๋ฒจ์€ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ •์˜ํ•˜๊ณ , traefik.http.services.whoami.loadbalancer.server.port ๋ผ๋ฒจ์€ ์„œ๋น„์Šค์˜ ํฌํŠธ๋ฅผ ์ง€์ •ํ•ด.

๐ŸŒŸ Traefik ์‚ฌ์šฉ ์‚ฌ๋ก€

์ด์ œ Traefik์„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ๊ฒŒ.

1. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ผ์šฐํŒ…

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ Traefik์€ API ๊ฒŒ์ดํŠธ์›จ์ด ์—ญํ• ์„ ํ›Œ๋ฅญํžˆ ์ˆ˜ํ–‰ํ•ด. ๊ฐ ์„œ๋น„์Šค๋กœ์˜ ๋ผ์šฐํŒ…, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, SSL ์ข…๋ฃŒ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€.


services:
  api:
    image: my-api-image
    labels:
      - "traefik.http.routers.api.rule=Host(`api.example.com`)"
      - "traefik.http.services.api.loadbalancer.server.port=8000"

  web:
    image: my-web-image
    labels:
      - "traefik.http.routers.web.rule=Host(`www.example.com`)"
      - "traefik.http.services.web.loadbalancer.server.port=3000"
  

์ด ์„ค์ •์—์„œ Traefik์€ api.example.com์œผ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ API ์„œ๋น„์Šค๋กœ, www.example.com์œผ๋กœ ์˜ค๋Š” ์š”์ฒญ์„ ์›น ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•ด.

2. SSL/TLS ์ž๋™ํ™”

Traefik์€ Let's Encrypt์™€ ํ†ตํ•ฉ๋˜์–ด SSL/TLS ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰ํ•˜๊ณ  ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์–ด. ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€?


certificatesResolvers:
  myresolver:
    acme:
      email: your-email@example.com
      storage: acme.json
      httpChallenge:
        entryPoint: web

http:
  routers:
    websecure:
      rule: "Host(`example.com`)"
      entryPoints:
        - websecure
      tls:
        certResolver: myresolver
  

์ด ์„ค์ •์œผ๋กœ Traefik์€ ์ž๋™์œผ๋กœ example.com์˜ SSL/TLS ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ  ๊ด€๋ฆฌํ•ด.

3. ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ

Traefik์„ ์‚ฌ์šฉํ•˜๋ฉด ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ(์ผ๋ถ€ ํŠธ๋ž˜ํ”ฝ๋งŒ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ๋ผ์šฐํŒ…)๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด.


services:
  app-v1:
    image: my-app:v1
    labels:
      - "traefik.http.routers.app-v1.rule=Host(`app.example.com`) && Weight(`1`)"

  app-v2:
    image: my-app:v2
    labels:
      - "traefik.http.routers.app-v2.rule=Host(`app.example.com`) && Weight(`1`)"
  

์ด ์„ค์ •์—์„œ๋Š” ํŠธ๋ž˜ํ”ฝ์˜ 50%๋Š” v1์œผ๋กœ, ๋‚˜๋จธ์ง€ 50%๋Š” v2๋กœ ๋ผ์šฐํŒ…๋ผ. ๊ฐ€์ค‘์น˜๋ฅผ ์กฐ์ ˆํ•ด์„œ ํŠธ๋ž˜ํ”ฝ ๋น„์œจ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด.

4. ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ™œ์šฉํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

Traefik์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ/์‘๋‹ต์„ ๋ณ€ํ˜•ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ๋ณธ ์ธ์ฆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค„๊ฒŒ:


http:
  middlewares:
    my-auth:
      basicAuth:
        users:
          - "admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"

  routers:
    my-router:
      rule: "Host(`secure.example.com`)"
      middlewares:
        - my-auth
      service: my-service
  

์ด ์„ค์ •์€ secure.example.com์— ์ ‘๊ทผํ•  ๋•Œ ๊ธฐ๋ณธ ์ธ์ฆ์„ ์š”๊ตฌํ•ด.

๐ŸŽญ ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

์ž, ์ด์ œ ์‹ค์ œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ Traefik์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ข€ ๋” ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ๊ฒŒ.

๊ฐ€์ •ํ•ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๋“ค์„ ๊ฐ€์ง„ e-์ปค๋จธ์Šค ํ”Œ๋žซํผ์„ ์šด์˜ํ•˜๊ณ  ์žˆ์–ด:

  • ํ”„๋ก ํŠธ์—”๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ์‚ฌ์šฉ์ž ์ธ์ฆ ์„œ๋น„์Šค
  • ์ œํ’ˆ ์นดํƒˆ๋กœ๊ทธ ์„œ๋น„์Šค
  • ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์„œ๋น„์Šค
  • ๊ฒฐ์ œ ์„œ๋น„์Šค

์ด ์„œ๋น„์Šค๋“ค์„ Traefik์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ Docker Compose ํŒŒ์ผ๋กœ ๋ณด์—ฌ์ค„๊ฒŒ:


version: '3'

services:
  traefik:
    image: traefik:v2.5
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.myresolver.acme.email=admin@example.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./letsencrypt:/letsencrypt

  frontend:
    image: my-frontend-image
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.frontend.rule=Host(`www.myecommerce.com`)"
      - "traefik.http.routers.frontend.entrypoints=websecure"
      - "traefik.http.routers.frontend.tls.certresolver=myresolver"

  auth:
    image: my-auth-service-image
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.auth.rule=Host(`api.myecommerce.com`) && PathPrefix(`/auth`)"
      - "traefik.http.routers.auth.entrypoints=websecure"
      - "traefik.http.routers.auth.tls.certresolver=myresolver"

  catalog:
    image: my-catalog-service-image
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.catalog.rule=Host(`api.myecommerce.com`) && PathPrefix(`/catalog`)"
      - "traefik.http.routers.catalog.entrypoints=websecure"
      - "traefik.http.routers.catalog.tls.certresolver=myresolver"

  orders:
    image: my-orders-service-image
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.orders.rule=Host(`api.myecommerce.com`) && PathPrefix(`/orders`)"
      - "traefik.http.routers.orders.entrypoints=websecure"
      - "traefik.http.routers.orders.tls.certresolver=myresolver"

  payment:
    image: my-payment-service-image
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.payment.rule=Host(`api.myecommerce.com`) && PathPrefix(`/payment`)"
      - "traefik.http.routers.payment.entrypoints=websecure"
      - "traefik.http.routers.payment.tls.certresolver=myresolver"
  

์ด ์„ค์ •์˜ ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ์„ค๋ช…ํ•ด์ค„๊ฒŒ:

  • ๋ชจ๋“  ์„œ๋น„์Šค์— ๋Œ€ํ•ด HTTPS๋ฅผ ๊ฐ•์ œํ•˜๊ณ  ์žˆ์–ด. Traefik์ด ์ž๋™์œผ๋กœ Let's Encrypt ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ๊ด€๋ฆฌํ•ด.
  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” www.myecommerce.com์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด.
  • ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋“ค์€ ๋ชจ๋‘ api.myecommerce.com์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋˜, ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…๋ผ.
  • ๊ฐ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด.

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด Traefik์ด ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•ด์ฃผ๊ณ , SSL/TLS๋„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜. ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฐ ์„œ๋น„์Šค์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€. ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ˆ? ๐Ÿ˜Š

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

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ Traefik์˜ ์‹ค์ œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์–ด๋•Œ, Traefik์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋„๊ตฌ์ธ์ง€ ์ดํ•ด๊ฐ€ ๋๋‹ˆ? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Traefik์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์žฅ๋‹จ์ ๊ณผ ์ฃผ์˜์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๊ณ„์† ๋”ฐ๋ผ์™€์ค˜! ๐Ÿš€

โš–๏ธ Traefik์˜ ์žฅ๋‹จ์ ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

์ž, ์ด์ œ Traefik์˜ ์žฅ๋‹จ์ ๊ณผ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ๋ชจ๋“  ๊ธฐ์ˆ ์ด ๊ทธ๋ ‡๋“ฏ Traefik๋„ ์žฅ์ ๋งŒ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๊ฑฐ๋“ . ๊ท ํ˜• ์žกํžŒ ์‹œ๊ฐ์œผ๋กœ Traefik์„ ๋ฐ”๋ผ๋ณด๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ? ๐Ÿง

๐Ÿ‘ Traefik์˜ ์žฅ์ 

  1. ์ž๋™ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ: Traefik์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด์•ผ. ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ๋•Œ ์ž๋™์œผ๋กœ ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๋‹ˆ๊นŒ ์ •๋ง ํŽธ๋ฆฌํ•ด.
  2. ๋™์  ์„ค์ •: ์‹คํ–‰ ์ค‘์—๋„ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์‹œ์Šคํ…œ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด.
  3. ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ ์ง€์›: Docker, Kubernetes, Consul ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์„ ์ง€์›ํ•ด์„œ ์–ด๋–ค ์ธํ”„๋ผ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.
  4. Let's Encrypt ํ†ตํ•ฉ: SSL/TLS ์ธ์ฆ์„œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰๋ฐ›๊ณ  ๊ฐฑ์‹ ํ•ด์ฃผ๋‹ˆ๊นŒ ๋ณด์•ˆ ์„ค์ •์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ.
  5. ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์›น UI: ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์„ค์ •๊ณผ ๋ผ์šฐํŒ… ์ƒํƒœ๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด.
  6. ๋†’์€ ์„ฑ๋Šฅ: Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ด.
  7. ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ: ๋งŽ์€ ์‚ฌ์šฉ์ž์™€ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ™œ๋™ํ•˜๊ณ  ์žˆ์–ด์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ์ด๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์‰ฌ์›Œ.

๐Ÿ‘Ž Traefik์˜ ๋‹จ์ 

  1. ํ•™์Šต ๊ณก์„ : ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ๊ฐœ๋…๊ณผ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์–ด.
  2. ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€: ๋™์  ์„ค์ • ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด.
  3. ๋ณด์•ˆ ์„ค์ •์˜ ๋ณต์žก์„ฑ: ๊ธฐ๋ณธ ์„ค์ •์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋งž์ถฐ์ ธ ์žˆ์–ด์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ์„ค์ •์ด ํ•„์š”ํ•ด.
  4. ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ: ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด.
  5. ๋ฒ„์ „ ๊ฐ„ ํ˜ธํ™˜์„ฑ: ๋ฉ”์ด์ € ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹œ ์„ค์ • ํŒŒ์ผ ํ˜•์‹์ด ํฌ๊ฒŒ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด.

โš ๏ธ Traefik ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ๋ณด์•ˆ ์„ค์ • ํ™•์ธ: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ API์™€ ๋Œ€์‹œ๋ณด๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•ด์•ผ ํ•ด. ๊ธฐ๋ณธ ์„ค์ •์€ ๋ณด์•ˆ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์–ด.
  2. ๋ฐฑ์—…๊ณผ ๋ฒ„์ „ ๊ด€๋ฆฌ: ๋™์  ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ˜„์žฌ ์„ค์ •์„ ๋ฐฑ์—…ํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„. ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ .
  3. ๋ชจ๋‹ˆํ„ฐ๋ง ์„ค์ •: Traefik์˜ ์ƒํƒœ์™€ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด. Prometheus์™€ Grafana๋ฅผ ์—ฐ๋™ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์•„.
  4. ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ: ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ๋Š” Traefik์— ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ด. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด.
  5. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์„œ ์ƒˆ๋กœ์šด ์„ค์ •์ด๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋จผ์ € ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์•„.
  6. ๋กœ๊น… ์„ค์ •: ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ ์ ˆํ•œ ๋กœ๊น… ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•˜๊ณ , ๋กœ๊ทธ๋ฅผ ์ค‘์•™ํ™”๋œ ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„.
  7. ์ •๊ธฐ์ ์ธ ์—…๋ฐ์ดํŠธ: ๋ณด์•ˆ ํŒจ์น˜์™€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์ •๊ธฐ์ ์œผ๋กœ Traefik์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด. ๋‹จ, ์—…๋ฐ์ดํŠธ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์•ผ ํ•ด.

์ด๋Ÿฐ ์ ๋“ค์„ ์ฃผ์˜ํ•˜๋ฉด์„œ Traefik์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. Traefik์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๊ทธ๋งŒํผ ์‹ ์ค‘ํ•˜๊ฒŒ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ!

๐Ÿค” Traefik์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ์™€ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๋•Œ

Traefik์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ:

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋™์ ์œผ๋กœ ์„œ๋น„์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋˜๋Š” ํ™˜๊ฒฝ
  • ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ(Docker Swarm, Kubernetes ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ž๋™ํ™”๋œ SSL/TLS ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋‹จ์ผ ์ง„์ž…์ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

Traefik์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๋•Œ:

  • ์•„์ฃผ ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์šฐ๋ ค๋˜๋Š” ๊ฒฝ์šฐ
  • ์ •์ ์ธ ํ™˜๊ฒฝ์—์„œ ๋‹จ์ˆœํ•œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ํŒ€์— Traefik์„ ํ•™์Šตํ•˜๊ณ  ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ
  • ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

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

์ด์ œ Traefik์— ๋Œ€ํ•ด ๊ฝค ๋งŽ์ด ์•Œ๊ฒŒ ๋์ง€? ๋งˆ์ง€๋ง‰์œผ๋กœ Traefik์˜ ๋ฏธ๋ž˜์™€ ๋Œ€์•ˆ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๊ณ  ๋งˆ๋ฌด๋ฆฌํ• ๊ฒŒ. ๊ณ„์† ๋”ฐ๋ผ์™€์ค˜! ๐Ÿš€

๐Ÿ”ฎ Traefik์˜ ๋ฏธ๋ž˜์™€ ๋Œ€์•ˆ๋“ค

์ž, ์ด์ œ Traefik์˜ ๋ฏธ๋ž˜์™€ ๋‹ค๋ฅธ ๋Œ€์•ˆ๋“ค์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž. ๊ธฐ์ˆ ์˜ ์„ธ๊ณ„๋Š” ๋น ๋ฅด๊ฒŒ ๋ณ€ํ•˜๋‹ˆ๊นŒ, ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋™ํ–ฅ์„ ์ฃผ์‹œํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!

๐Ÿš€ Traefik์˜ ๋ฏธ๋ž˜

Traefik์€ ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด. ์ตœ๊ทผ ๋ฆด๋ฆฌ์ฆˆ๋œ Traefik 2.x ๋ฒ„์ „์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ์ถ”๊ฐ€๋์–ด:

  • TCP ์ง€์› ๊ฐ•ํ™”
  • ๋ฏธ๋“ค์›จ์–ด ๊ฐœ๋… ๋„์ž…
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ
  • ๋”์šฑ ๊ฐ•ํ™”๋œ ๋ณด์•ˆ ๊ธฐ๋Šฅ

์•ž์œผ๋กœ๋„ Traefik์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ผ:

  • ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ง€์› ๊ฐ•ํ™”
  • ๋”์šฑ ํ–ฅ์ƒ๋œ ๋ณด์•ˆ ๊ธฐ๋Šฅ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ๋” ๋งŽ์€ ํ”„๋กœํ† ์ฝœ ์ง€์›
  • AI/ML์„ ํ™œ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ

๐Ÿ”„ Traefik์˜ ๋Œ€์•ˆ๋“ค

๋ฌผ๋ก  Traefik๋งŒ์ด ์œ ์ผํ•œ ์„ ํƒ์ง€๋Š” ์•„๋‹ˆ์•ผ. ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๋„ ์žˆ์–ด:

  1. Nginx: ์ „ํ†ต์ ์ธ ์›น ์„œ๋ฒ„์ด์ž ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ. ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ๋™์  ์„ค์ •์€ Traefik๋ณด๋‹ค ์–ด๋ ค์›Œ.
  2. HAProxy: ๊ณ ์„ฑ๋Šฅ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ. TCP์™€ HTTP ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.
  3. Envoy: ์ตœ์‹  ์„œ๋น„์Šค ๋ฉ”์‹œ์— ์ ํ•ฉํ•œ ๊ณ ์„ฑ๋Šฅ ํ”„๋ก์‹œ. ๋ณต์žกํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ด.
  4. Istio: Kubernetes๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค ๋ฉ”์‹œ ์†”๋ฃจ์…˜. ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ, ๋ณด์•ˆ, ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ด.
  5. Kong: API ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ์‹œ์ž‘ํ•ด์„œ ์„œ๋น„์Šค ๋ฉ”์‹œ ๊ธฐ๋Šฅ๊นŒ์ง€ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผ.

๊ฐ ๋„๊ตฌ๋งˆ๋‹ค ์žฅ๋‹จ์ ์ด ์žˆ์–ด์„œ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ด. Traefik์˜ ์ฃผ์š” ์žฅ์ ์€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ๊ณผ ๋™์  ์„ค์ •์ด์ง€๋งŒ, ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์€ ๊ฐ์ž์˜ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด.

๐ŸŽ“ ๋งˆ์น˜๋ฉฐ

์—ฌ๊ธฐ๊นŒ์ง€ Traefik์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ดค์–ด. Traefik์€ ํ˜„๋Œ€์ ์ธ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์ •๋ง ์œ ์šฉํ•œ ๋„๊ตฌ์•ผ. ๋™์  ์„ค์ •, ์ž๋™ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ, ์‰ฌ์šด SSL/TLS ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์‚ถ์„ ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ง€.

ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ธฐ์ˆ ์ด ๊ทธ๋ ‡๋“ฏ, Traefik๋„ ๋งŒ๋Šฅ์€ ์•„๋‹ˆ์•ผ. ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ, ํŒ€์˜ ์—ญ๋Ÿ‰, ๊ธฐ์กด ์ธํ”„๋ผ ๋“ฑ์„ ๊ณ ๋ คํ•ด์„œ Traefik ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ด. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค๋ฉด, ๋ณด์•ˆ ์„ค์ •์— ํŠนํžˆ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ!

๊ธฐ์ˆ ์˜ ์„ธ๊ณ„๋Š” ๊ณ„์†ํ•ด์„œ ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ์–ด. Traefik๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ๋„ ๊ณ„์† ์ง€์ผœ๋ด์•ผ ํ•ด. ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๊ณ  ์ ์šฉํ•˜๋Š” ์ž์„ธ๊ฐ€ ์ค‘์š”ํ•ด.

์ž, ์ด์ œ Traefik์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์ด ์•Œ๊ฒŒ ๋์ง€? ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ํ™”์ดํŒ…! ๐Ÿš€