๐Ÿš€ Hashicorp Nomad: ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์™€ ์Šค์ผ€์ค„๋ง์˜ ์‹ ์„ธ๊ณ„! ๐ŸŒŸ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Hashicorp Nomad: ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์™€ ์Šค์ผ€์ค„๋ง์˜ ์‹ ์„ธ๊ณ„! ๐ŸŒŸ

 

 

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

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

๐ŸŽ“ ์•Œ์ญ๋‹ฌ์ญ ์šฉ์–ด ์ •๋ฆฌ:

  • ํด๋Ÿฌ์Šคํ„ฐ: ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ
  • ์Šค์ผ€์ค„๋ง: ์ž‘์—…์„ ์ ์ ˆํ•œ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์†Œ์Šค์— ๋ฐฐ์ •ํ•˜๋Š” ๊ณผ์ •
  • ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ: ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์กฐํ™”๋กญ๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ

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

๐ŸŒˆ Nomad์˜ ํŠน๋ณ„ํ•œ ๋งค๋ ฅ ํฌ์ธํŠธ

Nomad๋Š” ์ •๋ง ๋งค๋ ฅ์ ์ธ ํŠน์ง•๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด. ํ•œ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ?

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

์ด๋Ÿฐ ํŠน์ง•๋“ค ๋•Œ๋ฌธ์— Nomad๋Š” ๋งŽ์€ ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—…๋“ค์—๊ฒŒ ์‚ฌ๋ž‘๋ฐ›๊ณ  ์žˆ์–ด. ํŠนํžˆ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์ •๋ง ๋น›์„ ๋ฐœํ•˜์ง€!

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: Nomad์˜ ์ด๋Ÿฐ ํŠน์ง•๋“ค์€ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋ฆฌ๋žœ์„œ ๊ฐœ๋ฐœ์ž๋กœ ํ™œ๋™ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํด๋ผ์ด์–ธํŠธ์˜ ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์œ ์—ฐํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•  ๋•Œ Nomad์˜ ์žฅ์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ!

์ž, ์ด์ œ Nomad์˜ ๋งค๋ ฅ์— ํ‘น ๋น ์กŒ์ง€? ๊ทธ๋Ÿผ ์ด์ œ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณผ๊นŒ? ๐Ÿ˜‰

๐Ÿ—๏ธ Nomad์˜ ์•„ํ‚คํ…์ฒ˜: ๋‚ด๋ถ€๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด์ž!

Nomad์˜ ๊ตฌ์กฐ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•ด. ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์ง€:

  1. ์„œ๋ฒ„ (Server): ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‘๋‡Œ ์—ญํ• ์„ ํ•ด. ์ž‘์—…์„ ๋ฐ›์•„์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ถ„๋ฐฐํ•˜๊ณ , ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด.
  2. ํด๋ผ์ด์–ธํŠธ (Client): ์‹ค์ œ๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ์•ผ. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•ด.

์ด ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณผ๊ฒŒ. ํ•œ ๋ฒˆ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์™ ๋  ๊ฑฐ์•ผ!

Nomad ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ 1 ํด๋ผ์ด์–ธํŠธ 2 ํด๋ผ์ด์–ธํŠธ 3 Nomad ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ

์–ด๋•Œ? ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ ๋” ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€? ๐Ÿ˜Š

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

๐Ÿ” ๋” ๊นŠ์ด ๋“ค์—ฌ๋‹ค๋ณด๊ธฐ: Nomad์˜ ์„œ๋ฒ„๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ธŒ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ(Scheduler), ํ‰๊ฐ€๊ธฐ(Evaluator), ์ƒํƒœ ๊ด€๋ฆฌ์ž(State Manager) ๋“ฑ์ด ์žˆ์ง€. ์ด๋“ค์ด ํ˜‘๋ ฅํ•ด์„œ ๋ณต์žกํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฑฐ์•ผ.

์ด์ œ Nomad์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋์–ด. ์ด ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Nomad๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ• ๊นŒ? ๊ทธ๊ฑด ๋‹ค์Œ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๊ตฌ! ๐Ÿš€

