Network Load Balancer(NLB) Guide - cloud-barista/cb-spider GitHub Wiki

CB-Spider Network Load Balancer Guide

1. CB-Spider NLB Overview

  • ์‚ฌ์šฉ์ž๋Š” VPC ๋‚ด์˜ VM์„ ํ–ฅํ•œ ์™ธ๋ถ€์˜ Client ์š”์ฒญ ๋ฐ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ(Load Balancing)์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ
    • ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํŠน์ • VPC์— ์†Œ์†๋˜๋Š” Network Load Balancer(์ดํ•˜ NLB)๋ฅผ ์ƒ์„ฑ ๋ฐ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • NLB ์ƒ์„ฑ์‹œ์— ๋Œ€์ƒ VM(VM Group)์„ ํ•จ๊ป˜ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , NLB ์ƒ์„ฑ ํ›„์— VM์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์˜ˆ์™ธ: KT NLB๋Š” VPC๊ฐ€ ์•„๋‹Œ Subnet ๋Œ€์ƒ์œผ๋กœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
      • KT NLB๋Š” ๋Œ€์ƒ VM(VM Group)๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹๋งŒ ์ง€์›ํ•˜๋ฉฐ, ์„ค์ •ํ•œ VM์ด ์†ํ•œ Subnet์— NLB๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
      • ๋˜ํ•œ, NLB์™€ ๋™์ผํ•œ Subnet์˜ VM๋“ค๋งŒ VM Group์— ์ถ”๊ฐ€ ๋ฐ ์šด์˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • NLB๋Š” Public ํƒ€์ž…๊ณผ Internal ํƒ€์ž…์„ ์„ ํƒํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Public ํƒ€์ž…(default): ์™ธ๋ถ€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž์˜ ํด๋ผ์ด์–ธํŠธ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ
    • Internal ํƒ€์ž…: ๋‚ด๋ถ€ VM ๊ฐ„์˜ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ
    • Public ํƒ€์ž… ์ œ๊ณต ์ค‘์‹ฌ์œผ๋กœ ์„ ๊ฐœ๋ฐœ ๋ฐ ์šฐ์„  ํ™œ์šฉ
  • NLB๋Š” Region ๋ฒ”์œ„์™€ Global ๋ฒ”์œ„์˜ ์šด์˜์„ ์„ ํƒํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Regional NLB(default): ๋‹จ์ผ Region์—์„œ ์šด์˜๋˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ
    • Global NLB: ๋ฉ€ํ‹ฐ Region์—์„œ ์šด์˜๋˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ
    • Regional NLB ์ œ๊ณต ์ค‘์‹ฌ์œผ๋กœ ์„ ๊ฐœ๋ฐœ ๋ฐ ์šฐ์„  ํ™œ์šฉ

