Skip to content

Network Load Balancer and Driver API

ByoungSeob Kim edited this page Jul 21, 2022 · 32 revisions

CB-Spider 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]


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 제공 중심으로 선개발 및 우선 활용


[CB-Spider Network Load Balancer Overview]


2. CB-Spider NLB Components


[CB-Spider Network Load Balancer 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은 등록 또는 제외가 가능하다.
      • 하나의 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


[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 상태를 파악하고 제공한다.

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
    
  • Driver API Spec V0.4 (latest)

    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.   //
    //---------------------------------------------------//
    
    }


5. CB-Spider NLB REST API 규격

6. NLB Configuration Examples

  • 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
      
  • GCP 경우 다음 시험 항목만 가능

    • (2) 웹 서비스 설정 검증 / [CASE-1] 시험 항목에서 HealthChecker 프로토콜을 HTTP로 설정
    • 사유: VM에 Health Checking을 위한 HTTP Server 존재 필수, HealthChecker HTTP Protocol만 가능

[CB-Spider v0.6.1, NLB 0.4 통합 검증 시험 항목]

  • (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
      

7. NLB 통합 시험 및 검증 현황 (CB-Spider v0.6.1, NLB 0.4)

  • AWS, Azure, GCP, Alibaba, Tencent, IBM: 통합 검증 완료
    • GCP 조건: VM에 Health Checking을 위한 HTTP Server 존재 필수, HealthChecker HTTP Protocol만 가능
  • Cloudit, OpenStack: 환경 이슈로 미확인(Driver단 검증 완료)

관련 분석

History

- 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: 단순화

Table of contents



Clone this wiki locally