Architecture KO - k-p2p-lab/kpl-v3 GitHub Wiki

K-P2PLab v3 ๊ตฌํ˜„ ์•„ํ‚คํ…์ฒ˜

Wiki home โ€บ ํ•œ๊ตญ์–ด ๋ฌธ์„œ ยท ์˜์–ด ์›๋ฌธ

๋ฌธ์„œ ์•ˆ๋‚ด ยท ์†Œ์Šค ์ €์žฅ์†Œ

์ด ๋ฌธ์„œ๋Š” ๊ณตํ†ต ๊ฐœ๋…์˜ ํ”„๋กœ์ ํŠธ ๊ณตํ†ต ๊ฐœ๋…์„ ํ˜„์žฌ v3 ๊ตฌํ˜„์— ๋Œ€์‘์‹œํ‚ต๋‹ˆ๋‹ค. kpl-v3 ์†Œ์Šค ์ €์žฅ์†Œ์— ๊ตฌํ˜„๋œ ์‹คํ–‰ ์ปดํฌ๋„ŒํŠธ, Docker ๋ฐฐ์น˜, ํ†ต์‹  ๊ฒฝ๋กœ์™€ ๊ฒฉ๋ฆฌ ๋ณด์žฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ, ๋ฒ„์ „์— ๋…๋ฆฝ์ ์ธ ์„ค๊ณ„ ์›์น™, ์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ๊ณผ ์ถœํŒ๋ฌผ์€ ์ด ์œ„ํ‚ค์˜ ๋ณ„๋„ ํŽ˜์ด์ง€์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

K-P2PLab v3 ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

์˜์—ญ์€ ์ œ์–ดยท๊ด€์ธกยทPeer ์‹คํ–‰์˜ ์ฑ…์ž„์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์˜ Control/P2P network ๊ตฌ๋ถ„์€ ๊ฐœ์š”์ด๋ฉฐ, ์‹ค์ œ overlay ์—ฐ๊ฒฐ๊ณผ ํŠธ๋ž˜ํ”ฝ ๊ฒฝ๋กœ๋Š” Docker ๋„คํŠธ์›Œํฌ์™€ ์™ธ๋ถ€ ๊ณต๊ฐœ endpoint๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์›๋ณธ PNG๋„ ์ด ์œ„ํ‚ค์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ์™€ ํ†ต์‹  ๋„์‹

flowchart TB
    operator["์šด์˜์ž ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” REST client"]
    subgraph controllerContainer["Controller ์ปจํ…Œ์ด๋„ˆ"]
        dashboard["๋‚ด์žฅ Dashboard ์ •์  ํŒŒ์ผ"]
        controller["Controller HTTP API, scenario scheduler์™€ ๋ถ„์„ worker"]
    end
    subgraph agentHost["๊ฐ Agent ํ˜ธ์ŠคํŠธ: ๋…ธ๋“œ ๋กœ์ปฌ Docker Engine"]
        agent["Agent ์ปจํ…Œ์ด๋„ˆ"]
        docker["Docker socket"]
        peer["Standalone Peer ์ปจํ…Œ์ด๋„ˆ: libp2p์™€ ์„ ํƒ์  tc"]
    end
    subgraph networkHost["Control manager: ๋„คํŠธ์›Œํฌ ์ปดํฌ๋„ŒํŠธ"]
        manager["Network manager ์„œ๋น„์Šค"]
        managerDocker["Manager Docker socket"]
        gateway["Standalone HTTP gateway"]
    end
    remote["๋‹ค๋ฅธ Agent ํ˜ธ์ŠคํŠธ์˜ Peer ์ปจํ…Œ์ด๋„ˆ"]
    prometheus["Prometheus ์ปจํ…Œ์ด๋„ˆ"]
    grafana["Grafana ์ปจํ…Œ์ด๋„ˆ"]
    records[("Controller ๋ฐ์ดํ„ฐ: ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์‹คํ–‰ ๊ธฐ๋ก")]
    series[("Prometheus ์‹œ๊ณ„์—ด ๋ณผ๋ฅจ")]
    operator -->|"UI ๋ถˆ๋Ÿฌ์˜ค๊ธฐ"| dashboard
    operator -->|"REST ์š”์ฒญ๊ณผ SSE ๊ตฌ๋…"| controller
    controller -->|"์ƒ์„ฑ, ์ข…๋ฃŒ, publish"| agent
    agent -->|"๋“ฑ๋ก, heartbeat, event batch"| controller
    agent -->|"์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ"| docker
    docker -->|"์‹œ์ž‘๊ณผ ์ข…๋ฃŒ"| peer
    controller -->|"๋„คํŠธ์›Œํฌ ์ค€๋น„"| manager
    manager -->|"๋นˆ Peer overlay์™€ gateway ๊ต์ฒด"| managerDocker
    agent -->|"Peer ๋ช…๋ น"| gateway
    gateway -->|"HTTP ์ œ์–ด"| peer
    peer -->|"์ƒํƒœ, telemetry, discovery, clock"| gateway
    gateway -->|"์ƒํƒœ์™€ telemetry"| agent
    gateway -->|"bootstrap, discovery, clock"| controller
    peer <-->|"์ง์ ‘ libp2p TCP"| remote
    controller -->|"๋ณด์กด"| records
    prometheus -->|"metric scrape์™€ Agent target ์กฐํšŒ"| controller
    prometheus -->|"metric scrape"| agent
    prometheus -->|"sample ๋ณด์กด"| series
    grafana -->|"์กฐํšŒ"| prometheus
    operator -->|"๋ชจ๋‹ˆํ„ฐ๋ง ๋ณด๊ธฐ"| grafana