2. CB-Spider NLB Components

  • NLB๋Š” ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ”„๋ก ํŠธ์—”๋“œ(Frontend) ์˜์—ญ๊ณผ ๋ฐฑ์—”๋“œ(Backend) ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์˜์—ญ๋ณ„ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • [NLB-Frontend Tier]

      (1) ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌ์Šค๋„ˆ(Frontend Listener)

      • ๋ฆฌ์Šค๋„ˆ๋Š” Client์˜ ์š”์ฒญ ๋ฐ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์˜์—ญ์˜ VM๊ทธ๋ฃน์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
      • ํ•˜๋‚˜์˜ NLB๋Š” ํ•˜๋‚˜์˜ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ์ˆ˜์‹  ํ”„๋กœํ† ์ฝœ, IP ๋ฐ ์ˆ˜์‹  ํฌํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
      • ์„ ํƒ ๊ฐ€๋Šฅํ•œ ์ˆ˜์‹  ํ”„๋กœํ† ์ฝœ์€ TCP ๋ฐ UDP์ด๋ฉฐ, IP๋Š” CSP ๋˜๋Š” ๋Œ€์ƒ Driver์—์„œ ์ž๋™ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋œ๋‹ค.
      • ์ˆ˜์‹  ํฌํŠธ๋Š” 1-65535 ๋ฒ”์œ„์˜ ๊ฐ’์œผ๋กœ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
      • โ€ป ๋ฆฌ์Šค๋„ˆ IP์™€ DNS-Name: ๋‘˜๋‹ค ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋‘˜์ค‘ ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ
    • [NLB-Backend Tier]

      (2) ๋ฐฑ์—”๋“œ VM ๊ทธ๋ฃน(Backend VM Group)

      • VM ๊ทธ๋ฃน์€ ๋™์ผํ•œ ์„œ๋น„์Šค(nginx, redis, ์‚ฌ์šฉ์ž ๊ฐœ๋ฐœ ์„œ๋น„์Šค ๋“ฑ)๋ฅผ ์ œ๊ณตํ•˜๋Š” VM๋“ค์˜ ์ง‘ํ•ฉ์ด๋ฉฐ, VM์€ ๋“ฑ๋ก ๋˜๋Š” ์ œ์™ธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
      • VM ๊ทธ๋ฃน์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” VM์€ NLB์™€ ๋™์ผํ•œ VPC์— ์†ํ•ด ์žˆ๋Š” VM๋“ค๋กœ ํ•œ์ •๋œ๋‹ค.
      • ํ•˜๋‚˜์˜ NLB๋Š” ํ•˜๋‚˜์˜ VM ๊ทธ๋ฃน์„ ํฌํ•จํ•˜๋ฉฐ, VM ๊ทธ๋ฃน์€ ์ˆ˜์‹  ํ”„๋กœํ† ์ฝœ, ์ˆ˜์‹  ํฌํŠธ ๋ฐ VM๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
      • ์„ ํƒ ๊ฐ€๋Šฅํ•œ ์ˆ˜์‹  ํ”„๋กœํ† ์ฝœ์€ TCP, UDP์ด๋ฉฐ,
      • VM ๊ทธ๋ฃน์€ ํ•˜๋‚˜์˜ ์ˆ˜์‹  ํฌํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (ํฌํŠธ๋ฒ”์œ„: 1-65535)
      • VM ๊ทธ๋ฃน ๋‚ด์˜ VM๋“ค์€ VM ๊ทธ๋ฃน ์„ค์ •๊ณผ ๋™์ผํ•œ ํ”„๋กœํ† ์ฝœ ๋ฐ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด์„œ ์„œ๋น„์Šค ์ œ๊ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

      (3) ํ—ฌ์Šค ์ฒดํฌ๊ธฐ(Health Checker)

      • ํ•˜๋‚˜์˜ NLB๋Š” ํ•˜๋‚˜์˜ ํ—ฌ์Šค ์ฒดํฌ๊ธฐ๋ฅผ ํฌํ•จํ•˜๋ฉฐ,

      • ํ—ฌ์Šค ์ฒดํฌ๊ธฐ๋Š” VM ๊ทธ๋ฃน์— ํฌํ•จ๋œ VM๋“ค์˜ ํ—ฌ์Šค ์ƒํƒœ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

        • Healthy VM ๋ชฉ๋ก, Unhealthy VM ๋ชฉ๋ก ๋“ฑ ์ œ๊ณต
        • ์ถ”๊ฐ€๋œ VM์˜ ์ตœ์ดˆ ํ—ฌ์Šค ์ƒํƒœ ์ฒดํฌ๋Š” ์ˆ˜์ดˆ~์ˆ˜๋ถ„ ์ •๋„ ์†Œ์š”
      • ํ—ฌ์Šค ์ฒดํฌ๊ธฐ์˜ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ์€ TCP ๋ฐ HTTP์ด๋ฉฐ,

      • VM ๊ทธ๋ฃน์— ์†Œ์†๋œ VM๋“ค์˜ ํ—ฌ์Šค ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ VM ๊ทธ๋ฃน๊ณผ ๋™์ผํ•œ ํฌํŠธ๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜

      • ๋ณ„๋„์˜ ํ—ฌ์Šค ์ฒดํฌ ์ „์šฉ ํฌํŠธ(๊ทธ๋ฆผ์—์„œ Port 81)๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ๊ฐ VM์˜ ์„œ๋น„์Šค ํฌํŠธ ๋ฐ ํ—ฌ์Šค ์ฒดํฌ์šฉ ํฌํŠธ ์šฉ๋„์˜ ์„œ๋น„์Šค ๋ฐ๋ชฌ์€ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ค€๋น„๋˜์–ด์•ผ ํ•œ๋‹ค.

      • ํ—ฌ์Šค ์ฒดํฌ๊ธฐ๋Š” ์ƒํƒœ ์ฒดํฌ ์ฃผ๊ธฐ(Interval), Timeout ๋ฐ Threadhold ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

      • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, default ๊ฐ’์„ ๋ช…์‹œํ•  ๊ฒฝ์šฐ, default ๊ฐ’์ด ์„ค์ •๋œ๋‹ค.

        โ€ป cf) Health Check Interval, Timeout, Threshold default ๊ฐ’ ๋ฐ ์„ค์ • ์กฐ๊ฑด ๋“ฑ

        • [Interval]

          CSP TCP default HTTP default ์„ค์ • ์กฐ๊ฑด, ๋ฒ”์œ„ ๋ฐ ํŠน์ด์‚ฌํ•ญ
          AWS 10 10 * ๋ฒ”์œ„: 10, 30๋งŒ ๊ฐ€๋Šฅ
          Azure 10 10 * ๋ฒ”์œ„: 5 ์ด์ƒ * ์กฐ๊ฑด: Interval * Threshold < 2147483647
          GCP 10 10 * ๋ฒ”์œ„: 1~300 * ์กฐ๊ฑด: Timeout <= Interval
          Alibaba 10 10 * ๋ฒ”์œ„: 1~50
          Tencent 10 10 * ๋ฒ”์œ„: 2~300 * ์กฐ๊ฑด: Timeout <= Interval
          IBM 10 10 * ๋ฒ”์œ„: 2~60 * ์กฐ๊ฑด: Timeout < Interval
          OpenStack 10 10 * ๋ฒ”์œ„: 2147483647(int ์ตœ๋Œ€๊ฐ’) * ์กฐ๊ฑด: Timeout <= Interval
          NCP 10 10 * ๋ฒ”์œ„: 5~300
          NHN 10 10 * ๋ฒ”์œ„: 1~5000 * ์กฐ๊ฑด: Timeout < Interval
        • [Timeout]

          CSP TCP default HTTP default ์„ค์ • ์กฐ๊ฑด, ๋ฒ”์œ„ ๋ฐ ํŠน์ด์‚ฌํ•ญ
          AWS 10 6 * ์„ค์ • ๋ถˆ๊ฐ€ * TCP: 10s, HTTP: 6s ๊ณ ์ •
          Azure 10 10 * ์„ค์ • ๋ถˆ๊ฐ€ * Interval๊ณผ Azure default Timeout(30) ์ค‘ ์ž‘์€ ๊ฐ’
          GCP 10 6 * ๋ฒ”์œ„: 1 ์ด์ƒ * ์กฐ๊ฑด: Timeout <= Interval
          Alibaba 10 6 * ๋ฒ”์œ„: 1~300
          Tencent 10 6 * ๋ฒ”์œ„: 2~60 * ์กฐ๊ฑด: Timeout <= Interval
          IBM 9 6 * ์˜ˆ์™ธ * ์กฐ๊ฑด: Timeout < Interval
          OpenStack 10 6 * ๋ฒ”์œ„: 2147483647(int ์ตœ๋Œ€๊ฐ’) * ์กฐ๊ฑด: Timeout <= Interval
          NCP 10 6 * ๋ฒ”์œ„: 1~3600
          NHN 10 6 * ๋ฒ”์œ„: 1~5000 * ์กฐ๊ฑด: Timeout < Interval
        • [Threshold]

          CSP TCP default HTTP default ์„ค์ • ์กฐ๊ฑด, ๋ฒ”์œ„ ๋ฐ ํŠน์ด์‚ฌํ•ญ
          AWS 3 3 * ๋ฒ”์œ„: 2~10
          Azure 3 3 * ๋ฒ”์œ„: 1 ์ด์ƒ * ์กฐ๊ฑด: Interval * Threshold < 2147483647
          GCP 3 3 * ๋ฒ”์œ„: 1~10
          Alibaba 3 3 * ๋ฒ”์œ„: 2~10
          Tencent 3 3 * ๋ฒ”์œ„: 2~10
          IBM 3 3 * ๋ฒ”์œ„: 1~10
          OpenStack 3 3 * ๋ฒ”์œ„: 1~10
          NCP 3 3 * ๋ฒ”์œ„: 2~10
          NHN 3 3 * ๋ฒ”์œ„: 1~10

      โ€ป ์„œ๋น„์Šค ๊ทธ๋ฃน ์˜คํ†  ์Šค์ผ€์ผ๋ง(Service Group Auto-Scaling)

      • ์˜คํ†  ์Šค์ผ€์ผ๋ง ์ •์˜ ๋ฐ ์ง€์› ์—ฌ๋ถ€ ๋“ฑ ์ถ”ํ›„ ๊ณ ๋ ค

