Consul์„ ์‚ฌ์šฉํ•˜์—ฌ Nomad ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ฐ Gitlab๊ณผ ํ†ตํ•ฉ

์†Œ๊ฐœ

์ตœ๊ทผ Kubernetes์˜ ์ธ๊ธฐ๊ฐ€ ๊ธ‰์†ํžˆ ๋†’์•„์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์  ๋” ๋งŽ์•„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Nomad์™€ ๊ฐ™์€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” HashiCorp์˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜(์˜ˆ: Vault ๋ฐ Consul)์„ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ ์ž์ฒด๋Š” ์ธํ”„๋ผ ์ธก๋ฉด์—์„œ ๋ณต์žกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ž๋ฃŒ์—๋Š” Nomad ์„ค์น˜, ๋‘ ๋…ธ๋“œ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ฒฐํ•ฉ, Nomad๋ฅผ Gitlab๊ณผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Consul์„ ์‚ฌ์šฉํ•˜์—ฌ Nomad ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ฐ Gitlab๊ณผ ํ†ตํ•ฉ

ํ…Œ์ŠคํŠธ ๋ฒค์น˜

ํ…Œ์ŠคํŠธ ๋ฒค์น˜์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜๋ฉด 2๊ฐœ์˜ CPU, 4๊ฐœ์˜ RAM, 50Gb SSD์˜ ํŠน์„ฑ์„ ์ง€๋‹Œ XNUMX๊ฐœ์˜ ๊ฐ€์ƒ ์„œ๋ฒ„๊ฐ€ ๊ณตํ†ต ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ๋กœ ํ†ตํ•ฉ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋ฐ IP ์ฃผ์†Œ:

  1. ์œ ๋ชฉ๋ฏผ-livelinux-01: 172.30.0.5
  2. ์œ ๋ชฉ๋ฏผ-livelinux-02: 172.30.0.10
  3. consul-livelinux-01: 172.30.0.15

๋…ธ๋งˆ๋“œ ์„ค์น˜, ์˜์‚ฌ. ๋…ธ๋งˆ๋“œ ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ

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

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๋ก ์  ๋ถ€๋ถ„์„ ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ฏธ๋ž˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

HashiCorp์˜ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ bin ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  ๋„๊ตฌ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๊ณ  ์„œ๋น„์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Consul ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์••์ถ•์„ ํ’‰๋‹ˆ๋‹ค.

root@consul-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# mv consul /usr/local/bin/

์ด์ œ ์ถ”๊ฐ€ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ consul ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Consul์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด keygen ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ  ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

root@consul-livelinux-01:~# consul keygen

Consul ๊ตฌ์„ฑ ์„ค์ •์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ๋‹ค์Œ ๊ตฌ์กฐ๋กœ /etc/consul.d/ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

/etc/consul.d/
โ”œโ”€โ”€ bootstrap
โ”‚   โ””โ”€โ”€ config.json

๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ config.json์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์—์„œ Consul ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ:

{
"bootstrap": true,
"server": true,
"datacenter": "dc1",
"data_dir": "/var/consul",
"encrypt": "your-key",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["172.30.0.15"]
}

์ฃผ์š” ์ง€์‹œ๋ฌธ๊ณผ ๊ทธ ์˜๋ฏธ๋ฅผ ๋ณ„๋„๋กœ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ: ์ง„์‹ค. ์ƒˆ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฉด ์ž๋™ ์ถ”๊ฐ€๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์˜ˆ์ƒ๋˜๋Š” ๋…ธ๋“œ์˜ ์ •ํ™•ํ•œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„ฌ๊ธฐ๋Š” ์‚ฌ๋žŒ: ์ง„์‹ค. ์„œ๋ฒ„ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ƒ ๋จธ์‹ ์˜ Consul์€ ํ˜„์žฌ ์œ ์ผํ•œ ์„œ๋ฒ„ ๋ฐ ๋งˆ์Šคํ„ฐ ์—ญํ• ์„ ํ•˜๋ฉฐ Nomad์˜ VM์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์„ผํ„ฐ: dc1. ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘์—์„œ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์•”ํ˜ธํ™”: ๋‹น์‹ ์˜ ์—ด์‡ . ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ๊ณ ์œ ํ•˜๊ณ  ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค. consul keygen ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ์ž‘_์ฐธ์—ฌ. ์ด ๋ชฉ๋ก์—๋Š” ์—ฐ๊ฒฐ๋  IP ์ฃผ์†Œ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์šฐ๋ฆฌ ์ฃผ์†Œ๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ consul์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui

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