ํ™”์‚ดํ‘œ๋Š” ์š”์ฒญ ๋˜๋Š” ๋ช…๋ น ๋ฐฉํ–ฅ์ด๋ฉฐ ์‘๋‹ต์€ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค. libp2p ์—ฐ๊ฒฐ์€ ์–‘๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค. ์ƒ์ž๋Š” ์‹คํ–‰ ๋ฐฐ์น˜์™€ ์ €์žฅ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ณ„๋„์˜ Docker ๋„คํŠธ์›Œํฌ๋ฅผ ๋œปํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋Š” ์•„๋ž˜ ๋„คํŠธ์›Œํฌ ํ‘œ์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋…ธ๋“œ Swarm์€ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ Agent ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด Peer๋ฅผ ํ˜ธ์ŠคํŠธ ์‚ฌ์ด์— ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ

์ปดํฌ๋„ŒํŠธ v3 ๋ฐฐ์น˜ ์—ญํ• 
Dashboard Controller์— ๋‚ด์žฅ๋˜์–ด Controller๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ •์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ž‘๊ณผ ์ค‘์ง€, ์ €์žฅ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ฒฐ๊ณผ ๊ด€๋ฆฌ, ์‹ค์‹œ๊ฐ„ AgentยทPeerยทํ† ํด๋กœ์ง€ยท์ด๋ฒคํŠธยท์š”์•ฝ ํ‘œ์‹œ, ๊ฒฐ๊ณผ๋ณ„ ๊ทธ๋ž˜ํ”„ ์ด๋ฏธ์ง€์™€ PNG ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Controller ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜. Swarm์—์„œ๋Š” ์„ค์ •๋œ control ๋…ธ๋“œ์— ๊ณ ์ • ์‹œ๋‚˜๋ฆฌ์˜ค ํ•ด์„๊ณผ ์Šค์ผ€์ค„๋ง, Agent ์šฉ๋Ÿ‰ ์˜ˆ์•ฝ, Peer ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ publish ๋ช…๋ น, bootstrap๊ณผ topic discovery registry, ํ† ํด๋กœ์ง€์™€ telemetry ์ง‘๊ณ„, ์‹คํ–‰ ๊ธฐ๋ก ๋ณด์กด, REST API์™€ Dashboard ์ œ๊ณต, Controller metric ๋…ธ์ถœ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Agent ์„ ํƒํ•œ Swarm ๋…ธ๋“œ๋งˆ๋‹ค global-service task ํ•˜๋‚˜ Controller ๋“ฑ๋ก๊ณผ heartbeat, ๋กœ์ปฌ ์ˆ˜์šฉ ์šฉ๋Ÿ‰ ์ ์šฉ, ๋…ธ๋“œ ๋กœ์ปฌ Docker socket์„ ํ†ตํ•œ Peer ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑยท์‚ญ์ œ, publish ์š”์ฒญ ์ค‘๊ณ„, Peer telemetry ์ „๋‹ฌ, ํ˜ธ์ŠคํŠธ ๋กœ์ปฌ Agent metric ๋…ธ์ถœ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Peer ์‹คํ—˜ Peer๋งˆ๋‹ค ๋…๋ฆฝ๋œ standalone Docker ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜ Kademlia์™€ GossipSub์„ ํฌํ•จํ•œ ์‹ค์ œ libp2p ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ , topic ์ฐธ์—ฌ์™€ ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹ , ํ”„๋กœํ† ์ฝœยท์ „๋‹ฌ ์ด๋ฒคํŠธ์™€ libp2p ์ŠคํŠธ๋ฆผ ๋ˆ„์  ๋ฐ”์ดํŠธ ๋ณด๊ณ , ์„ค์ •๋œ Linux traffic-control ๊ทœ์น™ ์ ์šฉ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Network manager / gateway Control manager์˜ Manager ์„œ๋น„์Šค์™€ standalone gateway ๋งค Run ์ „์— ๋นˆ Peer overlay๋ฅผ ๊ต์ฒดํ•˜๊ณ  ํ—ˆ์šฉ๋œ Peer HTTP ์š”์ฒญ์„ ๊ณ ์ • ์ œ์–ด ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
Prometheus ์„ค์ •๋œ Swarm control ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜ Controller metric๊ณผ ์กฐ๊ฑด์— ๋งž๋Š” Agent๊ฐ€ ์•Œ๋ฆฐ metrics endpoint๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฉฐ ์ €์žฅ๋œ ์‹คํ—˜ ๊ฒฐ๊ณผ์™€ ๋ณ„๋„๋กœ ์‹œ๊ณ„์—ด์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
Grafana ์„ค์ •๋œ Swarm control ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜ ์‚ฌ์ „ ๊ตฌ์„ฑ๋œ data source๋กœ Prometheus๋ฅผ ์กฐํšŒํ•˜๊ณ  ๊ธฐ๋ณธ ์‹คํ—˜ ๋ถ„์„ dashboard๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Controller, Agent์™€ Peer ๋ชจ๋“œ๋Š” ๋™์ผํ•œ kpl ์ด๋ฏธ์ง€์˜ ํ•˜์œ„ ๋ช…๋ น์ž…๋‹ˆ๋‹ค. Swarm Agent๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ task์˜ ์ •ํ™•ํ•œ ๋กœ์ปฌ image ID๋ฅผ ํ™•์ธํ•ด Peer๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, mutable tag ๋•Œ๋ฌธ์— ํ•œ ๋ฐฐํฌ ์•ˆ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ binary๊ฐ€ ์„ž์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ์–ด ๋ฐ ์‹คํ—˜ ํ๋ฆ„

  1. ์šด์˜์ž๊ฐ€ Dashboard ๋˜๋Š” REST API๋กœ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค. Controller๋Š” ์‹คํ–‰์„ ๋งŒ๋“ค๊ณ  distribution์„ ํ™•์ •ํ•˜๋ฉฐ action์„ ์Šค์ผ€์ค„๋งํ•˜๊ณ , ์—ฌ์œ  ์šฉ๋Ÿ‰์ด ์žˆ๋Š” Agent์— ์ƒˆ Peer๋ฅผ ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. Controller๊ฐ€ ์„ ํƒํ•œ Agent์˜ ๋น„๊ณต๊ฐœ HTTP API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Agent๋Š” ๋กœ์ปฌ Docker daemon์— Peer ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น Peer์šฉ์œผ๋กœ ์ƒ์„ฑํ•œ ์„ค์ •์„ ๋ณต์‚ฌํ•ด ์‹œ์ž‘ํ•œ ๋’ค ์ƒ๋ช…์ฃผ๊ธฐ ์ƒํƒœ๋ฅผ Controller์— ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  3. Peer๋Š” Controller์—์„œ bootstrap Peer, topic discovery ํ›„๋ณด์™€ Controller clock sample์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ Kademlia์™€ GossipSub ํŠธ๋ž˜ํ”ฝ์€ Peer ์ปจํ…Œ์ด๋„ˆ ์ฃผ์†Œ ์‚ฌ์ด์—์„œ ์ง์ ‘ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์•ฝ๋œ publish๋Š” Peer๊ฐ€ P2P ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— Controller -> Agent -> ๋Œ€์ƒ Peer ๊ฒฝ๋กœ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
  4. ๊ฐ Peer๋Š” ์ƒํƒœ์™€ batch telemetry๋ฅผ ์ž์‹ ์˜ Agent์— ๋ณด๋ƒ…๋‹ˆ๋‹ค. Agent๋Š” ๊ฐ source์˜ session ๋ฐ sequence identity๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹คํŒจํ•œ batch๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์žฌ์‹œ๋„ํ•˜๋ฉฐ ์ฃผ๊ธฐ์ ์ธ heartbeat๋ฅผ Controller์— ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ Peer์˜ event๋Š” ์„ž์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Controller๋Š” ์ด ๋ณด๊ณ ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์‹œ๊ฐ„ ํ† ํด๋กœ์ง€, ์‹คํ–‰ metric, event stream๊ณผ ๋ณด์กด ๊ฒฐ๊ณผ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. Prometheus๋Š” Controller๋ฅผ scrapeํ•˜๊ณ  ์˜จ๋ผ์ธ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์œ ํšจํ•œ metrics URL์„ ์•Œ๋ฆฐ Agent๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. Grafana๋Š” Prometheus๋ฅผ ์กฐํšŒํ•˜๊ณ , ๋‚ด์žฅ Dashboard๋Š” Controller API์™€ live stream์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ €์žฅ ๊ฒฐ๊ณผ ZIP์€ Controller ๋ณด์กด ๋ฐ์ดํ„ฐ์—์„œ ์ƒ์„ฑ๋˜๋ฉฐ Prometheus ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Phase ์‹คํ–‰ ์ „ network manager๊ฐ€ ์ •๋ฆฌ๋œ Peer overlay๋ฅผ ๊ต์ฒดํ•˜๊ณ  Agent๊ฐ€ ํ™œ์„ฑํ™”๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Peer์™€ ์ œ์–ด ์„œ๋น„์Šค ์‚ฌ์ด์˜ HTTP๋Š” network gateway๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์‹คํ—˜ P2P ๋ฉ”์‹œ์ง€๋Š” Peer ์‚ฌ์ด์—์„œ ์ง์ ‘ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ๋„คํŠธ์›Œํฌ ์ดˆ๊ธฐํ™”๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Docker ๋„คํŠธ์›Œํฌ์™€ ์™ธ๋ถ€ ๊ณต๊ฐœ endpoint