3. CB-Spider NLB Operation Flow

  • NLB ์ฃผ์š” ๋™์ž‘ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • โ‘  Client -> Frontend ์„œ๋น„์Šค ์š”์ฒญ
      • Client๋Š” TCP, HTTP ๋˜๋Š” UDP ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜์œผ๋กœ Frontend ๋ฆฌ์Šค๋„ˆ IP ๋ฐ ๋ฆฌ์Šค๋„ˆ ํฌํŠธ๋ฅผ ํ†ตํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•œ๋‹ค.
      • Client์˜ HTTP ํ”„๋กœํ† ์ฝœ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ VMGroup ์ˆ˜์‹  ํ”„๋กœํ† ์ฝœ์ด TCP์˜ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • โ‘ก Frontend -> Backend ์„œ๋น„์Šค ๋ผ์šฐํŒ…
      • ๋ฆฌ์Šค๋„ˆ์— ์˜ํ•ด ์ˆ˜์‹ ๋œ ์‚ฌ์šฉ์ž ์š”์ฒญ์€ TCP ๋˜๋Š” UDP ๊ธฐ๋ฐ˜์œผ๋กœ VM ๊ทธ๋ฃน ํฌํŠธ๋กœ ๋ผ์šฐํŒ… ๋œ๋‹ค.
    • โ‘ข ๋ผ์šฐํŒ… ๋Œ€์ƒ VM ์„ ์ • ๋ฐ ๋ผ์šฐํŒ… (๋Œ€์ƒ CSP์—์„œ ์ˆ˜ํ–‰)
      • VM ๊ทธ๋ฃน์— ํฌํ•จ๋œ VM๋“ค ์ค‘ Healthy ์ƒํƒœ์˜ VM์—๊ฒŒ Client ์š”์ฒญ ๋ฐ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋ผ์šฐํŒ… ํ•œ๋‹ค.
      • VM ๊ทธ๋ฃน์— ํฌํ•จ๋œ ๋ชจ๋“  VM๋“ค์ด Unhealthy ์ƒํƒœ์ธ ๊ฒฝ์šฐ CSP๋ณ„๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ ํ•œ๋‹ค.
        • VM ๊ทธ๋ฃน์— ํฌํ•จ๋œ ๋ชจ๋“  VM์— ๋ผ์šฐํŒ…ํ•˜๋Š” CSP: AWS, GCP, Tencent
        • Client ์ŠคํŠธ๋ฆผ์„ ๋ผ์šฐํŒ…ํ•˜์ง€ ์•Š๋Š” CSP: Azure, IBM
    • โ€ป Health Checking
      • ํ—ฌ์Šค ์ฒดํฌ๊ธฐ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ VM ๊ทธ๋ฃน์— ํฌํ•จ๋œ VM์˜ Health ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ œ๊ณตํ•œ๋‹ค.