root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service

consul.service ํŒŒ์ผ์˜ ๋‚ด์šฉ:

[Unit]
Description=Consul Startup process
After=network.target
 
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui' 
TimeoutStartSec=0
 
[Install]
WantedBy=default.target

systemctl์„ ํ†ตํ•ด Consul์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

root@consul-livelinux-01:~# systemctl start consul

ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•˜๋ฉฐ consulmembers ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux    172.30.0.15:8301  alive   server  1.5.0  2         dc1  <all>

๋‹ค์Œ ๋‹จ๊ณ„: Nginx๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ”„๋ก์‹œ ๋ฐ http ์ธ์ฆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด nginx๋ฅผ ์„ค์น˜ํ•˜๊ณ  /etc/nginx/sites-enabled ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ consul.conf๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

upstream consul-auth {
    server localhost:8500;
}

server {

    server_name consul.doman.name;
    
    location / {
      proxy_pass http://consul-auth;
      proxy_set_header Host $host;
      auth_basic_user_file /etc/nginx/.htpasswd;
      auth_basic "Password-protected Area";
    }
}

.htpasswd ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด ํ•ญ๋ชฉ์€ ์šฐ๋ฆฌ ๋„๋ฉ”์ธ์„ ์•„๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์›น ํŒจ๋„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Gitlab์„ ์„ค์ •ํ•  ๋•Œ ์ด๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Nomad์— ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Gitlab๊ณผ Nomad ๋ชจ๋‘ ๊ทธ๋ ˆ์ด ์›น์—๋งŒ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋‘ ์„œ๋ฒ„์—๋Š” ๋‹ค์Œ ์ง€์นจ์— ๋”ฐ๋ผ Consul ์—์ด์ „ํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# mv consul /usr/local/bin/

์ด์ „ ์„œ๋ฒ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ /etc/consul.d์— ๋Œ€ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

/etc/consul.d/
โ”œโ”€โ”€ client
โ”‚   โ””โ”€โ”€ config.json

config.json ํŒŒ์ผ์˜ ๋‚ด์šฉ:

{
    "datacenter": "dc1",
    "data_dir": "/opt/consul",
    "log_level": "DEBUG",
    "node_name": "nomad-livelinux-01",
    "server": false,
    "encrypt": "your-private-key",
    "domain": "livelinux",
    "addresses": {
      "dns": "127.0.0.1",
      "https": "0.0.0.0",
      "grpc": "127.0.0.1",
      "http": "127.0.0.1"
    },
    "bind_addr": "172.30.0.5", # ะปะพะบะฐะปัŒะฝั‹ะน ะฐะดั€ะตั ะฒะผ
    "start_join": ["172.30.0.15"], # ัƒะดะฐะปะตะฝะฝั‹ะน ะฐะดั€ะตั ะบะพะฝััƒะป ัะตั€ะฒะตั€ะฐ
    "ports": {
      "dns": 53
     }

๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ณ  ์„œ๋น„์Šค ํŒŒ์ผ ๋ฐ ํ•ด๋‹น ๋‚ด์šฉ ์„ค์ •์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

/etc/systemd/system/consul.service:

[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/client
ExecReload=/usr/local/bin/consul reload
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

์„œ๋ฒ„์—์„œ consol์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ถœ์‹œ ํ›„ nsul ๋ฉค๋ฒ„์— ๊ตฌ์„ฑ๋œ ์„œ๋น„์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ์„œ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์„œ๋ฒ„์—์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ ํ›„ Nomad ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nomad ์„ค์น˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ ์„ค์น˜ ๋ฐฉ๋ฒ•์—๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์†Œ์Šค์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜: ํ”„๋กœ์ ํŠธ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž์ฃผ ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๊ธฐ์‚ฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ์ฏค์—๋Š” ์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ๊ธฐ ์ „์— ํ˜„์žฌ Nomad์˜ ์ตœ์‹  ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/nomad/0.9.1/nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# unzip nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# mv nomad /usr/local/bin/
root@nomad-livelinux-01:~# nomad -autocomplete-install
root@nomad-livelinux-01:~# complete -C /usr/local/bin/nomad nomad
root@nomad-livelinux-01:~# mkdir /etc/nomad.d

์••์ถ•์„ ํ’€๋ฉด 65MB์˜ Nomad ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ /usr/local/bin์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Nomad์šฉ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์„œ๋น„์Šค ํŒŒ์ผ์„ ํŽธ์ง‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์ฒ˜์Œ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ).

root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service

๊ฑฐ๊ธฐ์— ๋‹ค์Œ ์ค„์„ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”.

[Unit]
Description=Nomad
Documentation=https://nomadproject.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d
KillMode=process
KillSignal=SIGINT
LimitNOFILE=infinity
LimitNPROC=infinity
Restart=on-failure
RestartSec=2
StartLimitBurst=3
StartLimitIntervalSec=10
TasksMax=infinity

[Install]
WantedBy=multi-user.target

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” nomad๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋‘๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

root@nomad-livelinux-01:~# mkdir --parents /etc/nomad.d
root@nomad-livelinux-01:~# chmod 700 /etc/nomad.d
root@nomad-livelinux-01:~# nano /etc/nomad.d/nomad.hcl
root@nomad-livelinux-01:~# nano /etc/nomad.d/server.hcl

์ตœ์ข… ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/etc/nomad.d/
โ”œโ”€โ”€ nomad.hcl
โ””โ”€โ”€ server.hcl

nomad.hcl ํŒŒ์ผ์—๋Š” ๋‹ค์Œ ๊ตฌ์„ฑ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

datacenter = "dc1"
data_dir = "/opt/nomad"

server.hcl ํŒŒ์ผ์˜ ๋‚ด์šฉ:

server {
  enabled = true
  bootstrap_expect = 1
}

consul {
  address             = "127.0.0.1:8500"
  server_service_name = "nomad"
  client_service_name = "nomad-client"
  auto_advertise      = true
  server_auto_join    = true
  client_auto_join    = true
}

bind_addr = "127.0.0.1" 

advertise {
  http = "172.30.0.5"
}

client {
  enabled = true
}

๋‘ ๋ฒˆ์งธ ์„œ๋ฒ„์—์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ http ์ง€์‹œ๋ฌธ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์˜ ๋งˆ์ง€๋ง‰ ์ž‘์—…์€ HTTP ์ธ์ฆ์„ ํ”„๋ก์‹œํ•˜๊ณ  ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Nginx๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. nomad.conf ํŒŒ์ผ์˜ ๋‚ด์šฉ:

upstream nomad-auth {
        server 172.30.0.5:4646;
}

server {

        server_name nomad.domain.name;
        
        location / {
	        proxy_pass http://nomad-auth;
	        proxy_set_header Host $host;
	        auth_basic_user_file /etc/nginx/.htpasswd;
		   auth_basic "Password-protected Area";
        }
        
}

์ด์ œ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์›น ํŒจ๋„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐํ•˜๊ณ  ์„œ๋ฒ„ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

Consul์„ ์‚ฌ์šฉํ•˜์—ฌ Nomad ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ฐ Gitlab๊ณผ ํ†ตํ•ฉ
์ด๋ฏธ์ง€ 1. Nomad ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„œ๋ฒ„ ๋ชฉ๋ก

๋‘ ์„œ๋ฒ„ ๋ชจ๋‘ ํŒจ๋„์— ์„ฑ๊ณต์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ nomad node status ๋ช…๋ น์˜ ์ถœ๋ ฅ์— ๋™์ผํ•œ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Consul์„ ์‚ฌ์šฉํ•˜์—ฌ Nomad ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ฐ Gitlab๊ณผ ํ†ตํ•ฉ
์ด๋ฏธ์ง€ 2. nomad node status ๋ช…๋ น์˜ ์ถœ๋ ฅ

์˜์‚ฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž. Consul ์ œ์–ดํŒ์˜ ๋…ธ๋“œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
Consul์„ ์‚ฌ์šฉํ•˜์—ฌ Nomad ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ฐ Gitlab๊ณผ ํ†ตํ•ฉ
์ด๋ฏธ์ง€ 3. Consul ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ ๋ชฉ๋ก

์ด์ œ ์šฐ๋ฆฌ๋Š” Consul๊ณผ ํ•จ๊ป˜ ์ผํ•˜๋Š” ์ค€๋น„๋œ Nomad๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” Gitlab์—์„œ Nomad๋กœ Docker ์ปจํ…Œ์ด๋„ˆ ์ „๋‹ฌ์„ ์„ค์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ๋…ํŠนํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Gitlab ์‹คํ–‰๊ธฐ ๋งŒ๋“ค๊ธฐ

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ Nomad์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Nomad ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ณ„๋„์˜ ์‹คํ–‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ Hashicorp ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„์ ์œผ๋กœ๋Š” ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค). ์‹คํ–‰๊ธฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ ๊ฐ„๋‹จํ•œ Dockerfile์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad

๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ .gitlab-ci.yml์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

variables:
  DOCKER_IMAGE: nomad/nomad-deploy
  DOCKER_REGISTRY: registry.domain.name
 

stages:
  - build

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}

๊ฒฐ๊ณผ์ ์œผ๋กœ Gitlab ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— Nomad ์‹คํ–‰๊ธฐ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ฒŒ ๋˜๋ฉฐ ์ด์ œ ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ๋กœ ์ง์ ‘ ์ด๋™ํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜๊ณ  Nomad์˜ nomad ์ž‘์—…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์„ค์ •

Nomad์— ๋Œ€ํ•œ ์ž‘์—… ํŒŒ์ผ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ๋งค์šฐ ์›์‹œ์ ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. .gitlab-ci์˜ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

variables:
  NOMAD_ADDR: http://nomad.address.service:4646
  DOCKER_REGISTRY: registry.domain.name
  DOCKER_IMAGE: example/project

stages:
  - build
  - deploy

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad-runner/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA}
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}


deploy:
  stage: deploy
  image: registry.example.com/nomad/nomad-runner:latest
  script:
    - envsubst '${CI_COMMIT_SHORT_SHA}' < project.nomad > job.nomad
    - cat job.nomad
    - nomad validate job.nomad
    - nomad plan job.nomad || if [ $? -eq 255 ]; then exit 255; else echo "success"; fi
    - nomad run job.nomad
  environment:
    name: production
  allow_failure: false
  when: manual

์—ฌ๊ธฐ์„œ ๋ฐฐํฌ๋Š” ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์€ ์ด๋ฏธ์ง€ ์กฐ๋ฆฝ๊ณผ ๋…ธ๋งˆ๋“œ๋กœ์˜ ๋ฐฐํฌ๋ผ๋Š” ๋‘ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์กฐ๋ฆฝํ•˜์—ฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” Nomad์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

job "monitoring-status" {
    datacenters = ["dc1"]
    migrate {
        max_parallel = 3
        health_check = "checks"
        min_healthy_time = "15s"
        healthy_deadline = "5m"
    }

    group "zhadan.ltd" {
        count = 1
        update {
            max_parallel      = 1
            min_healthy_time  = "30s"
            healthy_deadline  = "5m"
            progress_deadline = "10m"
            auto_revert       = true
        }
        task "service-monitoring" {
            driver = "docker"

            config {
                image = "registry.domain.name/example/project:${CI_COMMIT_SHORT_SHA}"
                force_pull = true
                auth {
                    username = "gitlab_user"
                    password = "gitlab_password"
                }
                port_map {
                    http = 8000
                }
            }
            resources {
                network {
                    port "http" {}
                }
            }
        }
    }
}

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

# Download the policy and token role
$ curl https://nomadproject.io/data/vault/nomad-server-policy.hcl -O -s -L
$ curl https://nomadproject.io/data/vault/nomad-cluster-role.json -O -s -L

# Write the policy to Vault
$ vault policy write nomad-server nomad-server-policy.hcl

# Create the token role with Vault
$ vault write /auth/token/roles/nomad-cluster @nomad-cluster-role.json

์ด์ œ ํ•„์š”ํ•œ ์ •์ฑ…์„ ์ƒ์„ฑํ•œ ํ›„ job.nomad ํŒŒ์ผ์˜ ์ž‘์—… ๋ธ”๋ก์— Vault์™€์˜ ํ†ตํ•ฉ์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

vault {
  enabled = true
  address = "https://vault.domain.name:8200"
  token = "token"
}

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

$ VAULT_TOKEN=<token> nomad agent -config /path/to/config

์ด์ œ Vault์—์„œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ์›๋ฆฌ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Nomad ์ž‘์—…์—์„œ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ €์žฅํ•  ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

template {
                data = <<EOH
{{with secret "secrets/pipeline-keys"}}
REGISTRY_LOGIN="{{ .Data.REGISTRY_LOGIN }}"
REGISTRY_PASSWORD="{{ .Data.REGISTRY_LOGIN }}{{ end }}"

EOH
    destination = "secrets/service-name.env"
    env = true
}

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

์ €์ž: Ilya Andreev, ํŽธ์ง‘์ž: Alexey Zhadan ๋ฐ Live Linux ํŒ€


์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€