์ œ๊ณต๋˜๋Š” v3 stack์€ ์„ธ ๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ Docker ๋„คํŠธ์›Œํฌ์ด์ง€๋งŒ ๋ชจ๋“  ์ œ์–ด ํŠธ๋ž˜ํ”ฝ๊ณผ ๋ฐ์ดํ„ฐ ํŠธ๋ž˜ํ”ฝ์ด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ๋˜๋Š” endpoint ์˜์—ญ ์—ฐ๊ฒฐ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ž˜ํ”ฝ๊ณผ ๊ณต๊ฐœ ๋ฒ”์œ„
Peer ๋„คํŠธ์›Œํฌ (peers) ๋ชจ๋“  Peer์™€ standalone network gateway ๋งค Run ์ „์— ์žฌ์ƒ์„ฑํ•˜๋Š” ์™ธ๋ถ€ attachable Swarm overlay(KPL_PEER_NETWORK)์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ 20000์œผ๋กœ libp2p TCP๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Peer HTTP ์ œ์–ดยทtelemetryยทbootstrapยท์‹œ๊ฐ ์š”์ฒญ์€ gateway๋ฅผ ํ†ตํ•ด ์ œ์–ด ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Peer ํฌํŠธ๋Š” ํ˜ธ์ŠคํŠธ์— ๊ณต๊ฐœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ œ์–ด ๋„คํŠธ์›Œํฌ (control) Controller, Agent, network-manager์™€ network gateway Peer overlay๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋™์•ˆ ์œ ์ง€ํ•˜๋Š” stack ๋ฒ”์œ„์˜ attachable overlay์ž…๋‹ˆ๋‹ค. Controllerโ†’Agent ๋ช…๋ น๊ณผ ์ค€๋น„ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋ฉฐ gateway๋Š” ํ—ˆ์šฉํ•œ Peer HTTP ์š”์ฒญ๋งŒ ๋‘ overlay ์‚ฌ์ด์—์„œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋‹ˆํ„ฐ๋ง ๋„คํŠธ์›Œํฌ (monitoring) Controller, Agent, resource monitor, Prometheus์™€ Grafana. Peer๋Š” ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์Œ stack ๋ฒ”์œ„์˜ Swarm overlay์ž…๋‹ˆ๋‹ค. Prometheus๋Š” ์—ฌ๊ธฐ์„œ Controller service DNS๋กœ HTTP service discovery๋ฅผ ์š”์ฒญํ•œ ๋’ค, ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ control ๋…ธ๋“œ์™€ Agent ๋…ธ๋“œ์˜ ๊ณต๊ฐœ metrics ์ฃผ์†Œ๋ฅผ scrapeํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ ์ˆ˜์ง‘์—๋Š” ํ•ด๋‹น ํ˜ธ์ŠคํŠธ ํฌํŠธ ์ ‘๊ทผ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Grafana๋Š” ์ด overlay๋ฅผ ํ†ตํ•ด Prometheus์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
์šด์˜์ž endpoint ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” API client์—์„œ control ํ˜ธ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐ Controller/Dashboard 8080, Prometheus 9090๊ณผ Grafana 3000์ด ์šด์˜์ž์šฉ endpoint์ž…๋‹ˆ๋‹ค. Swarm์€ ์„ค์ •๋œ control ๋…ธ๋“œ์— host mode๋กœ publishํ•ฉ๋‹ˆ๋‹ค. Swarm์—์„œ Agent metric์€ ๊ธฐ๋ณธ์ ์œผ๋กœ host port 9091์„ ์‚ฌ์šฉํ•˜๋ฉฐ Agent ์ œ์–ด API๋Š” ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Docker Swarm ์ž์ฒด์˜ manager ๋ฐ node ์ œ์–ด ์˜์—ญ์€ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ธํ”„๋ผ์ž…๋‹ˆ๋‹ค. v3๋Š” ๊ฐ ์‹คํ—˜ Peer๋ฅผ Swarm service๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ, Agent๊ฐ€ ์ž์‹ ์˜ ๋…ธ๋“œ์— standalone ์ปจํ…Œ์ด๋„ˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Swarm์€ ์‹คํ–‰ ์ค‘์ธ Peer๋ฅผ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ์ž๋™์œผ๋กœ ์žฌ์Šค์ผ€์ค„๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Peer๋ณ„ ๊ฒฉ๋ฆฌ์™€ ๋„คํŠธ์›Œํฌ ๋™์ž‘