๐ŸŽญ Nomad์˜ ์ž‘์—… ๊ด€๋ฆฌ: ์–ด๋–ป๊ฒŒ ์ผํ•˜๋Š” ๊ฑธ๊นŒ?

์ž, ์ด์ œ Nomad๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ์ค€๋น„๋๋‹ˆ? ๐Ÿ˜Ž

1. ์ž‘์—… ์ •์˜ํ•˜๊ธฐ

๋จผ์ €, Nomad์—๊ฒŒ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€ ์•Œ๋ ค์ค˜์•ผ ํ•ด. ์ด๊ฑธ '์ž‘์—… ์ •์˜(Job Specification)'๋ผ๊ณ  ๋ถˆ๋Ÿฌ. HCL(HashiCorp Configuration Language)์ด๋‚˜ JSON ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ•œ๋ฒˆ ๋ณผ๊นŒ?


job "example" {
  datacenters = ["dc1"]
  type = "service"

  group "cache" {
    count = 1
    task "redis" {
      driver = "docker"
      config {
        image = "redis:3.2"
        port_map {
          db = 6379
        }
      }
      resources {
        cpu    = 500
        memory = 256
      }
    }
  }
}
  

์ด ์˜ˆ์ œ๋Š” Redis ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜ ์‹คํ–‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ •์˜ํ•˜๊ณ  ์žˆ์–ด. ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์ง€? ๐Ÿ˜‰

2. ์ž‘์—… ์ œ์ถœํ•˜๊ธฐ

์ž‘์—…์„ ์ •์˜ํ–ˆ๋‹ค๋ฉด, ์ด์ œ Nomad ์„œ๋ฒ„์— ์ œ์ถœํ•ด์•ผ ํ•ด. ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค(CLI)๋‚˜ HTTP API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์–ด.

CLI๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ:

nomad job run example.nomad

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Nomad ์„œ๋ฒ„๊ฐ€ ์ž‘์—…์„ ๋ฐ›์•„๋“ค์ด๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•ด.

3. ์ž‘์—… ํ‰๊ฐ€ํ•˜๊ธฐ

์„œ๋ฒ„๊ฐ€ ์ž‘์—…์„ ๋ฐ›์œผ๋ฉด, 'ํ‰๊ฐ€(Evaluation)' ๋‹จ๊ณ„๋กœ ๋“ค์–ด๊ฐ€. ์ด ๋‹จ๊ณ„์—์„œ Nomad๋Š”:

  • ์ž‘์—…์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•ด
  • ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ 
  • ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•ด

์ด ๊ณผ์ •์€ ์ •๋ง ๋น ๋ฅด๊ฒŒ ์ด๋ฃจ์–ด์ ธ. Nomad์˜ ํšจ์œจ์„ฑ์ด ๋น›์„ ๋ฐœํ•˜๋Š” ์ˆœ๊ฐ„์ด์ง€!

4. ์ž‘์—… ํ• ๋‹นํ•˜๊ธฐ

ํ‰๊ฐ€๊ฐ€ ๋๋‚˜๋ฉด, Nomad๋Š” 'ํ• ๋‹น(Allocation)'์„ ์ƒ์„ฑํ•ด. ํ• ๋‹น์€ ํŠน์ • ์ž‘์—…์„ ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰ํ• ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด. ์„œ๋ฒ„๋Š” ์ด ํ• ๋‹น ์ •๋ณด๋ฅผ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•ด.

5. ์ž‘์—… ์‹คํ–‰ํ•˜๊ธฐ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ• ๋‹น์„ ๋ฐ›์œผ๋ฉด, ์ง€์ •๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•ด. ์ด ๊ณผ์ •์—์„œ:

  • ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ค€๋น„ํ•˜๊ณ 
  • ์ง€์ •๋œ ๋“œ๋ผ์ด๋ฒ„(์˜ˆ: Docker)๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ 
  • ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด

ํด๋ผ์ด์–ธํŠธ๋Š” ๊ณ„์†ํ•ด์„œ ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ์„œ๋ฒ„์— ๋ณด๊ณ ํ•ด. ๋•๋ถ„์— ์„œ๋ฒ„๋Š” ํ•ญ์ƒ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์ง€.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: Nomad์˜ ์ด๋Ÿฐ ์ž‘์—… ๊ด€๋ฆฌ ๋ฐฉ์‹์€ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ํŠนํžˆ ์œ ์šฉํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. Nomad๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์„œ๋น„์Šค์˜ ๊ทœ๋ชจ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ๊ณผ ๋น„์šฉ ์ ˆ๊ฐ์œผ๋กœ ์ด์–ด์ง€์ง€!

์ž, ์ด์ œ Nomad๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋์–ด. ์ •๋ง ์ฒด๊ณ„์ ์ด๊ณ  ํšจ์œจ์ ์ด์ง€? ๐Ÿ˜Š ๋‹ค์Œ์œผ๋กœ๋Š” Nomad์˜ ์Šค์ผ€์ค„๋ง ์ „๋žต์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿง  Nomad์˜ ์Šค์ผ€์ค„๋ง ์ „๋žต: ๋˜‘๋˜‘ํ•œ ์ž‘์—… ๋ถ„๋ฐฐ!

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

1. ๋นˆ-ํŒจํ‚น (Bin Packing) ์•Œ๊ณ ๋ฆฌ์ฆ˜

Nomad์˜ ํ•ต์‹ฌ ์Šค์ผ€์ค„๋ง ์ „๋žต์€ '๋นˆ-ํŒจํ‚น' ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์•ผ. ์ด๊ฒŒ ๋ญ๋ƒ๊ณ ? ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ!

๋นˆ-ํŒจํ‚น์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌผ๊ฑด์„ ๊ฐ€๋Šฅํ•œ ์ ์€ ์ˆ˜์˜ ์ƒ์ž์— ํšจ์œจ์ ์œผ๋กœ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฑฐ์•ผ. Nomad์—์„œ๋Š” '๋ฌผ๊ฑด'์ด ์ž‘์—…์ด๊ณ , '์ƒ์ž'๊ฐ€ ํด๋ผ์ด์–ธํŠธ(์„œ๋ฒ„)์ธ ์…ˆ์ด์ง€.

๐ŸŽ“ ๋นˆ-ํŒจํ‚น ์˜ˆ์‹œ: ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ณต์„ ์ตœ์†Œํ•œ์˜ ์ƒ์ž์— ๋„ฃ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. ํฐ ๊ณต๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋„ฃ๊ณ , ๋‚จ๋Š” ๊ณต๊ฐ„์— ์ž‘์€ ๊ณต์„ ์ฑ„์›Œ๋„ฃ๋Š” ์‹์ด์•ผ. Nomad๋„ ์ด์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ๋ถ„๋ฐฐํ•ด!

์ด ์ „๋žต ๋•๋ถ„์— Nomad๋Š”:

  • ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๊ณ 
  • ํ•„์š”ํ•œ ์„œ๋ฒ„์˜ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉฐ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์–ด

2. ์ œ์•ฝ ์กฐ๊ฑด (Constraints)

ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ž‘์—…์„ ๋‹จ์ˆœํžˆ ๋นˆ-ํŒจํ‚น์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆœ ์—†์ง€. ๋•Œ๋กœ๋Š” ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ '์ œ์•ฝ ์กฐ๊ฑด'์ด์•ผ.

์˜ˆ๋ฅผ ๋“ค์–ด:


constraint {
  attribute = "${attr.kernel.name}"
  value     = "linux"
}
  

์ด ์ œ์•ฝ ์กฐ๊ฑด์€ Linux ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ์•ผ.

3. ์„ ํ˜ธ๋„ (Affinities)

'์„ ํ˜ธ๋„'๋Š” ์ œ์•ฝ ์กฐ๊ฑด๋ณด๋‹ค๋Š” ๋œ ์—„๊ฒฉํ•œ ๊ทœ์น™์ด์•ผ. ํŠน์ • ์กฐ๊ฑด์„ ์„ ํ˜ธํ•˜์ง€๋งŒ, ๊ผญ ๊ทธ๋ž˜์•ผ๋งŒ ํ•˜๋Š” ๊ฑด ์•„๋‹ ๋•Œ ์‚ฌ์šฉํ•ด.