5. CB-Spider NLB API ํ™œ์šฉ

  • CB-Spider NLB API Swagger UI

  • API Usage Examples

    • NLB ์ƒ์„ฑ: VMGroup ์„ค์ • ์ œ์™ธ, HealthCheck ์ฃผ๊ธฐ ๋“ฑ ์ƒ๋žต(default ์„ค์ •)
    curl -sX POST http://localhost:1024/spider/nlb \
      -H 'Content-Type: application/json' \
      -d '{
           "ConnectionName": "aws-config01",
           "ReqInfo": {
             "Name": "nlb-01",
             "VPCName": "vpc-01",
             "Type": "PUBLIC",
             "Scope": "REGION",
             "Listener": {
               "Protocol": "TCP",
               "Port": "22"
             },
             "HealthChecker": {
               "Protocol": "TCP",
               "Port": "22"
             }
           }
         }'
    
    • NLB ์ƒ์„ฑ: VMGroup(vm-01, vm-02) ์„ค์ •, HealthCheck ์ฃผ๊ธฐ ๋“ฑ default ์„ค์ •
    curl -sX POST http://localhost:1024/spider/nlb \
      -H 'Content-Type: application/json' \
      -d '{
           "ConnectionName": "aws-config01",
           "ReqInfo": {
             "Name": "nlb-01",
             "VPCName": "vpc-01",
             "Type": "PUBLIC",
             "Scope": "REGION",
             "Listener": {
               "Protocol": "TCP",
               "Port": "22"
             },
              "VMGroup": {
               "Protocol": "TCP",
               "Port": "22",
               "VMs": ["vm-01", "vm-02"]
             },
             "HealthChecker": {
               "Protocol": "TCP",
               "Port": "22",
               "Interval": "default",
               "Timeout": "default",
               "Threshold": "5"
             }
           }
         }'
    
    • VM Group ์ƒํƒœ ์ •๋ณด ํ™•์ธ
    curl -X 'GET' 'http://localhost:1024/spider/nlb/nlb-01/health?ConnectionName=aws-config01' \
      -H 'accept: application/json'
    
    {
       "healthinfo" : {
          "AllVMs" : [
             {
                "NameId" : "vm-02",
                "SystemId" : "i-0747a8efd719fa1a7"
             },
             {
                "NameId" : "vm-01",
                "SystemId" : "i-06a0dc51237bc777d"
             }
          ],
          "HealthyVMs" : [
             {
                "NameId" : "vm-02",
                "SystemId" : "i-0747a8efd719fa1a7"
             },
             {
                "NameId" : "vm-01",
                "SystemId" : "i-06a0dc51237bc777d"
             }
          ],
          "UnHealthyVMs" : []
       }
    }
    
    • NLB ์‚ญ์ œ
    curl -X 'DELETE' 'http://localhost:1024/spider/nlb/nlb-01' \
      -H 'Content-Type: application/json' \
      -d '{
      "ConnectionName": "aws-config01"
    }'