๊ฐ Peer๋Š” ๋…๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ์™€ Linux network namespace๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. Agent๋Š” ํ™œ์„ฑ Swarm ๋…ธ๋“œ๋ฅผ ์š”๊ตฌํ•˜๋ฉฐ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•œ attachable Swarm overlay์—๋งŒ Peer๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. host network, bridge network์™€ attach ๋ถˆ๊ฐ€๋Šฅํ•œ overlay๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. Peer ์ปจํ…Œ์ด๋„ˆ์—๋Š” Docker socket, host bind mount ๋˜๋Š” published host port๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  Linux capability๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  no-new-privileges๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์„ ์„ค์น˜ํ•  Peer์—๋งŒ NET_ADMIN์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Peer๋Š” privileged ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

Peer๋Š” P2P ์—ฐ๊ฒฐ์„ ์—ด๊ธฐ ์ „์— ์ž๊ธฐ namespace ์•ˆ์—์„œ tc ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง€์›ํ•˜๋Š” ์†ก์‹  ์กฐ๊ฑด์€ delay, jitter, loss, duplication, corruption, reordering, netem rate ์ œํ•œ๊ณผ ์„ ํƒ์ ์ธ TBF shaping์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ scope: p2p์—์„œ๋Š” TCP 20000๋งŒ ๋Œ€์ƒ์œผ๋กœ ์‚ผ์œผ๋ฏ€๋กœ Peer HTTP ์ œ์–ด ๋ฐ telemetry ๊ฒฝ๋กœ๋Š” impairment๋ฅผ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. scope: all์—์„œ๋Š” loopback์„ ์ œ์™ธํ•œ interface ์ „์ฒด์— ์ ์šฉ๋˜์–ด ์‹คํ—˜์˜ ์ผ๋ถ€๋กœ ์ œ์–ด์™€ telemetry๋„ ์ง€์—ฐํ•˜๊ฑฐ๋‚˜ ์†์‹ค์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ๊ณ„ ๋•๋ถ„์— ํ•œ Peer์˜ traffic-control ๊ทœ์น™์ด ๋‹ค๋ฅธ Peer๋‚˜ ํ˜ธ์ŠคํŠธ interface๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” process ๋ฐ network ๊ฒฉ๋ฆฌ์ด๋ฉฐ ์ „์šฉ hardware ๋˜๋Š” multi-tenant ๋ณด์•ˆ ๊ฒฝ๊ณ„๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ™์€ ์„œ๋ฒ„์˜ Peer๋Š” host kernel, CPU, memory, storage, Docker daemon๊ณผ underlay ๊ฒฝ๋กœ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ Peer๋งˆ๋‹ค ์ „์šฉ CPU๋‚˜ memory ์ œํ•œ์„ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Docker socket ์ ‘๊ทผ์€ ๋„“์€ ๋…ธ๋“œ ์ œ์–ด ๊ถŒํ•œ์„ ์ฃผ๋ฏ€๋กœ Agent, network-manager, resource monitor๋Š” ์‹ ๋ขฐํ•˜๋Š” ๊ด€๋ฆฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. Controller, Peer์™€ network gateway์—๋Š” Docker socket์ด ์—†์Šต๋‹ˆ๋‹ค.