affinity {
  attribute = "${node.datacenter}"
  value     = "us-west-1"
  weight    = 100
}
  

์ด ์„ ํ˜ธ๋„ ์„ค์ •์€ "๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด us-west-1 ๋ฐ์ดํ„ฐ์„ผํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์–ด์š”"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฑฐ๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€์•ผ.

4. ์Šคํ”„๋ ˆ๋“œ (Spread)

'์Šคํ”„๋ ˆ๋“œ' ์ „๋žต์€ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์žฅ์†Œ์— ๋ถ„์‚ฐ์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ด. ์ด๊ฑด ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด ์ •๋ง ์ค‘์š”ํ•ด!


spread {
  attribute = "${node.datacenter}"
  weight    = 100
  target "us-west-1" { percent = 60 }
  target "us-east-1" { percent = 40 }
}
  

์ด ์„ค์ •์€ ์ž‘์—…์˜ 60%๋Š” us-west-1์—, 40%๋Š” us-east-1์— ๋ถ„์‚ฐ์‹œํ‚ค๋ผ๋Š” ์˜๋ฏธ์•ผ.

5. ๋™์  ์Šค์ผ€์ค„๋ง

Nomad์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐ•์ ์€ '๋™์  ์Šค์ผ€์ค„๋ง'์ด์•ผ. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด (์˜ˆ: ์ƒˆ ๋…ธ๋“œ ์ถ”๊ฐ€, ๋…ธ๋“œ ์žฅ์•  ๋“ฑ) Nomad๋Š” ์ž๋™์œผ๋กœ ์žฌํ‰๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ•„์š”ํ•˜๋‹ค๋ฉด ์ž‘์—…์„ ์žฌ๋ฐฐ์น˜ํ•ด.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: ์ด๋Ÿฐ ๋™์  ์Šค์ผ€์ค„๋ง ๊ธฐ๋Šฅ์€ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ํŠนํžˆ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์‹œ๊ฐ„๋Œ€์— ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰์ฆํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ , ๋‹ค์‹œ ์ค„์–ด๋“ค ๋•Œ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์ง€. ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋น„์šฉ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ผ!

์ž, ์ด์ œ Nomad์˜ ์Šค์ผ€์ค„๋ง ์ „๋žต์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋์–ด. ์ •๋ง ๋˜‘๋˜‘ํ•˜์ง€? ๐Ÿ˜Ž ์ด๋Ÿฐ ์ „๋žต๋“ค ๋•๋ถ„์— Nomad๋Š” ๋ณต์žกํ•œ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ๋„ ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์•ผ.

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

๐Ÿ› ๏ธ Nomad ์‹ค์ „ ํ™œ์šฉ: ์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฑฐ์•ผ!

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ Nomad๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์•ผ. ์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ „์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ? ๐Ÿ˜Ž

1. Nomad ์„ค์น˜ํ•˜๊ธฐ

๋จผ์ €, Nomad๋ฅผ ์„ค์น˜ํ•ด์•ผ๊ฒ ์ง€? ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ์„ค์น˜ ๋ฐฉ๋ฒ•์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ˆ๊นŒ ์ฃผ์˜ํ•ด์•ผ ํ•ด!

macOS์—์„œ๋Š” Homebrew๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด:

brew install nomad

Linux๋‚˜ Windows์—์„œ๋Š” ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ๋ฐ›์•„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด. ์„ค์น˜๊ฐ€ ๋๋‚˜๋ฉด ๋ฒ„์ „์„ ํ™•์ธํ•ด๋ณด์ž:

nomad version

2. Nomad ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

Nomad ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•ด๋ณผ๊ฒŒ. ์ด ๋ชจ๋“œ๋Š” ํ…Œ์ŠคํŠธ๋‚˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์•„:

nomad agent -dev

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ์ปฌ์—์„œ Nomad ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•จ๊ป˜ ์‹คํ–‰๋ผ. ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ ๋˜์ง€๋งŒ, ํ•™์Šต ๋ชฉ์ ์œผ๋กœ๋Š” ๋”ฑ์ด์•ผ!

3. ์ž‘์—… ์ •์˜ํ•˜๊ธฐ

์ด์ œ ์‹คํ–‰ํ•  ์ž‘์—…์„ ์ •์˜ํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ:


job "hello-world" {
  datacenters = ["dc1"]
  type = "service"

  group "app" {
    count = 1

    task "hello" {
      driver = "docker"

      config {
        image = "nginx:latest"
        ports = ["http"]
      }

      resources {
        cpu    = 500
        memory = 256
      }
    }
  }
}
  

์ด ์ž‘์—…์€ Nginx ์›น ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜ ์‹คํ–‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์•ผ. ์ด ๋‚ด์šฉ์„ hello-world.nomad ํŒŒ์ผ๋กœ ์ €์žฅํ•ด์ค˜.

4. ์ž‘์—… ์‹คํ–‰ํ•˜๊ธฐ

์ž‘์—…์„ ์ •์˜ํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์‹คํ–‰ํ•ด๋ณผ ์ฐจ๋ก€์•ผ:

nomad job run hello-world.nomad

์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด Nomad๊ฐ€ ์ž‘์—…์„ ๋ฐ›์•„๋“ค์ด๊ณ  ์Šค์ผ€์ค„๋ง์„ ์‹œ์ž‘ํ•  ๊ฑฐ์•ผ.

5. ์ž‘์—… ์ƒํƒœ ํ™•์ธํ•˜๊ธฐ

์ž‘์—…์ด ์ž˜ ์‹คํ–‰๋๋Š”์ง€ ํ™•์ธํ•ด๋ณผ๊นŒ?

nomad job status hello-world

์ด ๋ช…๋ น์–ด๋กœ ์ž‘์—…์˜ ํ˜„์žฌ ์ƒํƒœ, ํ• ๋‹น๋œ ํด๋ผ์ด์–ธํŠธ, ์‚ฌ์šฉ ์ค‘์ธ ๋ฆฌ์†Œ์Šค ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด.

6. ์ž‘์—… ์ˆ˜์ •ํ•˜๊ธฐ

์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ๊ฐ„๋‹จํ•ด! ์ž‘์—… ์ •์˜ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๋ผ:

nomad job run -detach hello-world.nomad

Nomad๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋งŒ ์ˆ˜ํ–‰ํ•  ๊ฑฐ์•ผ.

7. ์ž‘์—… ์ค‘์ง€ํ•˜๊ธฐ

์ž‘์—…์„ ์ค‘์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ผ:

nomad job stop hello-world

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: Nomad์˜ ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•์€ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•  ๋•Œ Nomad๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด. ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ƒ์‚ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ๊ฑฐ์•ผ!

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

๐Ÿ”— Nomad์™€ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์˜ ํ™˜์ƒ์ ์ธ ์ฝœ๋ผ๋ณด!

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! Nomad๋Š” ํ˜ผ์ž์„œ๋„ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๋น›์„ ๋ฐœํ•œ๋‹ค๋Š” ์‚ฌ์‹ค, ์•Œ๊ณ  ์žˆ์—ˆ๋‹ˆ? ์ž, ์–ด๋–ค ๋„๊ตฌ๋“ค๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๋™๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

1. Consul๊ณผ์˜ ์—ฐ๋™

Consul์€ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ์™€ ๊ตฌ์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋„๊ตฌ์•ผ. Nomad์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ๋ฉ‹์ง„ ์ผ๋“ค์ด ์ผ์–ด๋‚˜์ง€!

  • ์„œ๋น„์Šค ๋“ฑ๋ก: Nomad๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ฉด ์ž๋™์œผ๋กœ Consul์— ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์–ด.
  • ๋™์  ๊ตฌ์„ฑ: Consul์˜ KV ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•ด Nomad ์ž‘์—…์˜ ๊ตฌ์„ฑ์„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€.
  • ์ƒํƒœ ์ฒดํฌ: Consul์˜ ์ƒํƒœ ์ฒดํฌ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด Nomad ์ž‘์—…์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด.

