2022.03 ~ 2022.06

๋ฌธ์ œ์ 

  • ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ๋งŒ์œผ๋กœ ์‹ค์ œ ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ํŒ๋‹จํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€
  • ๊ณ ๊ฐ๊ณผ ๋™์ผํ•œ ์„œ๋น„์Šค ๋ ˆ๋ฒจ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํ•˜์ดํผ๋ฐ”์ด์ €์— ๋”๋ฏธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
  • 500๋Œ€๊ฐ€ ๋„˜๋Š” ๋”๋ฏธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ œ๋Œ€๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ์˜€์Œ
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„๊ฐ€ ๋‹จ์ผํ™”๋˜์–ด ์žˆ์–ด ์žฅ์• ์— ์ทจ์•ฝํ–ˆ์Œ
  • ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์—‘์…€๋กœ ์ •๋ฆฌํ•ด ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ์Œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋”๋ฏธ ์ธ์Šคํ„ด์Šค ์ „์ˆ˜ ์กฐ์‚ฌ, ์‹ ๊ทœ ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ๋ฅผ GUI๋กœ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํˆด ๊ฐœ๋ฐœ
  • AWS, KT Cloud๋ฅผ ํ™œ์šฉํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„๋ฅผ DR ๊ตฌ์„ฑ
  • ELK ์Šคํƒ์„ ๋„์ž…ํ•ด ๋”๋ฏธ ์ธ์Šคํ„ด์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋„๋ก ๊ฐœ๋ฐœ

๊ตฌ์กฐ

๊ธฐ์ˆ  ์Šคํƒ

  • Openstack SDK + FastAPI
  • icinga
  • ELK
  • Docker

๋„์ „

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

์ด๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด Logstash์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ–ˆ๊ณ ,
ES์˜ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ฐ์ดํ„ฐ ํ•„๋“œ์— ๋‹จ์ ˆ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•จ์œผ๋กœ์จ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

input {
  beats {
    port => 5044
    host => "..."
  }
}
 
filter {
  if [icinga][notification_type] == "RECOVERY" {
    mutate {
      add_field => { "event_end" => "${timestamp}" }
    }
    elasticsearch {
      hosts => ["..."]
      index => "elk-*"
      query => "icinga.notification_type:PROBLEM AND icinga.host.keyword:${[icinga][host]}"
      fields => {"@timestamp" => "started"}
    }
    date {...}
    ruby {...}
  }
}

๊ฒฐ๊ณผ

  • ํ˜„์žฌ 2000๋Œ€ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์ด๋ฒคํŠธ ์ˆ˜์ง‘ ์ค‘
  • ์ธ์Šคํ„ด์Šค ์ˆ˜๋Š” 4๋ฐฐ ์ด์ƒ ๋Š˜์—ˆ์ง€๋งŒ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ 95% ์ด์ƒ ๊ณต์ˆ˜ ์ ˆ์•ฝ
  • ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Kibana ๋Œ€์‹œ๋ณด๋“œ ์ œ์ž‘, ๊ฐ€์šฉ๋ฅ ๊ณผ ์žฅ์•  ์ด๋ ฅ ๋“ฑ ๋ฐ์ดํ„ฐ ์ œ๊ณต
  • ๊ฐ๊ด€์ ์ด๊ณ  ์ •ํ™•ํ•œ ์‹ค์‹œ๊ฐ„ ์ง€ํ‘œ๋กœ ๊ฒฝ์˜์ง„ ์šด์˜ ์ž๋ฃŒ๋กœ ์ฐจ์šฉ

๊ธฐ์—ฌ๋„

  • FastAPI ์„œ๋ฒ„ ๊ฐœ๋ฐœ, Openstack SDK ์—ฐ๋™ (50%)
    • ํ•˜์ดํผ๋ฐ”์ด์ €๊ฐ€ ์ฆ์„ค, ์‚ญ์ œ๋  ๋•Œ๋งˆ๋‹ค GUI ๊ธฐ๋ฐ˜์œผ๋กœ ๋”๋ฏธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ์ œ๊ฑฐ
  • icinga ์„œ๋ฒ„ ๊ตฌ์„ฑ (60%)
    • AWS 4๊ฐœ ๋ฆฌ์ „, KT Cloud์— icinga ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•ด ์šด์˜
    • Docker-compose ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๊ด€์ ์ธ ์„œ๋ฒ„ ๊ตฌ์ถ•
  • ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„ DR ๊ตฌ์„ฑ (100%)
    • ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์ƒ์„ ๋™์ผํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก icinga API๋ฅผ ํ™œ์šฉํ•œ sync ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
  • icingabeat + ELK ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• (100%)