Swarm ๋ฐฐ์น˜

๋‹จ์ผ ๋…ธ๋“œ Swarm๋„ ๋‹ค์ค‘ ํ˜ธ์ŠคํŠธ ๋ฐฐํฌ์™€ ๊ฐ™์€ stack๊ณผ overlay๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์—์„œ๋Š” deploy --all๋กœ manager๋ฅผ Agent ๋…ธ๋“œ๋กœ ์„ ํƒํ•˜๊ณ  KPL_MIN_AGENTS=1์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

stack.swarm.yaml์€ Controller, network-manager, Prometheus์™€ Grafana replica๋ฅผ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ KPL_CONTROL_NODE_ID๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” control manager์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. Agent๋Š” scripts/swarm.sh์—์„œ ์„ ํƒํ•œ ๋…ธ๋“œ๋กœ ์ œํ•œํ•œ global service์ž…๋‹ˆ๋‹ค. ๊ฐ Agent๋Š” ์ž๊ธฐ ๋…ธ๋“œ์˜ Docker daemon๋งŒ ์ œ์–ดํ•˜๊ณ , Controller๋Š” ๋“ฑ๋ก๋œ Agent์˜ ๊ฐ€์šฉ ์ˆ˜์šฉ ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ์ƒˆ Peer๋ฅผ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Agent๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๊ธฐ์กด Peer๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Agent ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๊ทธ Agent์˜ Peer๋„ ์ค‘์ง€๋˜๋ฏ€๋กœ Swarm ๋ฐฐํฌ ๊ฐ€์ด๋“œ์˜ cleanup ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ—˜ overlay๋Š” ํ˜ธ์ŠคํŠธ ์‚ฌ์ด์˜ Peer ์ฃผ์†Œ ์—ฐ๊ฒฐ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์‹ค์ œ ์ง€์—ฐ๊ณผ ์†์‹ค์—๋Š” ์„œ๋ฒ„์˜ ๋ฌผ๋ฆฌ ๋„คํŠธ์›Œํฌ์™€ Swarm VXLAN ๊ฒฝ๋กœ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์‹œ๊ฐ ๋™๊ธฐํ™”์™€ underlay ์šฉ๋Ÿ‰์€ ๋ณ„๋„์˜ ๋ฐฐํฌ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.

