-
Notifications
You must be signed in to change notification settings - Fork 48
Network Load Balancer and Driver API
- CB-Spider Network Load Balancer(NLB) Specification V0.4
- V0.4 : CB-Tumblebug 검토/개발 용
[CB-Spider Network Load Balancer Roadmap]
- 사용자는 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 제공 중심으로 선개발 및 우선 활용
[CB-Spider Network Load Balancer Overview]
[CB-Spider Network Load Balancer Components]
- NLB는 그림과 같이 프론트엔드(Frontend) 영역과 백엔드(Backend) 영역으로 구분되며,
영역별 주요 구성 요소는 다음과 같다.-
- 리스너는 Client의 요청 및 입력 스트림을 수신하여 백엔드 영역의 VM그룹으로 전달한다.
- 하나의 NLB는 하나의 리스너를 포함하며, 수신 프로토콜, IP 및 수신 포트로 구성된다.
- 선택 가능한 수신 프로토콜은 TCP 및 UDP이며, IP는 CSP 또는 대상 Driver에서 자동 생성 및 관리된다.
- 수신 포트는 1-65535 범위의 값으로 설정이 가능하다.
- ※ 리스너 IP와 DNS-Name: 둘다 제공하거나 둘중 하나만 제공할 수 있음
-
- VM 그룹은 동일한 서비스(nginx, redis, 사용자 개발 서비스 등)를 제공하는 VM들의 집합이며, VM은 등록 또는 제외가 가능하다.
- 하나의 NLB는 하나의 VM 그룹을 포함하며, VM 그룹은 수신 프로토콜, 수신 포트 및 VM들로 구성된다.
- 선택 가능한 수신 프로토콜은 TCP, UDP이며,
- VM 그룹은 하나의 수신 포트를 설정할 수 있다. (포트범위: 1-65535)
- VM 그룹 내의 VM들은 VM 그룹 설정과 동일한 프로토콜 및 포트 번호를 통해서 서비스 제공이 가능하다.
- 하나의 NLB는 하나의 헬스 체크기를 포함한다.
- 선택 가능한 체크 프로토콜은 TCP 및 HTTP이며,
- VM 그룹에 소속된 VM들의 헬스 상태를 체크하기 위해서 VM 그룹과 동일한 포트를 활용하거나
- 별도의 헬스 체크 전용 포트(그림에서 Port 81)를 별도로 설정할 수 있다.
- 각 VM의 서비스 포트 및 헬스 체크용 포트 용도의 서비스 데몬은 사용자에 의해 준비되어야 한다.
- 헬스 체크기는 상태 체크 주기 및 타임 아웃 등을 설정할 수 있으며,
- VM 그룹에 소속된 VM들의 헬스 상태 정보를 제공한다. (Healthy VM 목록, Unhealthy VM 목록)
- 오토 스케일링 정의 및 지원 여부 등 추후 고려
-
[CB-Spider Network Load Balancer 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 서비스 요청
-
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|HTTP|HTTPS Port string // 1-65535 VMs *[]IID CspID string // Optional, May be Used by Driver. KeyValueList []KeyValue } type HealthCheckerInfo struct { Protocol string // TCP|HTTP|HTTPS 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. // //---------------------------------------------------// }
-
CB-Spider v0.6.1의 검증된 프로토콜 및 포트 설정 예시를 기술한다.
- Listener, VMGroup, HealthChecker 별로 프로토콜 및 포트 설정이 다양할 수 있으나,
- 현재 아래 검증된 설정 외의 설정에 대한 동작은 보장할 수 없다.
- AddVMs() 및 RemoveVMs()에 대한 검증은 다음 버전에 추진 예정
-
현재 검증된 프로토콜 및 포트 설정은 아래 시험 항목의 설정 값을 참고하고,
-
현재 Health Checker의 Interval, Timeout, Threshold 설정 값은 다음과 같이 고정한다.
- Azure, GCP, Alibaba, Tencent, IBM: 다음 값으로 설정
Interval: 10 Timeout: 9 Threshold: 3
- AWS: 다음 값으로 설정
Interval: 10 Timeout: -1 Threshold: 3
- Azure, GCP, Alibaba, Tencent, IBM: 다음 값으로 설정
-
GCP 경우 다음 시험 항목만 가능
- (2) 웹 서비스 설정 검증 / [CASE-1] 시험 항목에서 HealthChecker 프로토콜을 HTTP로 설정
- 사유: VM에 Health Checking을 위한 HTTP Server 존재 필수, HealthChecker HTTP Protocol만 가능
-
(1) TCP 서비스 설정 검증: VM의 TCP 서비스를 NLB를 통해서 서비스
-
[CASE-1] 동일 프로토콜, 동일 포트
- Client 접근: ssh {NLB IP or DNSName}
- Listener 설정: TCP : 22
- VMGroup 설정: TCP : 22
- HealthChecker 설정: TCP : 22
-
[CASE-2] 동일 프로토콜, 리스너 포트 변경
- Client 접근: ssh {NLB IP or DNSName} -p 23
- Listener 설정: TCP : 23
- VMGroup 설정: TCP : 22
- HealthChecker 설정: TCP : 22
-
-
(2) 웹 서비스 설정 검증: VM의 웹 서비스를 NLB를 통해서 서비스
-
사전 설정: SG 80번 포트 개방, VMGroup의 모든 VM에 nginx 설치(80번 포트)
-
[CASE-1] 동일 프로토콜, 동일 포트
- Client 접근: curl {NLB IP or DNSName}
- Listener 설정: TCP : 80
- VMGroup 설정: TCP : 80
- HealthChecker 설정: TCP : 80 # GCP 경우: HTTP
-
[CASE-2] 동일 프로토콜, 리스너 포트 변경
- Client 접근: curl {NLB IP or DNSName}:81
- Listener 설정: TCP : 81
- VMGroup 설정: TCP : 80
- HealthChecker 설정: TCP : 80
-
-
위와 같은 시험 항목을 기준으로 대상 CSP별로 Load Balancer 통합 시험 및 검증 수행
-
통합 검증 시험 스크립트 참고 (v0.6.1)
test/nlb-test-curl/ |-- 1.create-nlb-test.sh |-- 2.list-get-nlb-test.sh |-- 6.gethealth-nlb-test.sh |-- 7.delete-nlb-test.sh
-
- AWS, Azure, GCP, Alibaba, Tencent, IBM: 통합 검증 완료
- GCP 조건: VM에 Health Checking을 위한 HTTP Server 존재 필수, HealthChecker HTTP Protocol만 가능
- Cloudit, OpenStack: 환경 이슈로 미확인(Driver단 검증 완료)
- 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: 단순화
-
Install & Start Guide
-
Features & Usage
-
- AdminWeb Tool Guide
- CLI Tool Guide
- REST API Guide
-
Design
-
Developer Guide
-
Cloud Driver Developer Guide
- Cloud Driver Developer Guide-WIP
- VM SSH Key Development Guide-WIP
- VM User Development Guide
- What is the CSP SDK API Version of drivers
- Region Zone Info and Driver API
- Price Info and Driver API
- (StartVM TerminateVM) API Call Counts and Waiting
- StartVM and TerminateVM Main Flow of drivers
- VM Root Disk Configuration Guide
- Security Group Rules and Driver API
- Network Load Balancer and Driver API
- VM Snapshot, MyImage and Disk Overview
- Kubernetes and Driver API(PMKS, K8S)
- Tag and Cloud Driver API
- AnyCall API Extension Guide
-
Test Reports
- v0.2.8-for-espresso-release
- v0.3.0-espresso-release
- Azure:Terminating VM
- cb-user@VM: ssh login, sudo run
- v0.3.14 test for SG Source
- v0.4.0-cafemocha-release
- Test via REST API Gateway
- Test Reports of v0.4.11 (IID2 initial Version)
- Test Reports of v0.4.12 (Register & Unregister existing Resources)
- Test Reports for v0.6.0 Release
- How to ...
- How to provision GPU VMs
- How to Resolve the 'Failed to Connect to Database' Error
- How to test CB Spider with Mock Driver
- How to install CB Spider on WSL2 under 공유기/사설망
- How to install CB Spider on macOS
- How to run CB Spider Container on macOS
- How to install OpenStack on a VM for CB Spider Testing
- How to get Azure available Regions
- How to profile memory usage in Golang
- Deprecated:How to install protoc and plugins
- [For Cloud-Migrator]