Network Load Balancer and Driver API - cloud-barista/cb-spider GitHub Wiki
CB-Spider Network Load Balancer and Driver API
- CB-Spider Network Load Balancer(NLB) Specification V0.6
- ๊ฒํ ์๊ฒฌ: https://github.com/cloud-barista/cb-spider/issues/587
- ๋ถ์์ฐธ๊ณ : CSP๋ณ NLB ์ด์ ํํฉ ๋ฐ ์ํ ๊ฒฐ๊ณผ ๋ฑ
1. CB-Spider NLB Overview
- ์ฌ์ฉ์๋ VPC ๋ด์ VM์ ํฅํ ์ธ๋ถ์ Client ์์ฒญ ๋ฐ ์
๋ ฅ ์คํธ๋ฆผ์ ๋ํ ๋ถํ ๋ถ์ฐ(Load Balancing)์ ๊ด๋ฆฌํ๊ธฐ ์ํด์
- ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํน์ VPC์ ์์๋๋ Network Load Balancer(์ดํ NLB)๋ฅผ ์์ฑ ๋ฐ ๊ตฌ์ฑํ ์ ์๋ค.
- 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๋ ํ๋์ ํฌ์ค ์ฒดํฌ๊ธฐ๋ฅผ ํฌํจํ๋ค.
- ์ ํ ๊ฐ๋ฅํ ์ฒดํฌ ํ๋กํ ์ฝ์ TCP ๋ฐ HTTP์ด๋ฉฐ,
- VM ๊ทธ๋ฃน์ ์์๋ VM๋ค์ ํฌ์ค ์ํ๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด์ VM ๊ทธ๋ฃน๊ณผ ๋์ผํ ํฌํธ๋ฅผ ํ์ฉํ๊ฑฐ๋
- ๋ณ๋์ ํฌ์ค ์ฒดํฌ ์ ์ฉ ํฌํธ(๊ทธ๋ฆผ์์ Port 81)๋ฅผ ๋ณ๋๋ก ์ค์ ํ ์ ์๋ค.
- ๊ฐ VM์ ์๋น์ค ํฌํธ ๋ฐ ํฌ์ค ์ฒดํฌ์ฉ ํฌํธ ์ฉ๋์ ์๋น์ค ๋ฐ๋ชฌ์ ์ฌ์ฉ์์ ์ํด ์ค๋น๋์ด์ผ ํ๋ค.
- ํฌ์ค ์ฒดํฌ๊ธฐ๋ ์ํ ์ฒดํฌ ์ฃผ๊ธฐ ๋ฐ ํ์ ์์ ๋ฑ์ ์ค์ ํ ์ ์์ผ๋ฉฐ,
- VM ๊ทธ๋ฃน์ ์์๋ VM๋ค์ ํฌ์ค ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. (Healthy VM ๋ชฉ๋ก, Unhealthy VM ๋ชฉ๋ก)
โป ์๋น์ค ๊ทธ๋ฃน ์คํ ์ค์ผ์ผ๋ง(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, Cloudit
- โป Health Checking
- ํฌ์ค ์ฒดํฌ๊ธฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก VM ๊ทธ๋ฃน์ ํฌํจ๋ VM์ Health ์ํ๋ฅผ ํ์ ํ๊ณ ์ ๊ณตํ๋ค.
- โ Client -> Frontend ์๋น์ค ์์ฒญ
4. NLB Driver Common API
-
Source Tree
$tree cb-spider/cloud-control-manager/cloud-driver/interfaces/ cb-spider/cloud-control-manager/cloud-driver/interfaces/ |-- CloudDriver.go |-- README.md |-- connect | `-- CloudConnect.go `-- resources |-- IId.go |-- ImageHandler.go |-- KeyPairHandler.go |-- KeyValue.go |-- NLBHandler.go <======================= Network Load Balancer Driver API |-- SecurityHandler.go |-- VMHandler.go |-- VMSpecHandler.go `-- VPCHandler.go
-
package resources import "time" //-------- Info Structure type NLBInfo struct { IId IID // {NameId, SystemId} VpcIID IID // {NameId, SystemId} Type string // PUBLIC(V) | INTERNAL Scope string // REGION(V) | GLOBAL //------ Frontend Listener ListenerInfo //------ Backend VMGroup VMGroupInfo HealthChecker HealthCheckerInfo CreatedTime time.Time KeyValueList []KeyValue } type ListenerInfo struct { Protocol string // TCP|UDP IP string // Auto Generated and attached Port string // 1-65535 DNSName string // Optional, Auto Generated and attached CspID string // Optional, May be Used by Driver. KeyValueList []KeyValue } type VMGroupInfo struct { Protocol string // TCP|UDP Port string // 1-65535 VMs *[]IID CspID string // Optional, May be Used by Driver. KeyValueList []KeyValue } type HealthCheckerInfo struct { Protocol string // TCP|HTTP Port string // Listener Port or 1-65535 Interval int // secs, Interval time between health checks. Timeout int // secs, Waiting time to decide an unhealthy VM when no response. Threshold int // num, The number of continuous health checks to change the VM status. CspID string // Optional, May be Used by Driver. KeyValueList []KeyValue } type HealthInfo struct { AllVMs *[]IID HealthyVMs *[]IID UnHealthyVMs *[]IID } //-------- API type NLBHandler interface { //------ NLB Management CreateNLB(nlbReqInfo NLBInfo) (NLBInfo, error) ListNLB() ([]*NLBInfo, error) GetNLB(nlbIID IID) (NLBInfo, error) DeleteNLB(nlbIID IID) (bool, error) GetVMGroupHealthInfo(nlbIID IID) (HealthInfo, error) AddVMs(nlbIID IID, vmIIDs *[]IID) (VMGroupInfo, error) RemoveVMs(nlbIID IID, vmIIDs *[]IID) (bool, error) //---------------------------------------------------// // @todo To support or not will be decided later. // //---------------------------------------------------// //------ Frontend Control ChangeListener(nlbIID IID, listener ListenerInfo) (ListenerInfo, error) //------ Backend Control ChangeVMGroupInfo(nlbIID IID, vmGroup VMGroupInfo) (VMGroupInfo, error) ChangeHealthCheckerInfo(nlbIID IID, healthChecker HealthCheckerInfo) (HealthCheckerInfo, error) //---------------------------------------------------// // @todo To support or not will be decided later. // //---------------------------------------------------// }
5. CB-Spider NLB REST API ๊ท๊ฒฉ
6. NLB ํ๋กํ ์ฝ/ํฌํธ ์ค์ ๋ฐ ์ํ ๊ฒฐ๊ณผ
- CB-Spider v0.6.3+์ ๊ฒ์ฆ๋ ํ๋กํ ์ฝ ๋ฐ ํฌํธ ์ค์ ์์๋ฅผ ๊ธฐ์ ํ๋ค.
- Listener, VMGroup, HealthChecker ๋ณ๋ก ํ๋กํ ์ฝ ๋ฐ ํฌํธ ์ค์ ์ด ๋ค์ํ ์ ์์ผ๋,
- ํ์ฌ ์๋ ์ํ ๋๊ตฌ ๊ฐ์ด๋ ๋ฐ ๊ฒฐ๊ณผ๋ก ๊ฒ์ฆ๋ ์ค์ ์ธ์ ์ค์ ๋์์ ๋ณด์ฅํ ์ ์๋ค.
- NLB Test Tool Guide
7. NLB Health Checking Interval/Timeout/Threshold Default ์ค์
- [TCP]
- Interval: 10
- Timeout: 10 (์์ธ: IBM์
Interval > Timeout
์ค์ ํ์) - Threshold: 3
- [HTTP]
- Interval: 10
- Timeout: 6 (์์ธ: Azure๋
์ค์ ๋ถ๊ฐ
, ๋์์ 10) - Threshold: 3
โป ์ฐธ๊ณ : CSP ์ค์ ์กฐ๊ฑด ๋ฐ ๋ฒ์
-
ref) https://docs.google.com/spreadsheets/d/1z4-H-rmbuPLS93JxQwY4prmT9CFLr2TT/edit#gid=1754708736
-
[Interval]
CSP ์ง์์ฌ๋ถ default ๊ฐ ์กฐ๊ฑด, ๋ฒ์ ๋ฐ ํน์ด์ฌํญ AWS O (์กฐ๊ฑด๋ถ) 30 * ๋ฒ์: 10 | 30๋ง ๊ฐ๋ฅ Azure O 5 * ๋ฒ์: 5 ์ด์ * ์กฐ๊ฑด: Interval * Threshold < 2147483647 GCP O 5 * ๋ฒ์: 1~300 * ์กฐ๊ฑด: Timeout <= Interval Alibaba O 2 * ๋ฒ์: 1~50 Tencent O 5 * ๋ฒ์: 2~300 * ์กฐ๊ฑด: Timeout <= Interval IBM O 5 * ๋ฒ์: 2~60 OpenStack O 5 *๋ฒ์: 2147483647(int ์ต๋๊ฐ) * ์กฐ๊ฑด: Timeout <= Interval NHN O - * ๋ฒ์: 1~5000 * ์กฐ๊ฑด: Timeout < Interval -
[Timeout]
CSP ์ง์์ฌ๋ถ default ๊ฐ ์กฐ๊ฑด, ๋ฒ์ ๋ฐ ํน์ด์ฌํญ AWS X 10 | 6 * ์ค์ ๋ถ๊ฐ * TCP: 10s, HTTP: 6s๋ก ๊ณ ์ Azure X 30 * ์ค์ ๋ถ๊ฐ * [์คํ๊ฐ] Interval๊ณผ default Timeout (30์ด) ์ค minimum (#791) GCP O 5 * ๋ฒ์: 1 ์ด์ * ์กฐ๊ฑด: Timeout <= Interval Alibaba O 5 * ๋ฒ์: 1~300 Tencent O 2 * ๋ฒ์: 2~60 * ์กฐ๊ฑด: Timeout <= Interval IBM O 2 * ๋ฒ์: 1~59 OpenStack O 5 *๋ฒ์: 2147483647(int ์ต๋๊ฐ) * ์กฐ๊ฑด: Timeout <= Interval NHN O - * ๋ฒ์ : 1~5000 * ์กฐ๊ฑด: Timeout < Interval -
[Threshold]
CSP ์ง์์ฌ๋ถ default ๊ฐ ์กฐ๊ฑด, ๋ฒ์ ๋ฐ ํน์ด์ฌํญ AWS O 3 * ๋ฒ์: 2~10 Azure O 1 * ๋ฒ์: 1 ์ด์ * ์กฐ๊ฑด: Interval * Threshold < 2147483647 GCP O 2 * ๋ฒ์: 1~10 Alibaba O 3 * ๋ฒ์: 2~10 Tencent O 3 * ๋ฒ์: 2~10 IBM O 2 * ๋ฒ์: 1~10 OpenStack O 3 * ๋ฒ์: 1~10 NHN O - * ๋ฒ์: 1~10
๊ด๋ จ ๋ถ์
History
- V0.5 => V0.6
- HealthCheck๊ด๋ จ ์ค์ ๊ฐ ๋ฐ ์กฐ๊ฑด ์ถ๊ฐ
- V0.4 => V0.5
- NLB ์ค์ ์์ ๋ฐ ์ํ ๊ฒฐ๊ณผ ๋ณ๋ ํ์ด์ง๋ก ๋ถ๋ฆฌ ๋ฐ ๋งํฌ ์ถ๊ฐ
- V0.3.1 => V0.4
- ChangeXXX() API ๋ณด๋ฅ: ๊ณตํต API์์ ์ ์ธ, ์ถํ ์ ๊ณต ํ์์ CSP๋ณ ์ ํ์ ์ ๊ณต ๊ณ ๋ ค
- ์ปดํฌ๋ํธ๋ณ ์ ๊ณต Protocol ๋ณ๊ฒฝ: (1) VMGroup: HTTP(S) ์ญ์ , (2) Health Checker: HTTPS ์ญ์
- ํ์ฌ ๋ฒ์ ์ผ๋ก ๊ฒ์ฆ๋ Protocol ๋ฐ Port ์ค์ ์์ ์ถ๊ฐ
- V0.3 => V0.3.1
- HealthCheckerInfo์ CspID(Optional) ์์ฑ ์ถ๊ฐ
- V0.2 => V0.3
- ChangeXXX() API ๋ฐํ ๊ฐ ๊ฐ์
- V0.1 => V0.2
- Multi Service Listener => Single Service Listener
- Service Listener => Listener
- Service Group => VM Group
- API: ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์
- API: NLBReqInfo๋ฅผ NLBInfo์ ํตํฉ
- API: NLBInfo Type ๋ฐ Scope ์์ฑ ์ถ๊ฐ
- API: ๋จ์ํ