๊ด€์ธก ๋ฐ ๋ณด์กด ๊ฒฝ๊ณ„

Dashboard๋Š” Controller์˜ ์ตœ์‹  ์ƒํƒœ์™€ ์ด๋ฒคํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Controller๋Š” ๊ฐ ์‹คํ–‰์˜ scenario.yaml, experiment.json๊ณผ ์ˆ˜๋ฝํ•œ ์ „์ฒด events.jsonl์„ ์ž์‹ ์˜ data volume์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ์‹œ์ ์—๋Š” snapshot ๊ฒฝ๊ณ„๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ๊ทธ ๋ณด์กด prefix์—์„œ ZIP์šฉ metrics.json๊ณผ export.json์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Prometheus๋Š” ๋ณ„๋„ volume์— scrape ๊ธฐ๋ฐ˜ ์‹œ๊ณ„์—ด์„ ์ €์žฅํ•˜๊ณ  Grafana๋„ ์„ค์ •๊ณผ dashboard ์ƒํƒœ๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Prometheus๋Š” Peer๋ณ„ exporter๋ฅผ scrapeํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ˜„์žฌ Agent collector๋Š” Peer๋ณ„ CPU ๋˜๋Š” memory ์‚ฌ์šฉ๋Ÿ‰์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ZIP์€ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์‹คํ—˜ ๊ธฐ๋ก์ด๋ฉฐ Prometheus ๋˜๋Š” Grafana์˜ backup์€ ์•„๋‹™๋‹ˆ๋‹ค.