์˜ˆ๋ฅผ ๋“ค์–ด, Nomad ์ž‘์—… ์ •์˜์— ์ด๋ ‡๊ฒŒ Consul ํ†ตํ•ฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด:


job "web-app" {
  ...
  group "frontend" {
    ...
    service {
      name = "web-frontend"
      port = "http"
      check {
        type     = "http"
        path     = "/health"
        interval = "10s"
        timeout  = "2s"
      }
    }
  }
}
  

2. Vault์™€์˜ ์—ฐ๋™

Vault๋Š” ๋น„๋ฐ€ ๊ด€๋ฆฌ ๋„๊ตฌ์•ผ. Nomad์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์•ˆ์„ ํ•œ์ธต ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์ง€!

  • ๋™์  ์‹œํฌ๋ฆฟ: Nomad ์ž‘์—…์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ API ํ‚ค๋ฅผ Vault์—์„œ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.
  • ์•”ํ˜ธํ™”: Nomad์™€ Vault ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•ด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์ง€.

Vault๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Nomad ์ž‘์—… ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


job "database-backup" {
  ...
  task "backup" {
    ...
    vault {
      policies = ["database-backup"]
    }

    template {
      data = <<eoh db_password="{{with secret " database eoh destination="secrets/db-creds"></eoh>

3. Terraform๊ณผ์˜ ์—ฐ๋™

Terraform์€ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์•ผ. Nomad์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ์ธํ”„๋ผ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์„ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด!

  • Nomad ํด๋Ÿฌ์Šคํ„ฐ ํ”„๋กœ๋น„์ €๋‹: Terraform์œผ๋กœ Nomad ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด.
  • ์ž‘์—… ๋ฐฐํฌ ์ž๋™ํ™”: Terraform์„ ์‚ฌ์šฉํ•ด Nomad ์ž‘์—… ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์ง€.

Terraform์œผ๋กœ Nomad ์ž‘์—…์„ ๋ฐฐํฌํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ?


resource "nomad_job" "web_app" {
  jobspec = file("${path.module}/web-app.nomad")
}
  

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: ์ด๋Ÿฐ ๋„๊ตฌ๋“ค์˜ ์กฐํ•ฉ์€ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์ •๋ง ์œ ์šฉํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, Consul์„ ์‚ฌ์šฉํ•ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•˜๊ณ , Vault๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๋ฉฐ, Terraform์œผ๋กœ ์ „์ฒด ์ธํ”„๋ผ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ, ๋ณด์•ˆ์„ฑ, ๊ด€๋ฆฌ ์šฉ์ด์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ผ!

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

๋‹ค์Œ์œผ๋กœ๋Š” Nomad๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ณ„์† ๊ฐ€๋ณด์ž! ๐Ÿš€

๐Ÿ† Nomad ์‚ฌ์šฉ์˜ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค์™€ ์ฃผ์˜์‚ฌํ•ญ

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

1. ์ ์ ˆํ•œ ๋ฆฌ์†Œ์Šค ํ• ๋‹น

์ž‘์—…์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ณ  ํ• ๋‹นํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ํ• ๋‹นํ•˜๋ฉด ๋‚ญ๋น„๊ฐ€ ๋˜๊ณ , ๋„ˆ๋ฌด ์ ๊ฒŒ ํ• ๋‹นํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด.


task "app" {
  resources {
    cpu    = 500 # 500 MHz
    memory = 256 # 256 MB
  }
}
  

์‹œ๊ฐ„์„ ๋“ค์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๊ทธ์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

2. ๋ฉฑ๋“ฑ์„ฑ ์œ ์ง€

๋ฉฑ๋“ฑ์„ฑ์ด๋ž€, ๊ฐ™์€ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๋งํ•ด. Nomad ์ž‘์—…์„ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ์ด ์›์น™์„ ์ง€ํ‚ค๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ:


task "db-migration" {
  driver = "docker"

  config {
    image = "my-db-migration-image"
    command = "migrate"
    args = ["--only-if-needed"]
  }
}
  

--only-if-needed ๊ฐ™์€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ์ด๋ฏธ ์ ์šฉ๋œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฑฐ์ง€.

3. ์ ์ ˆํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์‚ฌ์šฉ

์ œ์•ฝ ์กฐ๊ฑด์„ ๋„ˆ๋ฌด ์—„๊ฒฉํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์Šค์ผ€์ค„๋ง์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์–ด. ๋ฐ˜๋ฉด, ๋„ˆ๋ฌด ๋Š์Šจํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ถ€์ ์ ˆํ•œ ๋…ธ๋“œ์— ์ž‘์—…์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ์ง€. ๊ท ํ˜•์„ ์ž˜ ์žก๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.


constraint {
  attribute = "${attr.kernel.name}"
  value     = "linux"
}

constraint {
  attribute = "${meta.instance_type}"
  value     = "c5.large"
}
  

4. ๋กค๋ง ์—…๋ฐ์ดํŠธ ํ™œ์šฉ

์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋Š” ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์šดํƒ€์ž„ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์ง€.


update {
  max_parallel     = 1
  health_check     = "checks"
  min_healthy_time = "10s"
  healthy_deadline = "5m"
  auto_revert      = true
}
  

5. ์ ์ ˆํ•œ ๋กœ๊น…๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง

Nomad์˜ ๋กœ๊ทธ์™€ ๋ฉ”ํŠธ๋ฆญ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด. Prometheus๋‚˜ Grafana ๊ฐ™์€ ๋„๊ตฌ์™€ ์—ฐ๋™ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ.


telemetry {
  publish_allocation_metrics = true
  publish_node_metrics       = true
}
  

6. ๋ณด์•ˆ์— ์‹ ๊ฒฝ ์“ฐ๊ธฐ

Nomad ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฑด ์ •๋ง ์ค‘์š”ํ•ด. TLS๋ฅผ ์‚ฌ์šฉํ•ด ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜๊ณ , ACL์„ ์„ค์ •ํ•ด ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๊ฒŒ ์ข‹์•„.


server {
  enabled = true
  encrypt = "your-gossip-encryption-key"
}

tls {
  http = true
  rpc  = true
}
  

๐Ÿ’ก ์žฌ๋Šฅ๋„ท TIP: ์ด๋Ÿฐ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋“ค์€ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ํ”Œ๋žซํผ์—์„œ ํŠนํžˆ ์ค‘์š”ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ ์ ˆํ•œ ๋ฆฌ์†Œ์Šค ํ• ๋‹น์€ ๋น„์šฉ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ๋กค๋ง ์—…๋ฐ์ดํŠธ๋Š” ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์„ค์ •์€ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋Ÿฐ ์›์น™๋“ค์„ ์ž˜ ์ง€ํ‚ค๋ฉด ํ”Œ๋žซํผ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์ง€!

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

๋งˆ์ง€๋ง‰์œผ๋กœ, Nomad์˜ ๋ฏธ๋ž˜์™€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ƒํƒœ๊ณ„์—์„œ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊นŒ? ์ค€๋น„๋๋‹ˆ? ๊ฐ€๋ณด์ž๊ณ ! ๐Ÿš€

๐Ÿ”ฎ Nomad์˜ ๋ฏธ๋ž˜: ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์„ธ์ƒ์—์„œ์˜ ์—ญํ• 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์ด์ œ ์šฐ๋ฆฌ์˜ Nomad ์—ฌํ–‰๋„ ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด. ๋งˆ์ง€๋ง‰์œผ๋กœ Nomad์˜ ๋ฏธ๋ž˜์™€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ƒํƒœ๊ณ„์—์„œ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ๊นŒ? ๐Ÿ˜Š

1. ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ์™€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋ผ์šฐ๋“œ ์ง€์›

Nomad๋Š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์— ์ข…์†๋˜์ง€ ์•Š๋Š” ํŠน์„ฑ ๋•๋ถ„์— ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ์™€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋”์šฑ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•  ๊ฑฐ์•ผ. ๊ธฐ์—…๋“ค์ด ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ Nomad๊ฐ€ ํฐ ๋„์›€์ด ๋  ๊ฑฐ๋ผ๊ณ  ๋ด.

2. Edge Computing ์ง€์›

IoT ๊ธฐ๊ธฐ์™€ ์—ฃ์ง€ ์ปดํ“จํŒ…์˜ ๋ฐœ์ „์œผ๋กœ, ๋ถ„์‚ฐ๋œ ํ™˜๊ฒฝ์—์„œ์˜ ์›Œํฌ๋กœ๋“œ ๊ด€๋ฆฌ๊ฐ€ ๋”์šฑ ์ค‘์š”ํ•ด์งˆ ๊ฑฐ์•ผ. Nomad์˜ ๊ฒฝ๋Ÿ‰ํ™”๋œ ํŠน์„ฑ์€ ์ด๋Ÿฐ ํ™˜๊ฒฝ์— ๋”ฑ ๋งž์•„. ์•ž์œผ๋กœ ์—ฃ์ง€ ์ปดํ“จํŒ… ๋ถ„์•ผ์—์„œ Nomad์˜ ํ™œ์šฉ๋„๊ฐ€ ๋†’์•„์งˆ ๊ฒƒ ๊ฐ™์•„.

3. ์„œ๋ฒ„๋ฆฌ์Šค์™€์˜ ํ†ตํ•ฉ

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

4. AI์™€ ๋จธ์‹ ๋Ÿฌ๋‹ ์›Œํฌ๋กœ๋“œ ์ง€์› ๊ฐ•ํ™”

AI์™€ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ถ„์•ผ๊ฐ€ ๊ธ‰์†๋„๋กœ ์„ฑ์žฅํ•˜๋ฉด์„œ, ์ด๋Ÿฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์–ด. Nomad๋„ GPU ์ง€์›์„ ๊ฐ•ํ™”ํ•˜๊ณ , AI ์›Œํฌ๋กœ๋“œ์— ์ตœ์ ํ™”๋œ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ๋ฐœํ•  ๊ฒƒ ๊ฐ™์•„.

5. ๋ณด์•ˆ ๊ฐ•ํ™”

์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ์˜ ์ค‘์š”์„ฑ์ด ๊ณ„์† ์ปค์ง€๋ฉด์„œ, Nomad๋„ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๋”์šฑ ๊ฐ•ํ™”ํ•  ๊ฑฐ์•ผ. ์•”ํ˜ธํ™”, ์ ‘๊ทผ ์ œ์–ด, ์ทจ์•ฝ์  ์Šค์บ๋‹ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ๋”์šฑ ๋ฐœ์ „ํ•  ๊ฒƒ ๊ฐ™์•„.

6. ์ž๋™ํ™”์™€ ์ž๊ฐ€ ์น˜์œ  ๊ธฐ๋Šฅ ๊ฐ•ํ™”

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

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

์ž, ์ด์ œ ์ •๋ง ์šฐ๋ฆฌ์˜ Nomad ์—ฌํ–‰์ด ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด. Nomad๋Š” ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ๊ณ , ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ƒํƒœ๊ณ„์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•  ๊ฑฐ์•ผ. ์ด ๊ธฐ์ˆ ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•œ๋‹ค๋ฉด, ๋„ˆํฌ๋„ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์„ธ์ƒ์—์„œ ํฐ ์„ฑ๊ณต์„ ๊ฑฐ๋‘˜ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ˜Š

Nomad์™€ ํ•จ๊ป˜ํ•œ ์ด ์—ฌํ–‰์ด ๋„ˆํฌ์—๊ฒŒ ๋„์›€์ด ๋๊ธธ ๋ฐ”๋ผ. ์•ž์œผ๋กœ๋„ ๊ณ„์† ํ•™์Šตํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€๋ฉด์„œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ „๋ฌธ๊ฐ€๋กœ ์„ฑ์žฅํ•ด ๋‚˜๊ฐ€๊ธธ ๋ฐ”๋ž„๊ฒŒ. ํ™”์ดํŒ…! ๐Ÿš€