๐ Consul: ์๋น์ค ๊ฒ์ ๋ฐ ๊ตฌ์ฑ ๊ด๋ฆฌ์ ๋ง๋ฒ์ฌ ๐งโโ๏ธ

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ด์. ๋ฐ๋ก Consul์ด๋ผ๋ ๋๋ผ์ด ๋๊ตฌ์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ ๊ฑฐ์์. ๐ Consul์ ๋ง์น ํ๋์ ์ธ IT ์ธํ๋ผ์ ๋ง๋ฒ์ฌ์ ๊ฐ์ ์กด์ฌ๋๋๋ค. ์ฌ๋ฌ๋ถ, ์ค๋น๋์ จ๋์? ๊ทธ๋ผ Consul์ ์ ๋น๋ก์ด ์ธ๊ณ๋ก ํจ๊ป ๋ ๋๋ณผ๊น์? ๐
๐ก ์ ๊น! Consul์ ๋ํด ๋ฐฐ์ฐ๊ธฐ ์ ์, ์ฐ๋ฆฌ๊ฐ ์ ์ด๋ฐ ๋๊ตฌ๊ฐ ํ์ํ์ง ์๊ฐํด๋ณผ๊น์? ํ๋์ IT ํ๊ฒฝ์ ๋ง์น ๋ณต์กํ ๋ฏธ๋ก์ ๊ฐ์์. ์๋ง์ ์๋น์ค๋ค์ด ์๋ก ์ฝํ์๊ณ , ๊ทธ ๊ตฌ์ฑ์ ๊ณ์ํด์ ๋ณํํ์ฃ . ์ด๋ฐ ํ๊ฒฝ์์ ์ด๋ป๊ฒ ํ๋ฉด ๋ชจ๋ ๊ฒ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฐ๊ฒฐํ ์ ์์๊น์? ๋ฐ๋ก ์ฌ๊ธฐ์ Consul์ด ๋ฑ์ฅํฉ๋๋ค!
๐ Consul์ด๋ ๋ฌด์์ธ๊ฐ์?
Consul์ HashiCorp๋ผ๋ ํ์ฌ์์ ๋ง๋ ์คํ์์ค ๋๊ตฌ์์. ์ด ๋๊ตฌ๋ ์๋น์ค ๊ฒ์(Service Discovery)๊ณผ ๊ตฌ์ฑ ๊ด๋ฆฌ(Configuration Management)๋ฅผ ์ํ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ด์์. ๋ง์น ํ๋์ ์ธ IT ์ธํ๋ผ์ ์ค์์ค ๊ตฐ์ฉ ์นผ๊ณผ ๊ฐ๋ค๊ณ ํ ์ ์์ฃ ! ๐จ๐ญ๐ช
Consul์ ์ฃผ์ ๊ธฐ๋ฅ์ ๊ฐ๋จํ ์ดํด๋ณผ๊น์?
- ๐ ์๋น์ค ๊ฒ์: ๋คํธ์ํฌ ์์ ์๋น์ค๋ค์ ์๋์ผ๋ก ์ฐพ์์ฃผ๊ณ ์ฐ๊ฒฐํด์ค๋๋ค.
- โ๏ธ ๊ตฌ์ฑ ๊ด๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์ค์์์ ๊ด๋ฆฌํ๊ณ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ด์.
- ๐ ๋ณด์: ์๋น์ค ๊ฐ ํต์ ์ ์์ ํ๊ฒ ์ํธํํฉ๋๋ค.
- ๐ฅ ํฌ์ค ์ฒดํฌ: ์๋น์ค์ ๊ฑด๊ฐ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํฉ๋๋ค.
์ด์ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ๋ํด ๋ ์์ธํ ์์๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์ถ๋ฐ~! ๐
๐ ์๋น์ค ๊ฒ์: Consul์ ์ํผ ํ์!
์, ์ฌ๋ฌ๋ถ! ์๋น์ค ๊ฒ์์ด ๋ญ์ง ์์๋์? ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์. ๐ค
์์ํด๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ด ๊ฑฐ๋ํ ๋์์ ์ด๊ณ ์๋ค๊ณ ํด๋ณผ๊น์? ์ด ๋์์๋ ์๋ง์ ๊ฐ๊ฒ๋ค์ด ์์ด์. ๋ ์คํ ๋, ์นดํ, ์์ ๋ฑ๋ฑ... ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ด ๊ฐ๊ฒ๋ค์ด ๊ณ์ํด์ ์์น๋ฅผ ๋ฐ๊พธ๊ณ , ์๋ก์ด ๊ฐ๊ฒ๊ฐ ์๊ธฐ๊ณ , ์ด๋ค ๊ฐ๊ฒ๋ ๋ฌธ์ ๋ซ๋๋ค๋ ๊ฑฐ์์. ๐ตโ๐ซ
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ํน์ ๊ฐ๊ฒ๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๋งค๋ฒ ๋์ ์ ์ฒด๋ฅผ ๋์๋ค๋๋ฉด์ ์ฐพ์์ผ ํ ๊น์? ๊ทธ๋ ๋ค๋ฉด ์ ๋ง ํ๋ค๊ฒ ์ฃ ?
๋ฐ๋ก ์ด๋ฐ ์ํฉ์ด ํ๋์ IT ์ธํ๋ผ์์๋ ์ผ์ด๋๊ณ ์์ด์. ์๋ง์ ์๋น์ค๋ค์ด ๊ณ์ํด์ ์๊ฒจ๋๊ณ , ์ฌ๋ผ์ง๊ณ , ์์น๋ฅผ ๋ฐ๊ฟ์. ์ด๋ฐ ํ๊ฒฝ์์ ํ์ํ ์๋น์ค๋ฅผ ์ด๋ป๊ฒ ์ฐพ์ ์ ์์๊น์?
๐ฆธโโ๏ธ ์ฌ๊ธฐ์ Consul์ ์๋น์ค ๊ฒ์ ๊ธฐ๋ฅ์ด ๋ฑ์ฅํฉ๋๋ค!
Consul์ ๋ง์น ๋ชจ๋ ์๋น์ค์ ์์น๋ฅผ ์ค์๊ฐ์ผ๋ก ์๊ณ ์๋ ์ํผ ๋ด๋น๊ฒ์ด์ ์์คํ ๊ณผ ๊ฐ์์. ์ด๋ค ์๋น์ค๊ฐ ์ด๋์ ์๋์ง, ์ง๊ธ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์๋์ง๋ฅผ ์ฆ์ ์๋ ค์ค ์ ์์ฃ .
๊ทธ๋ผ Consul์ ์๋น์ค ๊ฒ์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ ์์ธํ ์์๋ณผ๊น์? ๐ต๏ธโโ๏ธ
1. ์๋น์ค ๋ฑ๋ก ๐
๋จผ์ , ๋ชจ๋ ์๋น์ค๋ Consul์ ์์ ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํด์. ์ด ์ ๋ณด์๋ ์๋น์ค์ ์ด๋ฆ, IP ์ฃผ์, ํฌํธ ๋ฒํธ ๋ฑ์ด ํฌํจ๋ผ์. ๋ง์น ๊ฐ๊ฒ๊ฐ ์ ํ๋ฒํธ๋ถ์ ์์ ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ !
# Consul ์๋น์ค ์ ์ ์์ (JSON ํ์)
{
"service": {
"name": "web-app",
"port": 80,
"tags": ["v1", "production"],
"check": {
"http": "http://localhost/health",
"interval": "10s"
}
}
}
์์ ์ฝ๋๋ 'web-app'์ด๋ผ๋ ์๋น์ค๋ฅผ Consul์ ๋ฑ๋กํ๋ ์์์์. ์ด ์๋น์ค๋ 80๋ฒ ํฌํธ์์ ์คํ๋๊ณ ์๊ณ , 'v1'๊ณผ 'production'์ด๋ผ๋ ํ๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์์ด์. ๋ํ 10์ด๋ง๋ค ํ ๋ฒ์ฉ ํฌ์ค ์ฒดํฌ๋ฅผ ์ํํ๋๋ก ์ค์ ๋์ด ์์ฃ .
2. ์๋น์ค ์กฐํ ๐
์๋น์ค๊ฐ ํ์ํ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ Consul์๊ฒ "์ ๊ธฐ์, 'web-app' ์๋น์ค ์ด๋ ์๋์?"๋ผ๊ณ ๋ฌผ์ด๋ณผ ์ ์์ด์. ๊ทธ๋ฌ๋ฉด Consul์ ์ฆ์ ํด๋น ์๋น์ค์ ์์น ์ ๋ณด๋ฅผ ์๋ ค์ค์.
# Consul API๋ฅผ ํตํ ์๋น์ค ์กฐํ ์์
curl http://localhost:8500/v1/catalog/service/web-app
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด Consul์ 'web-app' ์๋น์ค์ ๋ชจ๋ ์ธ์คํด์ค ์ ๋ณด๋ฅผ JSON ํํ๋ก ๋ฐํํด์. ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ค๋ฅธ ์๋น์ค๋ค์ 'web-app'๊ณผ ํต์ ํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ฃ !
3. ๋์ ์ ๋ฐ์ดํธ ๐
์ฌ๊ธฐ์ ์ ๋ง ๋ฉ์ง ์ ์ Consul์ด ์ด ๋ชจ๋ ์ ๋ณด๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค๋ ๊ฑฐ์์. ์๋ก์ด ์๋น์ค๊ฐ ์ถ๊ฐ๋๊ฑฐ๋, ๊ธฐ์กด ์๋น์ค๊ฐ ์ค๋จ๋๊ฑฐ๋, ์๋น์ค์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด Consul์ ์ฆ์ ์ด ์ ๋ณด๋ฅผ ๋ฐ์ํด์.
์๋ฅผ ๋ค์ด, 'web-app' ์๋น์ค์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์ถ๊ฐ๋๋ฉด Consul์ ์๋์ผ๋ก ์ด๋ฅผ ๊ฐ์งํ๊ณ ์๋น์ค ๋ชฉ๋ก์ ์ถ๊ฐํด์. ๋ฐ๋๋ก ์ด๋ค ์ธ์คํด์ค๊ฐ ์ค๋จ๋๋ฉด Consul์ ์ด๋ฅผ ๋ชฉ๋ก์์ ์ ๊ฑฐํ์ฃ .
๐ก ์ฌ๋ฅ๋ท ํ! ์ด๋ฐ ๋์ ์๋น์ค ๊ฒ์ ๊ธฐ๋ฅ์ ํนํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ๋งค์ฐ ์ ์ฉํด์. ์ฌ๋ฅ๋ท๊ณผ ๊ฐ์ ํ๋ซํผ์์๋ ๋ค์ํ ์๋น์ค๋ค์ด ์๋ก ํต์ ํด์ผ ํ๋๋ฐ, Consul์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์๋น์ค ๊ฐ ์ฐ๊ฒฐ์ ํจ์ฌ ๋ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ต๋๋ค!
4. ๋ก๋ ๋ฐธ๋ฐ์ฑ โ๏ธ
Consul์ ์๋น์ค ๊ฒ์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ธ ๋ก๋ ๋ฐธ๋ฐ์ฑ๋ ์ ๊ณตํด์. ๊ฐ์ ์๋น์ค์ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์์ ๋, Consul์ ์ด๋ค ์ค ํ๋๋ฅผ ์ ํํด์ ๋ฐํํ ์ ์์ด์. ์ด๋ฅผ ํตํด ํธ๋ํฝ์ ์ฌ๋ฌ ์ธ์คํด์ค์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ์ํฌ ์ ์์ฃ .
์๋ฅผ ๋ค์ด, 'web-app' ์๋น์ค์ ์ธ์คํด์ค๊ฐ 3๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณผ๊น์? Consul์ ์ด ์ค ํ๋๋ฅผ ๋ฌด์์๋ก ์ ํํด์ ๋ฐํํ ์ ์์ด์. ์ด๋ ๊ฒ ํ๋ฉด ํ ์ธ์คํด์ค์ ๋ชจ๋ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ต๋๋ค.
5. ํฌ์ค ์ฒดํฌ ํตํฉ ๐ฅ
Consul์ ์๋น์ค ๊ฒ์์ ํฌ์ค ์ฒดํฌ ๊ธฐ๋ฅ๊ณผ ๊ธด๋ฐํ๊ฒ ํตํฉ๋์ด ์์ด์. ๊ฐ ์๋น์ค๋ ์์ ์ ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก Consul์ ๋ณด๊ณ ํด์. ๋ง์ฝ ์ด๋ค ์๋น์ค๊ฐ ๊ฑด๊ฐํ์ง ์๋ค๊ณ ํ๋จ๋๋ฉด, Consul์ ํด๋น ์๋น์ค๋ฅผ ๊ฒ์ ๊ฒฐ๊ณผ์์ ์ ์ธ์์ผ์.
์ด๋ ๊ฒ ํ๋ฉด ํด๋ผ์ด์ธํธ๋ค์ ํญ์ ๊ฑด๊ฐํ ์๋น์ค ์ธ์คํด์ค์๋ง ์ฐ๊ฒฐ๋ ์ ์์ด์. ์ฅ์ ๊ฐ ๋ฐ์ํ ์๋น์ค๋ก ํธ๋ํฝ์ด ์ ์ก๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ฃ .
์์ ๋ค์ด์ด๊ทธ๋จ์ Consul์ ์ค์ฌ์ผ๋ก ์ฌ๋ฌ ์๋น์ค๋ค์ด ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ด์. ๊ฐ ์๋น์ค๋ Consul์ ์์ ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๊ณ , Consul์ ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋น์ค ๊ฒ์์ ์ํํ๋ ๊ฑฐ์ฃ .
6. DNS ์ธํฐํ์ด์ค ๐
Consul์ DNS ์ธํฐํ์ด์ค๋ ์ ๊ณตํด์. ์ด ๋ง์ ๋ฌด์์ด๋๊ณ ์? ์๋น์ค๋ฅผ ์ฐพ๊ธฐ ์ํด ํน๋ณํ API๋ฅผ ์ฌ์ฉํ์ง ์์๋, ๊ทธ๋ฅ ์ผ๋ฐ์ ์ธ DNS ์ฟผ๋ฆฌ๋ก ์๋น์ค๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๋ป์ด์์!
์๋ฅผ ๋ค์ด, 'web-app.service.consul'์ด๋ผ๋ DNS ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๋ฉด Consul์ 'web-app' ์๋น์ค์ IP ์ฃผ์๋ฅผ ๋ฐํํด์. ์ด๋ ๊ธฐ์กด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ค๋ ์ฝ๊ฒ Consul์ ์๋น์ค ๊ฒ์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๊ฒ ํด์ฃผ์ฃ .
# DNS๋ฅผ ํตํ ์๋น์ค ์กฐํ ์์
dig @127.0.0.1 -p 8600 web-app.service.consul
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด 'web-app' ์๋น์ค์ IP ์ฃผ์๋ฅผ DNS ์๋ต์ผ๋ก ๋ฐ์ ์ ์์ด์.
7. ๋ค์ค ๋ฐ์ดํฐ์ผํฐ ์ง์ ๐
Consul์ ์๋น์ค ๊ฒ์์ ์ฌ๋ฌ ๋ฐ์ดํฐ์ผํฐ์ ๊ฑธ์ณ์๋ ์๋ํด์. ์ด๋ ๊ธ๋ก๋ฒ ๊ท๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํนํ ์ ์ฉํ์ฃ . ์๋ฅผ ๋ค์ด, ์์์์ ์๋ ์๋น์ค๊ฐ ์ ๋ฝ์ ์๋น์ค๋ฅผ ์ฐพ์์ผ ํ ๋๋ Consul์ ํตํด ์ฝ๊ฒ ํ ์ ์์ด์.
๊ฐ ๋ฐ์ดํฐ์ผํฐ์ Consul ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๊ณ , ์ด๋ค์ ์๋ก ์ฐ๊ฒฐํ๋ฉด ๋ผ์. ๊ทธ๋ฌ๋ฉด ํ ๋ฐ์ดํฐ์ผํฐ์ ์๋น์ค๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ์ผํฐ์ ์๋น์ค๋ฅผ ๋ง์น ๊ฐ์ ๋คํธ์ํฌ์ ์๋ ๊ฒ์ฒ๋ผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ต๋๋ค.
๐ก ์ฌ๋ฅ๋ท ํ! ๊ธ๋ก๋ฒ ์๋น์ค๋ฅผ ์ด์ํ๋ ์ฌ๋ฅ๋ท๊ณผ ๊ฐ์ ํ๋ซํผ์์๋ ์ด๋ฐ ๋ค์ค ๋ฐ์ดํฐ์ผํฐ ์ง์ ๊ธฐ๋ฅ์ด ๋งค์ฐ ์ ์ฉํ ์ ์์ด์. ์ ์ธ๊ณ์ ์ฌ์ฉ์๋ค์๊ฒ ๋น ๋ฅธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ฉด์๋, ๋ฐฑ์๋ ์์คํ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ !
8. ์๋น์ค ๋ฉ์ ํตํฉ ๐ธ๏ธ
Consul์ ์๋น์ค ๋ฉ์ ๊ธฐ๋ฅ๋ ์ ๊ณตํด์. ์๋น์ค ๋ฉ์๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํต์ ์ ๊ด๋ฆฌํ๋ ์ธํ๋ผ ๊ณ์ธต์ ๋งํด์. Consul Connect๋ผ๋ ๊ธฐ๋ฅ์ ํตํด ์๋น์ค ๊ฐ ํต์ ์ ์์ ํ๊ฒ ์ํธํํ๊ณ , ์ ๊ทผ ์ ์ด๋ฅผ ํ ์ ์์ด์.
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์๋น์ค ๊ฒ์๋ฟ๋ง ์๋๋ผ, ๋ฐ๊ฒฌ๋ ์๋น์ค์์ ์์ ํ ํต์ ๊น์ง Consul์ด ์ฑ ์์ ธ์ค์. ๋ง์น ๋ชจ๋ ์๋น์ค๋ค์ด ๋ณด์ ๋ด๋น ๋น์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ์ฃ !
๊ฒฐ๋ก : Consul์ ์๋น์ค ๊ฒ์, ์ ์ค์ํ ๊น์? ๐ค
์, ์ด์ Consul์ ์๋น์ค ๊ฒ์ ๊ธฐ๋ฅ์ ๋ํด ๊ฝค ์์ธํ ์์๋ดค์ด์. ๊ทธ๋ฐ๋ฐ ์ ์ด ๊ธฐ๋ฅ์ด ๊ทธ๋ ๊ฒ ์ค์ํ ๊น์?
- ๋์ ํ๊ฒฝ ๋์: ํ๋์ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์๋ ์๋น์ค์ ์์น๊ฐ ๊ณ์ ๋ณํ ์ ์์ด์. Consul์ ์ด๋ฐ ๋์ ์ธ ํ๊ฒฝ์์๋ ํญ์ ์ต์ ์ ์๋น์ค ์ ๋ณด๋ฅผ ์ ๊ณตํด์.
- ์๋ํ: ์๋น์ค์ ๋ฑ๋ก๊ณผ ๋ฐ๊ฒฌ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ ธ์. ๊ฐ๋ฐ์๋ ์ด์์๊ฐ ์ผ์ผ์ด ์ค์ ํ์ผ์ ์์ ํ ํ์๊ฐ ์์ฃ .
- ํ์ฅ์ฑ: ์๋น์ค์ ์๊ฐ ๋์ด๋๋ Consul์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด์. ๋ช ๊ฐ์ ์๋น์ค๋ , ๋ช ์ฒ ๊ฐ์ ์๋น์ค๋ ๋ฌธ์ ์์ฃ .
- ์์ ์ฑ: ํฌ์ค ์ฒดํฌ์ ํตํฉ๋์ด ์์ด ํญ์ ๊ฑด๊ฐํ ์๋น์ค๋ง์ ๋ฐํํด์. ์ด๋ ์์คํ ์ ์์ ์ฑ์ ํฌ๊ฒ ๋์ฌ์ค์.
- ์ ์ฐ์ฑ: DNS ์ธํฐํ์ด์ค, HTTP API ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์๋น์ค๋ฅผ ์ฐพ์ ์ ์์ด์. ์ด๋ ๋ค์ํ ํ๊ฒฝ๊ณผ ์๊ตฌ์ฌํญ์ ๋์ํ ์ ์๊ฒ ํด์ค์.
์ด๋ฌํ ํน์ง๋ค ๋๋ถ์ Consul์ ์๋น์ค ๊ฒ์ ๊ธฐ๋ฅ์ ํ๋์ ์ธ ๋ถ์ฐ ์์คํ ์์ ์์ด์๋ ์ ๋ ์ค์ํ ๋๊ตฌ๊ฐ ๋์์ด์. ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ, ์ปจํ ์ด๋ ๊ธฐ๋ฐ ํ๊ฒฝ, ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ ๋ค์ํ ํ๋์ ์ธ IT ํ๊ฒฝ์์ Consul์ ํต์ฌ์ ์ธ ์ญํ ์ ์ํํ๊ณ ์๋ต๋๋ค.
๐ญ ์์ํด๋ณด์ธ์: Consul ์์ด ์๋ฐฑ, ์์ฒ ๊ฐ์ ์๋น์ค๋ค์ด ์๋ก๋ฅผ ์ฐพ์ ํค๋งค๋ ๋ชจ์ต์... ๋ง์น ๊ฑฐ๋ํ ๋ฏธ๋ก ์์์ ๊ธธ์ ์์ ์ฅ๋ค ๊ฐ์ง ์๋์? ํ์ง๋ง Consul์ด ์๋ค๋ฉด, ๋ชจ๋ ์๋น์ค๋ค์ ์ธ์ ๋ ์๋ก์ ์์น๋ฅผ ์ ํํ ์ ์ ์์ด์. ๋ง์น ๋ชจ๋ ์ฅ๋ค์๊ฒ ์๋ฒฝํ ๋ฏธ๋ก ์ง๋๋ฅผ ์ค ๊ฒ๊ณผ ๊ฐ์ฃ !
์, ์ด์ Consul์ ์๋น์ค ๊ฒ์์ ๋ํด ๊ฝค ๊น์ด ์๊ฒ ์์๋ดค์ด์. ์ด๋ ์ ๊ฐ์? ์ ๋ง ๋๋จํ ๊ธฐ๋ฅ์ด์ฃ ? ํ์ง๋ง Consul์ ๋ง๋ฒ์ ์ฌ๊ธฐ์ ๋๋์ง ์์์. ๋ค์์ผ๋ก๋ Consul์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ '๊ตฌ์ฑ ๊ด๋ฆฌ'์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ์ํด์ Consul์ ์ธ๊ณ๋ก ๋ ๊น์ด ๋ค์ด๊ฐ ๋ณผ๊น์? ๐
โ๏ธ ๊ตฌ์ฑ ๊ด๋ฆฌ: Consul์ ๋ง๋ฒ ์งํก์ด ๐งโโ๏ธ
์, ์ด์ Consul์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ '๊ตฌ์ฑ ๊ด๋ฆฌ'์ ๋ํด ์์๋ณผ ์๊ฐ์ด์์. ์ด ๊ธฐ๋ฅ์ ๋ง์น ๋ง๋ฒ ์งํก์ด์ ๊ฐ์์. ์ ๊ทธ๋ฐ์ง ํจ๊ป ์ดํด๋ณผ๊น์? ๐ฎ
๊ตฌ์ฑ ๊ด๋ฆฌ๋ ๋ฌด์์ธ๊ฐ์? ๐ค
๊ตฌ์ฑ ๊ด๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋งํด์. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด, API ํค, ๊ธฐ๋ฅ ํ๋๊ทธ ๋ฑ์ด ๋ชจ๋ ๊ตฌ์ฑ์ ํฌํจ๋ ์ ์์ด์. ์ด๋ฐ ์ค์ ๋ค์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํ ๊น์?
๐ญ ์์ํด๋ณด์ธ์: ์ฌ๋ฌ๋ถ์ด ๊ฑฐ๋ํ ์ค์ผ์คํธ๋ผ์ ์งํ์๋ผ๊ณ ์๊ฐํด๋ณด์ธ์. ๊ฐ ์ ๊ธฐ ์ฐ์ฃผ์๋ค(์๋น์ค๋ค)์๊ฒ ์ด๋ค ๊ณก์ ์ฐ์ฃผํ ์ง, ์ด๋ค ํ ํฌ๋ก ์ฐ์ฃผํ ์ง ๋ฑ์ ์ง์๋ฅผ ๋ด๋ ค์ผ ํด์. ๊ทธ๋ฐ๋ฐ ๊ณต์ฐ ์ค๊ฐ์ ๊ณก์ ๋ฐ๊ฟ์ผ ํ๋ค๋ฉด? ๋ชจ๋ ์ฐ์ฃผ์์๊ฒ ์ผ์ผ์ด ๊ฐ์ ์๋ก์ด ์ ๋ณด๋ฅผ ๋๋ ์ค์ผ ํ ๊น์? ์ด๋ฐ ์ํฉ์์ Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ ๋ง์น ๋ง๋ฒ์ ์งํ๋ด๊ณผ ๊ฐ์์. ์งํ๋ด์ ํ ๋ฒ ํ๋๋ฅด๋ฉด ๋ชจ๋ ์ฐ์ฃผ์์ ์ ๋ณด๊ฐ ์์๊ฐ์ ๋ฐ๋๋ ๊ฑฐ์ฃ !
Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ์๋ํ๋์? ๐ ๏ธ
Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ Key/Value ์ ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํด์. ์ด๋ ๋ง์น ๊ฑฐ๋ํ ์ฌ์ ๊ณผ ๊ฐ์์. ๊ฐ ์ค์ ํญ๋ชฉ(Key)์ ๋ํด ํด๋นํ๋ ๊ฐ(Value)์ ์ ์ฅํ ์ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ณด๋ ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋๊ณ ์ ํ๋ผ์.
1. ๊ตฌ์ฑ ์ ์ฅ ๐ฅ
๋จผ์ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ์ Consul์ Key/Value ์ ์ฅ์์ ์ ์ฅํด์. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์:
# Consul CLI๋ฅผ ์ฌ์ฉํ ๊ตฌ์ฑ ์ ์ฅ ์์
consul kv put config/database/url "mysql://user:password@localhost:3306/mydb"
consul kv put config/database/max_connections "100"
์ด๋ ๊ฒ ํ๋ฉด 'config/database/url'๊ณผ 'config/database/max_connections'๋ผ๋ ํค์ ๊ฐ๊ฐ์ ๊ฐ์ด ์ ์ฅ๋ผ์.
2. ๊ตฌ์ฑ ์กฐํ ๐
์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ๋ Consul์์ ์ด ๊ตฌ์ฑ์ ์กฐํํ ์ ์์ด์:
# Consul CLI๋ฅผ ์ฌ์ฉํ ๊ตฌ์ฑ ์กฐํ ์์
consul kv get config/database/url
consul kv get config/database/max_connections
์ด ๋ช ๋ น์ด๋ค์ ๊ฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค URL๊ณผ ์ต๋ ์ฐ๊ฒฐ ์๋ฅผ ๋ฐํํ ๊ฑฐ์์.
3. ์ค์๊ฐ ์ ๋ฐ์ดํธ ๐
Consul์ ์ ๋ง ๋ฉ์ง ์ ์ ์ด ๊ตฌ์ฑ์ด ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ค๋ ๊ฑฐ์์. ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด Consul์ ์ฆ์ ์ด๋ฅผ ๊ฐ์งํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋ ํ๊ณ ์๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ค์ค์.
# ๊ตฌ์ฑ ๋ณ๊ฒฝ ์์
consul kv put config/database/max_connections "200"
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด, ์ต๋ ์ฐ๊ฒฐ ์๊ฐ 100์์ 200์ผ๋ก ๋ณ๊ฒฝ๋ผ์. ๊ทธ๋ฆฌ๊ณ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ๋ชจ ๋ ๊ด๋ จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ๋ฉ๋๋ค.
4. ๊ตฌ์ฑ ๋ฒ์ ๊ด๋ฆฌ ๐
Consul์ ๊ฐ ๊ตฌ์ฑ ํญ๋ชฉ์ ๋ณ๊ฒฝ ์ด๋ ฅ๋ ๊ด๋ฆฌํด์. ์ด๋ฅผ ํตํด ์ธ์ , ์ด๋ค ๋ณ๊ฒฝ์ด ์์๋์ง ์ถ์ ํ ์ ์๊ณ , ํ์ํ๋ค๋ฉด ์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑํ ์๋ ์์ด์.
# ๊ตฌ์ฑ ํญ๋ชฉ์ ๋ณ๊ฒฝ ์ด๋ ฅ ์กฐํ
consul kv get -recurse -detailed config/database/max_connections
์ด ๋ช ๋ น์ด๋ 'max_connections' ์ค์ ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ณด์ฌ์ค ๊ฑฐ์์.
5. ์ ๊ทผ ์ ์ด ๐
Consul์ ACL(Access Control List)์ ํตํด ๊ตฌ์ฑ์ ๋ํ ์ ๊ทผ์ ์ ์ดํ ์ ์์ด์. ์ด๋ฅผ ํตํด ํน์ ์ฌ์ฉ์๋ ์๋น์ค๋ง ํน์ ๊ตฌ์ฑ์ ์ฝ๊ฑฐ๋ ์์ ํ ์ ์๋๋ก ์ค์ ํ ์ ์์ฃ .
# ACL ํ ํฐ์ ์ฌ์ฉํ ๊ตฌ์ฑ ์ ๊ทผ ์์
consul kv put -token=<your-token> config/api/key "secret-api-key"
์ด๋ ๊ฒ ํ๋ฉด ์ ์ ํ ๊ถํ์ ๊ฐ์ง ํ ํฐ์ ๊ฐ์ง ์ฌ์ฉ์๋ ์๋น์ค๋ง API ํค๋ฅผ ์ค์ ํ ์ ์์ด์.
Consul ๊ตฌ์ฑ ๊ด๋ฆฌ์ ์ฅ์ ๐
์, ์ด์ Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์๋ดค์ด์. ๊ทธ๋ผ ์ด ๊ธฐ๋ฅ์ด ์ ๊ทธ๋ ๊ฒ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ์ง ์ ๋ฆฌํด๋ณผ๊น์?
- ์ค์ ์ง์คํ: ๋ชจ๋ ๊ตฌ์ฑ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์ด์. ์ด๋ ๊ด๋ฆฌ์ ํจ์จ์ฑ์ ํฌ๊ฒ ๋์ฌ์ค์.
- ์ค์๊ฐ ์ ๋ฐ์ดํธ: ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ์ฆ์ ๋ชจ๋ ๊ด๋ จ ์๋น์ค์ ์ ํ๋ผ์. ์๋น์ค๋ฅผ ์ฌ์์ํ ํ์๊ฐ ์์ฃ .
- ๋ฒ์ ๊ด๋ฆฌ: ๊ตฌ์ฑ์ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ถ์ ํ๊ณ ํ์์ ๋กค๋ฐฑํ ์ ์์ด์.
- ๋ณด์: ACL์ ํตํด ๊ตฌ์ฑ์ ๋ํ ์ ๊ทผ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ด์.
- ํ์ฅ์ฑ: ์์ ๊ท๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ถํฐ ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ๊น์ง ๋ชจ๋ ์ฌ์ฉํ ์ ์์ด์.
๐ก ์ฌ๋ฅ๋ท ํ! ์ฌ๋ฅ๋ท๊ณผ ๊ฐ์ ๋๊ท๋ชจ ํ๋ซํผ์์๋ ์ด๋ฐ ๊ตฌ์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ํนํ ์ ์ฉํด์. ์๋ฅผ ๋ค์ด, ์๋ก์ด ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ๋กค์์ํ๊ฑฐ๋, ์ง์ญ๋ณ๋ก ๋ค๋ฅธ ์ค์ ์ ์ ์ฉํ๊ฑฐ๋, ๊ธด๊ธ ์ํฉ์์ ๋น ๋ฅด๊ฒ ์ค์ ์ ๋ณ๊ฒฝํด์ผ ํ ๋ Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ด์.
์ค์ ์ฌ์ฉ ์ฌ๋ก ๐
Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด๋ณผ๊น์?
1. ๊ธฐ๋ฅ ํ๋๊ทธ ๊ด๋ฆฌ ๐ฉ
์๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ์ง๋ง ์์ง ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๊ณต๊ฐํ๊ณ ์ถ์ง ์๋ค๋ฉด? Consul์ ์ฌ์ฉํด ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ๊ด๋ฆฌํ ์ ์์ด์.
# ๊ธฐ๋ฅ ํ๋๊ทธ ์ค์
consul kv put features/new_ui_enabled "false"
# ์ ํ๋ฆฌ์ผ์ด์
์์์ ์ฌ์ฉ (์์ฌ ์ฝ๋)
if (consul.get("features/new_ui_enabled") == "true") {
showNewUI();
} else {
showOldUI();
}
์ด๋ ๊ฒ ํ๋ฉด ์ธ์ ๋ Consul์์ ๊ฐ์ "true"๋ก ๋ณ๊ฒฝํ์ฌ ์ UI๋ฅผ ํ์ฑํํ ์ ์์ด์.
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ ๊ด๋ฆฌ ๐พ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ Consul์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์์ด์.
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ ์ค์
consul kv put config/database/primary/host "db.example.com"
consul kv put config/database/primary/port "5432"
consul kv put config/database/primary/username "app_user"
consul kv put config/database/primary/password "super_secret"
# ์ ํ๋ฆฌ์ผ์ด์
์์์ ์ฌ์ฉ (์์ฌ ์ฝ๋)
dbConfig = {
host: consul.get("config/database/primary/host"),
port: consul.get("config/database/primary/port"),
username: consul.get("config/database/primary/username"),
password: consul.get("config/database/primary/password")
}
connectToDatabase(dbConfig);
์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ Consul์์ ๋ฐ๋ก ๋ณ๊ฒฝํ ์ ์์ด์.
3. ๋์ ์๋น์ค ๊ตฌ์ฑ ๐
์๋น์ค์ ๋์์ ์ค์๊ฐ์ผ๋ก ์กฐ์ ํด์ผ ํ ๋ Consul์ ์ฌ์ฉํ ์ ์์ด์.
# ์๋น์ค ๊ตฌ์ฑ ์ค์
consul kv put config/api_service/rate_limit "1000"
consul kv put config/api_service/timeout "30"
# ์ ํ๋ฆฌ์ผ์ด์
์์์ ์ฌ์ฉ (์์ฌ ์ฝ๋)
function handleRequest() {
rateLimit = parseInt(consul.get("config/api_service/rate_limit"));
timeout = parseInt(consul.get("config/api_service/timeout"));
if (checkRateLimit(rateLimit)) {
processRequestWithTimeout(timeout);
} else {
returnRateLimitError();
}
}
์ด๋ ๊ฒ ํ๋ฉด ์๋น์ค์ ์๋ ์ ํ์ด๋ ํ์์์ ์ค์ ์ ์ค์๊ฐ์ผ๋ก ์กฐ์ ํ ์ ์์ด์.
์ฃผ์ํ ์ โ ๏ธ
Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๋ง ๊ฐ๋ ฅํ์ง๋ง, ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค๋ ์์ด์:
- ๋ณด์: ์ค์ํ ์ ๋ณด(์: ๋น๋ฐ๋ฒํธ, API ํค)๋ฅผ ์ ์ฅํ ๋๋ ๋ฐ๋์ ์ํธํํด์ผ ํด์.
- ์ผ๊ด์ฑ: ๋ถ์ฐ ์์คํ ์์๋ ์ผ์์ ์ผ๋ก ๊ตฌ์ฑ์ด ๋ถ์ผ์นํ ์ ์์ด์. ์ด๋ฅผ ๊ณ ๋ คํ ์ค๊ณ๊ฐ ํ์ํด์.
- ๋ณต์ก์ฑ: ๊ตฌ์ฑ ๊ด๋ฆฌ๋ฅผ ๊ณผ๋ํ๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋๋ก ์ฃผ์ํด์ผ ํด์.
- ์์กด์ฑ: Consul์ ๊ณผ๋ํ๊ฒ ์์กดํ๋ฉด Consul ์์ฒด๊ฐ ๋จ์ผ ์คํจ ์ง์ ์ด ๋ ์ ์์ด์. ์ ์ ํ ๋ฐฑ์ ๊ณผ ๋ณต๊ตฌ ์ ๋ต์ด ํ์ํด์.
๐ญ ์์ํด๋ณด์ธ์: Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ ๋ง์น ๋ง๋ฒ์ฌ์ ๋ง๋ฒ์ฑ ๊ณผ ๊ฐ์์. ๋ง๋ฒ์ฌ๊ฐ ์ฃผ๋ฌธ์ ๋ฐ๊พธ๋ฉด ์ ์ธ๊ณ์ ๋ชจ๋ ๊ฒ์ด ์ฆ์ ๊ทธ์ ๋ง์ถฐ ๋ณํ์ฃ . ํ์ง๋ง ๊ฐ๋ ฅํ ๋ง๋ฒ์ธ ๋งํผ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํด์. ์๋ชป๋ ์ฃผ๋ฌธ์ ์ธ์ฐ๋ฉด ์๋์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ผ๋๊น์!
๊ฒฐ๋ก : Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ, ํ๋์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ ์์ ๐
์, ์ด์ Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ์ ๋ํด ๊ฝค ์์ธํ ์์๋ดค์ด์. ์ด ๊ธฐ๋ฅ์ ํ๋์ ์ธ ๋ถ์ฐ ์์คํ ๊ณผ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ ๋ง ์ค์ํ ์ญํ ์ ํด์. ์ค์๊ฐ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์กฐ์ ํ๊ณ , ์ค์์์ ๋ชจ๋ ๊ตฌ์ฑ์ ๊ด๋ฆฌํ๋ฉฐ, ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ์ ํํ ์ ์์ฃ .
Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ป์ ์ ์์ด์:
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ ํฅ์
- ์ด์ ํจ์จ์ฑ ์ฆ๋
- ๋ณ๊ฒฝ ๊ด๋ฆฌ์ ๊ฐ์ํ
- ์์คํ ์ ๋ฐ์ ์ผ๊ด์ฑ ์ ์ง
๋ฌผ๋ก , ์ด๋ฐ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ์ค๊ณ๊ฐ ํ์ํด์. ํ์ง๋ง ์ ๋๋ก ํ์ฉํ๋ค๋ฉด, Consul์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ ์ฌ๋ฌ๋ถ์ ์์คํ ์ ํ ๋จ๊ณ ๋ ๋ฐ์ ์ํฌ ์ ์๋ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋ ๊ฑฐ์์.
์, ์ด์ Consul์ ๋ ๊ฐ์ง ํต์ฌ ๊ธฐ๋ฅ์ธ ์๋น์ค ๊ฒ์๊ณผ ๊ตฌ์ฑ ๊ด๋ฆฌ์ ๋ํด ์์๋ดค์ด์. ์ด ๋ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ๋ฉด ์ ๋ง ๊ฐ๋ ฅํ ๋ถ์ฐ ์์คํ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ์ ์์ด์. ๋ค์์ผ๋ก๋ Consul์ ๋ ๋ค๋ฅธ ์ค์ํ ๊ธฐ๋ฅ์ธ 'ํฌ์ค ์ฒดํฌ'์ ๋ํด ์์๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ์ํด์ Consul์ ๋ง๋ฒ ๊ฐ์ ์ธ๊ณ๋ก ๋ ๊น์ด ๋ค์ด๊ฐ ๋ณผ๊น์? ๐
๐ฅ ํฌ์ค ์ฒดํฌ: Consul์ ๊ฑด๊ฐ ์งํด์ด ๐ฉบ
์, ์ด์ Consul์ ๋ ๋ค๋ฅธ ์ค์ํ ๊ธฐ๋ฅ์ธ 'ํฌ์ค ์ฒดํฌ'์ ๋ํด ์์๋ณผ ์๊ฐ์ด์์. ์ด ๊ธฐ๋ฅ์ ๋ง์น ์์คํ ์ ์ฃผ์น์์ ๊ฐ์ ์ญํ ์ ํ๋ต๋๋ค. ์ ๊ทธ๋ฐ์ง ํจ๊ป ์ดํด๋ณผ๊น์? ๐
ํฌ์ค ์ฒดํฌ๋ ๋ฌด์์ธ๊ฐ์? ๐ค
ํฌ์ค ์ฒดํฌ๋ ์๋น์ค๋ ๋ ธ๋์ ๊ฑด๊ฐ ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํ๋ ๊ณผ์ ์ ๋งํด์. ์ด๋ฅผ ํตํด ์์คํ ์ ์ด๋ค ๋ถ๋ถ์ด ์ ์์ ์ผ๋ก ์๋ํ๊ณ ์๋์ง, ์ด๋ค ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ์๋์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ ํ ์ ์์ฃ .
๐ญ ์์ํด๋ณด์ธ์: ์ฌ๋ฌ๋ถ์ด ๊ฑฐ๋ํ ๋ณ์์ ์์ฅ์ด๋ผ๊ณ ์๊ฐํด๋ณด์ธ์. ์๋ง์ ํ์๋ค(์๋น์ค๋ค)์ด ์๊ณ , ๊ฐ ํ์์ ์ํ๋ฅผ ๊ณ์ ์ฒดํฌํด์ผ ํด์. ๊ทธ๋ฐ๋ฐ ์ผ์ผ์ด ๋ชจ๋ ๋ณ์ค์ ๋์๋ค๋๋ฉด์ ํ์ธํ ์๋ ์๊ฒ ์ฃ ? Consul์ ํฌ์ค ์ฒดํฌ๋ ๋ง์น ๊ฐ ๋ณ์ค์ ์๋ ๋ชจ๋ํฐ๋ง ์์คํ ์ ์ค์นํ ๊ฒ๊ณผ ๊ฐ์์. ํ์์ ์ํ๊ฐ ๋๋น ์ง๋ฉด ์ฆ์ ์๋ฆผ์ด ์ค๊ณ , ํ์ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ ๊ฑฐ์ฃ !
Consul์ ํฌ์ค ์ฒดํฌ๋ ์ด๋ป๊ฒ ์๋ํ๋์? ๐ ๏ธ
Consul์ ํฌ์ค ์ฒดํฌ๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์๋น์ค์ ์ํ๋ฅผ ํ์ธํ ์ ์์ด์. ์ฃผ์ ๋ฐฉ์๋ค์ ์ดํด๋ณผ๊น์?
1. HTTP ์ฒดํฌ ๐
์๋น์ค๊ฐ ์น ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ค๋ฉด, Consul์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ด ์๋ํฌ์ธํธ์ HTTP ์์ฒญ์ ๋ณด๋ด ์๋ต์ ํ์ธํ ์ ์์ด์.
{
"check": {
"id": "api-health",
"name": "API Health Check",
"http": "http://localhost:8080/health",
"method": "GET",
"interval": "10s",
"timeout": "1s"
}
}
์ด ์ค์ ์ 10์ด๋ง๋ค ํ ๋ฒ์ฉ 'http://localhost:8080/health' ์๋ํฌ์ธํธ์ GET ์์ฒญ์ ๋ณด๋ด๊ณ , 1์ด ์์ ์๋ต์ด ์ค์ง ์์ผ๋ฉด ์คํจ๋ก ๊ฐ์ฃผํด์.
2. TCP ์ฒดํฌ ๐
์๋น์ค๊ฐ ํน์ ํฌํธ์์ ๋ฆฌ์ค๋ํ๊ณ ์๋ค๋ฉด, Consul์ ํด๋น ํฌํธ์ ์ฐ๊ฒฐ์ ์๋ํด ์๋น์ค์ ์ํ๋ฅผ ํ์ธํ ์ ์์ด์.
{
"check": {
"id": "database-connection",
"name": "Database Connection Check",
"tcp": "localhost:5432",
"interval": "30s",
"timeout": "5s"
}
}
์ด ์ค์ ์ 30์ด๋ง๋ค ํ ๋ฒ์ฉ localhost์ 5432 ํฌํธ(์ผ๋ฐ์ ์ธ PostgreSQL ํฌํธ)์ ์ฐ๊ฒฐ์ ์๋ํด์. 5์ด ์์ ์ฐ๊ฒฐ์ด ๋์ง ์์ผ๋ฉด ์คํจ๋ก ๊ฐ์ฃผํ์ฃ .
3. ์คํฌ๋ฆฝํธ ์ฒดํฌ ๐
๋ ๋ณต์กํ ์ฒดํฌ๊ฐ ํ์ํ๋ค๋ฉด, Consul์ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ด์.
{
"check": {
"id": "memory-usage",
"name": "Memory Usage Check",
"args": ["/usr/local/bin/check_memory.sh"],
"interval": "60s"
}
}
์ด ์ค์ ์ 60์ด๋ง๋ค ํ ๋ฒ์ฉ 'check_memory.sh' ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์. ์ด ์คํฌ๋ฆฝํธ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฒดํฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๊ฒ ์ฃ .
4. TTL(Time To Live) ์ฒดํฌ โณ
์๋น์ค๊ฐ ์์ฒด์ ์ผ๋ก ์ํ๋ฅผ ๋ณด๊ณ ํ ์ ์๋ค๋ฉด, TTL ์ฒดํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
{
"check": {
"id": "web-app-report",
"name": "Web App Status Report",
"ttl": "60s"
}
}
์ด ์ค์ ์์๋ ์๋น์ค๊ฐ 60์ด๋ง๋ค ํ ๋ฒ์ฉ ์์ ์ ์ํ๋ฅผ Consul์ ๋ณด๊ณ ํด์ผ ํด์. 60์ด ์์ ๋ณด๊ณ ๊ฐ ์์ผ๋ฉด Consul์ ํด๋น ์๋น์ค์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จํ์ฃ .
ํฌ์ค ์ฒดํฌ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ ๐
Consul์ ํฌ์ค ์ฒดํฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ํ ์์ ์ ์ํํ ์ ์์ด์:
- ์๋น์ค ๊ฒ์์์ ์ ์ธ: ํฌ์ค ์ฒดํฌ์ ์คํจํ ์๋น์ค๋ ์๋น์ค ๊ฒ์ ๊ฒฐ๊ณผ์์ ์๋์ผ๋ก ์ ์ธ๋ผ์.
- ์๋ฆผ ๋ฐ์ก: ํฌ์ค ์ฒดํฌ ์คํจ ์ ์ด๋ฉ์ผ, Slack ๋ฑ์ผ๋ก ์๋ฆผ์ ๋ณด๋ผ ์ ์์ด์.
- ์๋ ๋ณต๊ตฌ: ํน์ ์กฐ๊ฑด์์ ์๋์ผ๋ก ์๋น์ค๋ฅผ ์ฌ์์ํ๊ฑฐ๋ ๋ค๋ฅธ ๋ณต๊ตฌ ์์ ์ ์ํํ ์ ์์ด์.
Consul ํฌ์ค ์ฒดํฌ์ ์ฅ์ ๐
Consul์ ํฌ์ค ์ฒดํฌ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ ์ ๊ณตํด์:
- ์ค์๊ฐ ๋ชจ๋ํฐ๋ง: ์๋น์ค์ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ ํ ์ ์์ด์.
- ์๋ํ๋ ๋ฌธ์ ๊ฐ์ง: ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ์ ์ ์์ด์.
- ์๋น์ค ๊ฒ์๊ณผ์ ํตํฉ: ๊ฑด๊ฐํ ์๋น์ค๋ง ๊ฒ์ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ฏ๋ก ์์คํ ์ ์์ ์ฑ์ด ๋์์ ธ์.
- ์ ์ฐ์ฑ: ๋ค์ํ ์ ํ์ ์ฒดํฌ๋ฅผ ์ง์ํด ๊ฑฐ์ ๋ชจ๋ ์ข ๋ฅ์ ์๋น์ค์ ์ ์ฉํ ์ ์์ด์.
- ํ์ฅ์ฑ: ์์ฒ ๊ฐ์ ์๋น์ค๋ ํจ์จ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์์ด์.
๐ก ์ฌ๋ฅ๋ท ํ! ์ฌ๋ฅ๋ท๊ณผ ๊ฐ์ ๋๊ท๋ชจ ํ๋ซํผ์์๋ ์ด๋ฐ ํฌ์ค ์ฒดํฌ ๊ธฐ๋ฅ์ด ๋งค์ฐ ์ค์ํด์. ์๋ฅผ ๋ค์ด, ๊ฒฐ์ ์๋น์ค์ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ๋์ฒด ์๋น์ค๋ก ์ ํํ ์ ์์ฃ . ์ด๋ฅผ ํตํด ์๋น์ค์ ์์ ์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ด์.
์ค์ ์ฌ์ฉ ์ฌ๋ก ๐
Consul์ ํฌ์ค ์ฒดํฌ๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด๋ณผ๊น์?
1. ๋ง์ดํฌ๋ก์๋น์ค ๋ชจ๋ํฐ๋ง ๐ฌ
์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ตฌ์ฑ๋ ์์คํ ์์ ๊ฐ ์๋น์ค์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ด์.
{
"service": {
"name": "user-service",
"port": 8080,
"check": {
"id": "user-service-health",
"name": "User Service Health Check",
"http": "http://localhost:8080/health",
"method": "GET",
"interval": "10s",
"timeout": "1s"
}
}
}
์ด ์ค์ ์ 'user-service'์ ์ํ๋ฅผ 10์ด๋ง๋ค ์ฒดํฌํด์. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ์ ์ ์๊ณ , ๋ค๋ฅธ ์๋น์ค๋ค์ด ์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ํ ์ ์์ฃ .
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋ํฐ๋ง ๐พ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ํ์ธํ ์ ์์ด์.
{
"check": {
"id": "postgres-connection",
"name": "PostgreSQL Connection Check",
"args": ["/usr/local/bin/check_postgres.sh"],
"interval": "30s"
}
}
์ด ์คํฌ๋ฆฝํธ๋ 30์ด๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํ์ธํด์. ์ฐ๊ฒฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ฆ์ ์๋ฆผ์ ๋ฐ์ ์ ์์ฃ .
3. ์ธ๋ถ API ๋ชจ๋ํฐ๋ง ๐
์์คํ ์ด ์์กดํ๋ ์ธ๋ถ API์ ์ํ๋ฅผ ์ฒดํฌํ ์ ์์ด์.
{
"check": {
"id": "payment-gateway-api",
"name": "Payment Gateway API Check",
"http": "https://api.payment-gateway.com/status",
"method": "GET",
"interval": "60s",
"timeout": "5s"
}
}
์ด ์ค์ ์ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด API์ ์ํ๋ฅผ 1๋ถ๋ง๋ค ํ์ธํด์. API์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋น ๋ฅด๊ฒ ๋์ํ ์ ์์ฃ .
์ฃผ์ํ ์ โ ๏ธ
Consul์ ํฌ์ค ์ฒดํฌ ๊ธฐ๋ฅ์ ๊ฐ๋ ฅํ์ง๋ง, ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค๋ ์์ด์:
- ์ฒดํฌ ์ฃผ๊ธฐ: ๋๋ฌด ๋น๋ฒํ ์ฒดํฌ๋ ์์คํ ์ ๋ถ๋ด์ ์ค ์ ์์ด์. ์ ์ ํ ์ฃผ๊ธฐ๋ฅผ ์ค์ ํด์ผ ํด์.
- ์คํ(False Positive): ์ผ์์ ์ธ ๋คํธ์ํฌ ๋ฌธ์ ๋ฑ์ผ๋ก ์ธํ ์คํ์ ๋๋นํด์ผ ํด์. ์ฌ๋ฌ ๋ฒ์ ์ฐ์ ์คํจ๋ฅผ ํ์ธํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ฃ .
- ๋ณด์: ํฌ์ค ์ฒดํฌ ์๋ํฌ์ธํธ๊ฐ ์ค์ํ ์ ๋ณด๋ฅผ ๋ ธ์ถํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํด์.
- ๋ฆฌ์์ค ์ฌ์ฉ: ํนํ ์คํฌ๋ฆฝํธ ์ฒดํฌ์ ๊ฒฝ์ฐ, ๊ณผ๋ํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํด์.
๐ญ ์์ํด๋ณด์ธ์: Consul์ ํฌ์ค ์ฒดํฌ๋ ๋ง์น 24์๊ฐ ์ด์๋๋ ์๊ธ์ค๊ณผ ๊ฐ์์. ํ์(์๋น์ค)์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ๋์ํ ์ ์์ฃ . ํ์ง๋ง ๋ชจ๋ ์ฌ์ฑ๊ธฐ์ ์๊ธ์ค์ ๊ฐ์ง ์๋ฏ์ด, ํฌ์ค ์ฒดํฌ๋ ์ ์ ํ๊ฒ ์ค์ ํด์ผ ํด์. ๋๋ฌด ๋ฏผ๊ฐํ๊ฒ ์ค์ ํ๋ฉด ๋ถํ์ํ ๊ฒฝ๋ณด๊ฐ ์ธ๋ฆฌ๊ณ , ๋๋ฌด ๋์จํ๊ฒ ์ค์ ํ๋ฉด ์ค์ํ ๋ฌธ์ ๋ฅผ ๋์น ์ ์์ผ๋๊น์!
๊ฒฐ๋ก : Consul์ ํฌ์ค ์ฒดํฌ, ์์คํ ์์ ์ฑ์ ์ํธ์ ๐ก๏ธ
์, ์ด์ Consul์ ํฌ์ค ์ฒดํฌ์ ๋ํด ๊ฝค ์์ธํ ์์๋ดค์ด์. ์ด ๊ธฐ๋ฅ์ ํ๋์ ์ธ ๋ถ์ฐ ์์คํ ์์ ์ ๋ง ์ค์ํ ์ญํ ์ ํด์. ์ค์๊ฐ์ผ๋ก ์๋น์ค์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ฆ์ ๋์ํ ์ ์๊ฒ ํด์ฃผ์ฃ .
Consul์ ํฌ์ค ์ฒดํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ป์ ์ ์์ด์:
- ์์คํ ์ ์์ ์ฑ๊ณผ ๊ฐ์ฉ์ฑ ํฅ์
- ๋ฌธ์ ๋ฐ์ ์ ๋น ๋ฅธ ๋์ ๊ฐ๋ฅ
- ์๋น์ค ๊ฒ์๊ณผ์ ํตํฉ์ ํตํ ์๋ํ๋ ์ฅ์ ์ฒ๋ฆฌ
- ๋ณต์กํ ๋ถ์ฐ ์์คํ ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ
๋ฌผ๋ก , ์ด๋ฐ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ์ค์ ์ด ํ์ํด์. ํ์ง๋ง ์ ๋๋ก ํ์ฉํ๋ค๋ฉด, Consul์ ํฌ์ค ์ฒดํฌ๋ ์ฌ๋ฌ๋ถ์ ์์คํ ์ ๋์ฑ ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๊ฒ ๋ง๋ค์ด์ค ๊ฑฐ์์.
์, ์ด์ Consul์ ์ธ ๊ฐ์ง ํต์ฌ ๊ธฐ๋ฅ์ธ ์๋น์ค ๊ฒ์, ๊ตฌ์ฑ ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ํฌ์ค ์ฒดํฌ์ ๋ํด ๋ชจ๋ ์์๋ดค์ด์. ์ด ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฒฐํฉํ๋ฉด ์ ๋ง ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ถ์ฐ ์์คํ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ์ ์์ด์. Consul์ ๋ง์น ํ๋์ ์ธ IT ์ธํ๋ผ์ ์ค์์ค ๊ตฐ์ฉ ์นผ๊ณผ ๊ฐ์์. ๋ค์ํ ๋๊ตฌ๋ฅผ ํ๋๋ก ํตํฉํด ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ํด์ฃผ์ฃ .
์ฌ๋ฌ๋ถ, Consul์ ๋ง๋ฒ ๊ฐ์ ์ธ ๊ณ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ์ ๋ง ๋๋์ง ์๋์? ์ด์ ์ฐ๋ฆฌ๋ Consul์ด ์ด๋ป๊ฒ ํ๋์ ์ธ ๋ถ์ฐ ์์คํ ์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๊ณ , ์์ ์ฑ์ ๋์ด๋ฉฐ, ์ด์์ ๊ฐ์ํํ๋์ง ์๊ฒ ๋์์ด์. ํ์ง๋ง Consul์ ์ฌ์ ์ ์ฌ๊ธฐ์ ๋๋์ง ์์์. ์ด์ Consul์ ์ค์ ๋ก ์ด๋ป๊ฒ ๊ตฌ์ถํ๊ณ ์ด์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ด ์๋์ง ์ดํด๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ์ํด์ Consul์ ์ค์ ํ์ฉ๋ฒ์ผ๋ก ๋ค์ด๊ฐ๋ณผ๊ฒ์! ๐
๐ ๏ธ Consul ์ค์ ๊ตฌ์ถ ๋ฐ ์ด์ ๊ฐ์ด๋ ๐
์, ์ด์ Consul์ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ๋ํด ์์๋ดค์ผ๋, ์ค์ ๋ก Consul์ ์ด๋ป๊ฒ ๊ตฌ์ถํ๊ณ ์ด์ํ๋์ง ์ดํด๋ณผ๊น์? ์ด ๊ณผ์ ์ ๋ง์น ๋ ๊ณ ๋ธ๋ก์ผ๋ก ๋ฉ์ง ์ฑ์ ์๋ ๊ฒ๊ณผ ๊ฐ์์. ๊ฐ ๋จ๊ณ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผ๊ฐ๋ค ๋ณด๋ฉด ์ด๋์ ๊ฐ๋ ฅํ Consul ํด๋ฌ์คํฐ๊ฐ ์์ฑ๋ ๊ฑฐ์์! ๐
1. Consul ์ค์นํ๊ธฐ ๐ฅ
๋จผ์ Consul์ ์ค์นํด์ผ ํด์. ๋ค์ํ ์ด์ ์ฒด์ ์์ ์ฝ๊ฒ ์ค์นํ ์ ์๋ต๋๋ค.
# Linux์์ wget์ ์ฌ์ฉํ ์ค์น ์์
wget https://releases.hashicorp.com/consul/1.9.3/consul_1.9.3_linux_amd64.zip
unzip consul_1.9.3_linux_amd64.zip
sudo mv consul /usr/local/bin/
์ค์น๊ฐ ์๋ฃ๋๋ฉด 'consul version' ๋ช ๋ น์ด๋ก ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํ ์ ์์ด์.
2. Consul ์์ด์ ํธ ์คํํ๊ธฐ ๐โโ๏ธ
Consul์ ์์ด์ ํธ ๋ชจ๋๋ก ์คํ๋ผ์. ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๊ฐ๋จํ ๋ค์ ๋ช ๋ น์ด๋ก ์์ํ ์ ์์ฃ .
consul agent -dev
์ด ๋ช ๋ น์ด๋ ๊ฐ๋ฐ ๋ชจ๋๋ก Consul์ ์คํํด์. ์ค์ ์ด์ ํ๊ฒฝ์์๋ ๋ ๋ณต์กํ ์ค์ ์ด ํ์ํ๋ต๋๋ค.
3. Consul ํด๋ฌ์คํฐ ๊ตฌ์ฑํ๊ธฐ ๐
์ค์ ํ๊ฒฝ์์๋ ์ฌ๋ฌ Consul ์๋ฒ๋ก ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํด์. ์ด๋ ๊ฒ ํ๋ฉด ๊ณ ๊ฐ์ฉ์ฑ์ ํ๋ณดํ ์ ์์ฃ .
# ์๋ฒ 1
consul agent -server -bootstrap-expect=3 -node=server1 -bind=192.168.1.10 -data-dir=/tmp/consul
# ์๋ฒ 2
consul agent -server -bootstrap-expect=3 -node=server2 -bind=192.168.1.11 -data-dir=/tmp/consul -join=192.168.1.10
# ์๋ฒ 3
consul agent -server -bootstrap-expect=3 -node=server3 -bind=192.168.1.12 -data-dir=/tmp/consul -join=192.168.1.10
์ด๋ ๊ฒ ํ๋ฉด 3๊ฐ์ ์๋ฒ๋ก ๊ตฌ์ฑ๋ Consul ํด๋ฌ์คํฐ๊ฐ ๋ง๋ค์ด์ ธ์.
4. ์๋น์ค ๋ฑ๋กํ๊ธฐ ๐
์ด์ Consul์ ์๋น์ค๋ฅผ ๋ฑ๋กํด๋ณผ๊น์? JSON ํ์ผ์ ์ฌ์ฉํด ์๋น์ค๋ฅผ ์ ์ํ ์ ์์ด์.
{
"service": {
"name": "web",
"tags": ["rails"],
"port": 80,
"check": {
"http": "http://localhost/health",
"interval": "10s"
}
}
}
์ด ํ์ผ์ Consul์ ์ค์ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํ๊ณ Consul์ ์ฌ์์ํ๋ฉด ์๋น์ค๊ฐ ๋ฑ๋ก๋ผ์.
5. ์๋น์ค ๊ฒ์ํ๊ธฐ ๐
๋ฑ๋ก๋ ์๋น์ค๋ DNS๋ HTTP API๋ฅผ ํตํด ๊ฒ์ํ ์ ์์ด์.
# DNS๋ฅผ ์ด์ฉํ ๊ฒ์
dig @127.0.0.1 -p 8600 web.service.consul
# HTTP API๋ฅผ ์ด์ฉํ ๊ฒ์
curl http://localhost:8500/v1/catalog/service/web
์ด๋ ๊ฒ ํ๋ฉด 'web' ์๋น์ค์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ด์.
6. ๊ตฌ์ฑ ๊ด๋ฆฌ ์ฌ์ฉํ๊ธฐ โ๏ธ
Key/Value ์ ์ฅ์๋ฅผ ์ฌ์ฉํด ๊ตฌ์ฑ์ ๊ด๋ฆฌํ ์ ์์ด์.
# ๊ฐ ์ ์ฅํ๊ธฐ
consul kv put config/database/url "postgresql://db.example.com:5432"
# ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
consul kv get config/database/url
์ด๋ ๊ฒ ์ ์ฅ๋ ๊ตฌ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์๊ฐ์ผ๋ก ์ฝ์ด์ฌ ์ ์์ด์.
7. ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ์ค์ ํ๊ธฐ ๐
Consul์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ๋ ์ค์ํด์. Prometheus๋ Grafana ๊ฐ์ ๋๊ตฌ์ ํตํฉํด ์ฌ์ฉํ ์ ์์ฃ .
# Consul ํ
๋ ๋ฉํธ๋ฆฌ ์ค์ ์์
{
"telemetry": {
"statsite_address": "127.0.0.1:8125",
"disable_hostname": true
}
}
์ด ์ค์ ์ ์ฌ์ฉํ๋ฉด Consul์ ๋ฉํธ๋ฆญ์ Statsite๋ก ๋ณด๋ผ ์ ์์ด์.
8. ๋ณด์ ์ค์ ํ๊ธฐ ๐
์ค์ ์ด์ ํ๊ฒฝ์์๋ ๋ณด์ ์ค์ ์ด ๋งค์ฐ ์ค์ํด์. ACL(Access Control List)์ ์ค์ ํด ์ ๊ทผ์ ์ ์ดํ ์ ์์ฃ .
# ACL ์ค์ ์์
{
"acl": {
"enabled": true,
"default_policy": "deny",
"down_policy": "extend-cache"
}
}
์ด ์ค์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ ๊ทผ์ ๊ฑฐ๋ถํ๊ณ , ๋ช ์์ ์ผ๋ก ํ์ฉ๋ ์์ ๋ง ๊ฐ๋ฅํ๊ฒ ํด์.
๐ก ์ฌ๋ฅ๋ท ํ! Consul์ ์ด์ํ ๋๋ ์ ๊ธฐ์ ์ธ ๋ฐฑ์ ๋ ์์ง ๋ง์ธ์. ํนํ Key/Value ์ ์ฅ์์ ๋ฐ์ดํฐ๋ ๋งค์ฐ ์ค์ํ๋๊น์. 'consul snapshot' ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ฝ๊ฒ ๋ฐฑ์ ํ ์ ์์ด์.
9. ํธ๋ฌ๋ธ์ํ ๋ฐ ๋๋ฒ๊น ๐ง
๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋๋ก ๋ก๊ทธ ๋ ๋ฒจ์ ์กฐ์ ํ๊ณ , ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์์๋์ธ์.
# ๋ก๊ทธ ๋ ๋ฒจ ์กฐ์
consul agent -log-level=DEBUG
# ๋ฉค๋ฒ ์ํ ํ์ธ
consul members
# ์์ธ ๋๋ฒ๊ทธ ์ ๋ณด ํ์ธ
consul info
์ด๋ฐ ๋ช ๋ น์ด๋ค์ ์ฌ์ฉํ๋ฉด Consul ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ์์ธํ ํ์ ํ ์ ์์ด์.
10. ์ ๊ทธ๋ ์ด๋ ์ ๋ต ์๋ฆฝํ๊ธฐ ๐
Consul์ ์ ๊ทธ๋ ์ด๋ํ ๋๋ ์ฃผ์๊ฐ ํ์ํด์. ๋กค๋ง ์ ๊ทธ๋ ์ด๋ ๋ฐฉ์์ ์ฌ์ฉํด ๋ค์ดํ์์ ์ต์ํํ ์ ์์ฃ .
- ๊ฐ ์๋ฒ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ ๊ทธ๋ ์ด๋ํด์.
- ์ ๊ทธ๋ ์ด๋ ์ ์ ํญ์ ๋ฐฑ์ ์ ๋ง๋ค์ด์.
- ์ ๊ทธ๋ ์ด๋ ํ์๋ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ์๋ํ๋์ง ๊ผญ ํ์ธํด์.
๊ฒฐ๋ก : Consul, ํ๋์ ์ธ ์ธํ๋ผ์ ํต์ฌ ๐
์, ์ด๋ ๊ฒ Consul์ ๊ตฌ์ถ๋ถํฐ ์ด์๊น์ง ์ ๋ฐ์ ์ธ ๊ณผ์ ์ ์ดํด๋ดค์ด์. Consul์ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ์ธ์ฌํ ๊ณํ๊ณผ ๊ด๋ฆฌ๊ฐ ํ์ํด์. ํ์ง๋ง ๊ฑฑ์ ํ์ง ๋ง์ธ์! ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์ฐ๊ณ ๊ฒฝํ์ ์๋ค ๋ณด๋ฉด ์ด๋์ Consul ๋ง์คํฐ๊ฐ ๋์ด ์์ ๊ฑฐ์์. ๐
Consul์ ํ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ป์ ์ ์์ด์:
- ์๋น์ค ๊ฒ์์ ํตํ ๋์ ์ธํ๋ผ ๊ด๋ฆฌ
- ์ค์ํ๋ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ก ์ค์ ๋ณ๊ฒฝ์ ์ฉ์ด์ฑ
- ํฌ์ค ์ฒดํฌ๋ฅผ ํตํ ์์คํ ์์ ์ฑ ํฅ์
- ๋ณด์ ๊ฐํ ๋ฐ ์ ๊ทผ ์ ์ด
- ํ์ฅ์ฑ ์๋ ์ํคํ ์ฒ ๊ตฌ์ฑ
Consul์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ, ์ปจํ ์ด๋ ๊ธฐ๋ฐ ํ๊ฒฝ, ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ ํ๋์ ์ธ IT ์ธํ๋ผ์์ ํต์ฌ์ ์ธ ์ญํ ์ ํด์. ์ฌ๋ฅ๋ท๊ณผ ๊ฐ์ ๋๊ท๋ชจ ํ๋ซํผ์์๋ Consul์ ํ์ฉํ๋ฉด ์์คํ ์ ๋์ฑ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ด์ํ ์ ์์ ๊ฑฐ์์.
๐ญ ์์ํด๋ณด์ธ์: Consul์ ๋ง์น ํ๋์ ์ธ ๋์์ ์ค๋งํธ ์์คํ ๊ณผ ๊ฐ์์. ๊ตํต ์ ํธ๋ฅผ ์๋์ผ๋ก ์ ์ดํ๊ณ , ์ ๋ ฅ ์ฌ์ฉ์ ์ต์ ํํ๋ฉฐ, ์๊ธ ์ํฉ์ ์ฆ์ ๊ฐ์งํ๊ณ ๋์ํ์ฃ . ์ด๋ฐ ์์คํ ์ด ์๋ค๋ฉด ๋์๋ ๋์ฑ ํจ์จ์ ์ด๊ณ ์์ ํ๊ฒ ์ด์๋ ์ ์์ ๊ฑฐ์์. Consul์ ๋ฐ๋ก IT ์ธํ๋ผ์ ๊ทธ๋ฐ ์ค๋งํธ ์์คํ ์ด๋๋๋ค!
์ฌ๋ฌ๋ถ, ์ด์ Consul์ ๋๋ผ์ด ์ธ๊ณ๋ฅผ ์ถฉ๋ถํ ํํํ๋์? Consul์ ์ ๋ง ๋งค๋ ฅ์ ์ด๊ณ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ๋์์ ๋ณต์กํ๊ณ ์ธ์ฌํ ๊ด๋ฆฌ๊ฐ ํ์ํ ๋๊ตฌ์ด๊ธฐ๋ ํด์. ํ์ง๋ง ๊ฑฑ์ ํ์ง ๋ง์ธ์. ๋ชจ๋ ์๋ํ ์ฌ์ ์ด ๊ทธ๋ ๋ฏ, Consul ๋ง์คํฐ๊ฐ ๋๋ ๊ธธ๋ ํ ๊ฑธ์๋ถํฐ ์์ํด์. ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ง์ Consul์ ์ค์นํ๊ณ ์คํํด๋ณด๋ ๊ฒ์ ์ด๋จ๊น์? ์ค์ ๊ฒฝํ๋งํผ ์ข์ ์ ์๋์ ์๋ต๋๋ค. ๐
Consul์ ์ธ๊ณ์์ ์ฌ๋ฌ๋ถ์ ๋ชจํ์ด ์ฆ๊ฒ๊ณ ์ ์ตํ๊ธฐ๋ฅผ ๋ฐ๋๊ฒ์. ์ธ์ ๋ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ๋ฌผ์ด๋ณด์ธ์. ํจ๊ป ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ๊ฒ, ๊ทธ๊ฒ์ด ๋ฐ๋ก ๊ธฐ์ ์ ์๋ฆ๋ค์์ด๋๊น์. ์ฌ๋ฌ๋ถ์ Consul ์ฌ์ ์ ํ์ด์ด ํจ๊ปํ๊ธฐ๋ฅผ! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