Metric๊ณผ ํ† ํด๋กœ์ง€๋Š” ์ˆ˜์‹ ๋œ ๋ณด๊ณ ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ๊ด€์ธก ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์˜ค๋ž˜๋˜๊ฑฐ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” Agent, telemetry queue ์†์‹ค, scope: all impairment, scrape ์‹œ์  ๋˜๋Š” ๊ฐ•์ œ ์ข…๋ฃŒ ๋•Œ๋ฌธ์— P2P ํŠธ๋ž˜ํ”ฝ์ด ์ผ๋ถ€ ๋ฐœ์ƒํ–ˆ๋”๋ผ๋„ control plane์˜ ๊ด€์ธก๋Ÿ‰์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Metric ์ •์˜๋Š” ์‹คํ—˜ ์ง€ํ‘œ, ์ˆ˜์ง‘ ํ•œ๊ณ„๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์ €์žฅ ๊ฒฐ๊ณผ, ๊ทธ๋ž˜ํ”„ ์˜๋ฏธ๋Š” ํ† ํด๋กœ์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Controller๋Š” ์‹คํ–‰ ์ค‘ ๊ทธ๋ฃน๋ณ„ ํ† ํด๋กœ์ง€ยท์ ์ˆ˜ ์š”์•ฝ์„ observations.jsonl๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹ ์„ ํ•œ Peer ๋ณด๊ณ ์—์„œ ํ™•์ธํ•œ transportยทKademliaยทGossipSub ๊ฐ„์„ ๊ณผ ๋…ธ๋“œ๋„ ํ•จ๊ป˜ ์ €์žฅํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ถ„์„์—์„œ ๊ทธ๋ž˜ํ”„ ์ง€ํ‘œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€์ž๋ณ„ ๊ฐœ๋ณ„ ์ ์ˆ˜๋Š” ๋ณด์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์—ญํญ ํ‘œ๋ณธ์€ ์ด๋ฒคํŠธ๋กœ ์ €์žฅํ•˜๋ฉฐ ์ˆ˜์‹  ๊ธฐ๊ฐ„์˜ ๋Œ€์ƒ ์„ ์ •๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์žฌ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Bandwidth ์ธก์ •์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด์žฅ Dashboard์˜ ์ €์žฅ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”๋Š” ์ €์žฅ๋œ ์ด๋ฒคํŠธยท๊ด€์ธก์น˜๋ฅผ ๋ถ„์„ API๋กœ ์กฐํšŒํ•ด ์‹คํ–‰๋ณ„ ๋ถ„ํฌ์™€ ์‹œ๊ณ„์—ด์„ ํ‘œ์‹œํ•˜๊ณ  ์—ฌ๋Ÿฌ ์‹คํ–‰์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. Prometheus ๋ณด์กด ์‹œ๊ณ„์—ด๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Controller์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ถ„์„์€ ์ €์žฅํ•œ ์ด๋ฒคํŠธยท๊ด€์ธก ํŒŒ์ผ์˜ ๊ฒฝ๊ณ„๋ฅผ ์žก์•„ ๊ณ„์‚ฐํ•˜๊ณ  ์ž‘์—… ์ƒํƒœยท์™„๋ฃŒ ๋ถ„์„ยท๋น„๊ต์šฉ ์š”์•ฝ์„ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์žฌ์‹œ์ž‘์€ ์™„๋ฃŒ ๋ถ„์„์„ ์œ ์ง€ํ•˜์ง€๋งŒ ์‹คํ—˜ ์‹คํ–‰์ด๋‚˜ ๋ฏธ์™„๋ฃŒ ๊ณ„์‚ฐ์„ ์ž๋™ ์žฌ๊ฐœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์™„๋ฃŒ JSON์—์„œ PNGยทCSV์™€ ๋น„๊ต ๊ทธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋ฉฐ ์ฐฝ์„ ๋‹ซ์•„๋„ ์ ‘์ˆ˜๋œ ์„œ๋ฒ„ ๊ณ„์‚ฐ์€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. API, ๋ณด์กด ํŒŒ์ผ, ์‹œ๊ฐํ™” ์‚ฌ์šฉ๋ฒ•์—์„œ ๊ฐ๊ฐ์˜ ๊ณ„์•ฝ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ง€์› ๋ฐฐํฌ ๊ฒฝ๊ณ„

์šด์˜ ๋Œ€์ƒ์€ Linux์˜ rootful Docker Engine์ž…๋‹ˆ๋‹ค. Peer๋ณ„ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์€ Linux network namespace, tc, NET_ADMIN๊ณผ ํ•„์š”ํ•œ qdisc module์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์ค€๋น„, ๋ฐฐ์น˜์™€ overlay ์š”๊ตฌ์‚ฌํ•ญ, Agent metric ์ ‘๊ทผ, ์ €์žฅ์†Œ ๋ฐ cleanup์€ Swarm ๋ฐฐํฌ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๊ตฌํ˜„ ๋Œ€์‘ํ‘œ

๋™์ž‘ ๊ตฌํ˜„ ๊ทผ๊ฑฐ
์ปดํฌ๋„ŒํŠธ ์ง„์ž…์ ๊ณผ Swarm ๋ฐฐ์น˜ cmd/kpl/main.go, stack.swarm.yaml
API, scenario scheduling, admission, run cleanup internal/controller/api.go, internal/controller/runner.go, internal/controller/repeat.go
Agent lifecycle๊ณผ Docker ๊ฒฉ๋ฆฌ internal/agent/agent.go, internal/agent/docker.go
Peer ํ”„๋กœํ† ์ฝœ, transport discovery, traffic control internal/peer/peer.go, internal/peer/discovery.go, internal/netem/netem.go
Dashboard์™€ ๋ณด์กด ๊ธฐ๋ก internal/webui/static, internal/controller/scenarios.go, internal/controller/results.go