Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[+NLB] Cloud Driver API Definition of LoadBalancer #587

Closed
3 tasks done
powerkimhub opened this issue Mar 23, 2022 · 27 comments
Closed
3 tasks done

[+NLB] Cloud Driver API Definition of LoadBalancer #587

powerkimhub opened this issue Mar 23, 2022 · 27 comments
Assignees

Comments

@powerkimhub
Copy link
Member

powerkimhub commented Mar 23, 2022

  • NLB features and Interfaces Analysis of CSPs
  • Cloud Driver NLB API Definition
  • Cloud Driver NLB API Review
@powerkimhub powerkimhub self-assigned this Mar 23, 2022
@powerkimhub powerkimhub pinned this issue Mar 23, 2022
@powerkimhub powerkimhub changed the title [+LB] Cloud Driver API Definition of LoadBalancer [+NLB] Cloud Driver API Definition of LoadBalancer May 7, 2022
@powerkimhub
Copy link
Member Author

@seokho-son
Copy link
Member

NLB 관련해서 서비스 개념들이 등장하는 것 같습니다.
SP에서 서비스 형태의 내용이 들어가면 서비스 관리의 개념까지 포함하게 될 수 있을 것 같은데 어떻게 보시나요?

@powerkimhub
Copy link
Member Author

powerkimhub commented May 18, 2022

@seokho-son

  • NLB는 사용자 서비스관리와는 관련이 없습니다.
  • NLB에서는 Service가 이니고 Service VM(VM for Service)이 대상입니다.
  • Service VM은 사용자가 VM에 사용자 서비스(mysql, nginx, ...)를 탑재후 외부로 오픈할 목적인 VM들을
    • NLB에 등록하는 형태가 될 것 입니다.

@powerkimhub
Copy link
Member Author

powerkimhub commented May 19, 2022

@inno-cloudbarista @seokho-son, Thanks for your review

  • 구조 수정 제안
    • 제안: Multi Listener => Single Listener
    • 사유: Azure, IBM-VPC 지원 불가 (세부 내용 아래 참고)
    • 계획: 반영
      [TO-BE] Front-IP(Single Port Listener) --> Single Service Port(Single Service Group)
      
  • Service 키워드 사용 검토 필요
    • Service 용어가 여러가지 의미로 해석될 수 있음
    • 계획: 반영
      [TO-BE] Service Listener IP/Port => Listener IP/Port
      [TO-BE] Service Group => VM Group
      

source) https://cloud-barista.slack.com/archives/CLFCLNFTJ/p1652679622158409

NLB 적용 중 이슈 사항이 있어 말씀 드립니다.
Frontend 부분의 Service Listner 와 Backend의 ServiceGroup의 연결 관계 중
서비스 리스너(Service Listener) 설명 하단의
- 동일한 NLB의 리스너는 동일한 서비스 그룹으로 라우팅이 가능하다.
에 대한 부분입니다. 그림 상에서도 Service Listner 80포트, 8080포트, 100포트 가 ServiceGroup의 8080포트 하나로 연결되는데,
Azure의 경우 Service Listner와 ServiceGroup이 조금 다릅니다.
ServiceGroup 의 포트는 하나의 Service Listner포트만 연결될 수 있습니다.
Azure의 경우 해당 기능은 Load balancing rules에서 추가할 수 있습니다.
예시로
가능 :
Service Listner : 8080 ======> ServiceGroup :8080
Service Listner : 80 ======> ServiceGroup :8081
불가 :
Service Listner : 8080 ======> ServiceGroup :8080
Service Listner : 80 =XXXX=> ServiceGroup :8080
The backend port, protocol and pool combination you entered matches another rule used by this load balancer. The backend port, protocol and pool combination of each load-balancing rule for a load balancer must be unique.
불가의 예시의 경우 위 메세지를 출력합니다.
Ibm-vpc의 경우는 Service Listner(Front-end listeners)와 ServiceGroup(Back-end pools)는 1대1로만 매핑이 가능합니다.
예시로
가능 :
Service Listner : 8080 ======> ServiceGroup :8080
Service Listner : 80 ======> ServiceGroup :8081
위의 기능이 동작하려면 Front-end listeners 2개, Back-end pools 2개가 정의되어야 합니다.
- Service Listner(Front-end listeners)의 port는 range로는 표현될수 있으나, 80, 8080 각 포트로 표현될 경우 2개로 정의
불가 :
Service Listner : 8080 ======> ServiceGroup :8080
Service Listner : 80 =XXXX=> ServiceGroup :8080
"Member with target id 'id값' and port '8080' already exists in a pool."
불가의 예시의 경우 위 메세지를 출력합니다.
Azure와 Ibm-vpc 기능의 명칭은 다르지만, Service Listner - ServiceGroup를 연결하는 관계는 1대1로 매핑되게끔 되어 있습니다.
하지만 제공해주신 인터페이스에서는 여러 Service Listner가 하나의 ServiceGroup의 port에 연결되는 N대1로 되어 있어,
Azure, Ibm-vpc 에서는 기능 적용하기에 어려움이 있습니다.

@powerkimhub
Copy link
Member Author

@inno-cloudbarista @seokho-son,

@powerkimhub
Copy link
Member Author

[Change API 규격 불일치 및 call.NLB 반영 이슈]


  • image

@powerkimhub
Copy link
Member Author

powerkimhub commented May 27, 2022

[Cloudit 제약 및 제공하지 않는 기능 에러 메시지 관련]


  • [제공하지 않는 기능 에러 메시지 참고]

  • 추전 error msg style: "CLOUDIT_CANNOT_CHANGE_HEALTHINFO"

  • API 내부에서 일부 제공하지 않는 기능이 있을 경우

    • cblog.info("CLOUDIT_CANNOT_CHANGE_XXXX")
  • [Cloudit NLB 구현시 제약 사항]

Cloudit의 NetworkLoadBalance는 Listener 항목을 수정할 수 있는 기능이 없습니다.
또한 VMGroup의 Protocol은 Listener Protocol과 동일한 Protocol로만 설정됩니다.
HealthCheck 기능은 Protocol은 수정 불가, Port는 VMGroup의 Port로 고정됩니다.(vmgroup 내의 서버별 포트이나, 핸들러에서 VMGroup의 Port로 일괄 적용)
1. ChangeListener 제공 불가
2. ChangeVMGroupInfo 부분적 제공
  - Port 만 변경 가능
3. ChangeHealthCheckerInfo 부분적 제공
  - Interval, timeout, Threshold 만 변경 가능

@powerkimhub
Copy link
Member Author

@dev4unet

[AWS Subnet 선택 관련 이슈]

  • Reported in slack

  • 요약

    • NLB 생성시 대상 VPC 내의 Subnet 선택 필요
    • Spider NLB는 subnet 선택 방법 없음

[AWS Subnet 선택 이슈 관련 제안 방법]

  • 타 CSP 중에는 VPC binding이 아닌 경우도 있고,
  • Subnet 선택이 없는 경우도 있어서, 현재 관련 인터페이스를 밖으로 빼내지 않았습니다.
  • 다음 방법으로 제안 드립니다.
    • Driver 내부에서 NLB 전용 Subnet 생성/설정 및 관리
    • VMHandler public IP 관리와 유사
    • 특이사항
      • Spider의 VPC/Subnet 목록에는 보이지 않음
        • NLB 삭제시 자동 삭제 처리 필요
      • Subnet 숫자는 일단 Driver에서 적당 설정
      • 추후 이슈가 발생하거나 사용자 관리가 필요하게 되면
      • 그때, 상황에 맞게 개선해가도록 하지요.

@dev4unet
Copy link
Member

dev4unet commented May 27, 2022

@powerkimhub
현 상태에서 NLB전용 Subnet을 생성할 필요는 없으며...
현재 상황은 AWS는 VPC가 아닌 Subnet 기반의 NLB 생성이라..
A VPC에 sub1 / sub2 / sub3 / sub4의 4개의 서브넷이 있다고 가정할 경우
현재 CB의 NLB인터페이스에서는 답변 주신 이유로 인해 VPC 정보는 있지만 고객이 NLB와 연동할 subnet을 선택할 수 있는 방법이 없기 때문에...
고객이 sub1~sub4의 서브넷 중 sub1과 sub2하고만 연동하고 싶을 경우 전달 받은 정보가 없어서 구현할 방법이 없습니다.

현재는 서브넷 정보를 전달 받지 않았기 때문에 A VPC에 속해있는 모든 서브넷(sub1~sub4)에서 동작하도록만 구현할 수 있습니다.
VPC에 존재하는 모든 서브넷을 지정하기 때문에 NLB 삭제시 자동 삭제 처리는 필요 없으리라 봅니다.

@powerkimhub
Copy link
Member Author

@dev4unet

  • 대상 VPC에 subnet이 존재하지 않는 경우는 없는지요?

@dev4unet
Copy link
Member

dev4unet commented May 27, 2022

@powerkimhub
그 경우는 단순히 NLB 생성 실패로 끝내야 할 것 같습니다.
NLB를 붙이기 위해서는 VPC에 인터넷 게이트웨이 설정도 되어 있어야 하며...
현재 CB NLB의 경우 이미 특정 리전에서 동작하고 있는 VM에 NLB를 연동하기 위해 NLB를 생성하는 작업인데...
서브넷이 없다는 것은 생성된 VM이 없다는 이미와 같습니다.
VM이 없는 상태에서 NLB를 만드는 경우까지 고려하려면 작업이 너무 많아서 고려할 필요는 없으리라 봅니다.

오히려 서브넷이 없는 경우 보다는 고객이 AWS 콘솔에서 자체 생성한 VPC에 인터넷 게이트웨이를 생성하지 않은 경우는 있을 것 같습니다. (CB에서 생성하는 VPC는 Public IP할당을 위해 강제로 IGW를 생성해서 연결하고 있습니다.)

@powerkimhub
Copy link
Member Author

@dev4unet

  • 넵, 그게 좋겠습니다. (대상 VPC에 subnet 없을 때: 실패 처리)
  • 추가적으로 현 Spider에서는 Subnet을 하나만 연동 가능할 거 같습니다.
  • 사유: 현재 Cloud-Barista의 Cloud 정의로 볼때 AWS의 경우 Zone까지 입니다.
    • 참고: Connection Config: {Region:us-east-2, Zone:us-east-2a}
    • 현재 Spider connection(Zone 지정)을 통해서 VPC를 만들면,
    • 단일 Zone에 생성이 됩니다.
    • AWS Console로 봤을 때는 NLB 생성시에 Zone별로 하나의 Subnet만을 선택하게 되어 있습니다. (API로는 미확인)
    • 참고
      • image

@dev4unet
Copy link
Member

@powerkimhub
네, 우선은 위 상태로 구현하고 나중에 개선이 필요하면 보완하는 형태로 진행하겠습니다.

@powerkimhub
Copy link
Member Author

@dev4unet

  • 넵, 캄사합니다~

@powerkimhub
Copy link
Member Author

powerkimhub commented Jun 3, 2022

@inno-cloudbarista ( @dev4unet @dogfootman @choryang @innodreamer )

  • 제공 범위 관련 내용이 있으므로 다른 드라이버팀 분들도 참고해주시기 바랍니다.

[IBM-VPC 이슈]

[관련 CB-Spider NLB 규격 요약]

[IBM-VPC NLB 이슈]

(1) C/U 긴 소요 시간 (가변적:1~5분)

  • 넵, 현황 참고하겠습니다.
  • 추후 타 CSP NLB도 사용해보면서
    • 일반적인 상황인지 이슈인지 정리해가도록 하겠습니다.

(2) HTTP/HTTPS 제공 난해

  • IBM-VPC 제공 프로토콜
    • Listener: TCP,UDP ==> Spider 규격 만족
    • VMGROUP: TCP,UDP ==> Spider 규격 중 HTTP, HTTPS 불가 처리
      • 추후, RootDiskType 등과 같이 CSP별 차이를 반영해보겠습니다.

(3) Protocol 변경 불가 이슈

  • 넵, 알겠습니다.
  • 현재는 에러 처리 해주시면 되겠습니다.
  • 대부분 CSP가 불가능할 거 같습니다.
  • 추후 타 CSP 상황 전체 취합 후 변경 가능한 속성과 불가능한 속성을 재정리하겠습니다.

@inno-cloudbarista
Copy link
Contributor

넵 확인하였습니다. IBM-VPC 제공 프로토콜 관련해서 적용하겠습니다!

@powerkimhub
Copy link
Member Author

@dogfootman

[GCP ChangeVMGroupInfo() 제공 제약 관련]

  • ChangeVMGroupInfo() : 지원 불가
  • 사유
    type VMGroupInfo struct {
            Protocol        string  // TCP|UDP|HTTP|HTTPS    <== 생성시 설정 가능/수정 불가(Target Pool SessionAffinity)
            Port            string  // 1-65535            <== 생성시 설정 가능/수정 불가(Target Pool SessionAffinity)
            VMs             *[]IID                          <== AddVMs() / RemoveVMs()로 변경
    
            CspID           string  // Optional, May be Used by Driver.
            KeyValueList []KeyValue
    }
    

//---------

  • 참고
    front-end로 들어오는 Protocol=TCP/UDP, Port 지정하고
    back-end 에서는 따로 설정하지 않습니다.
    back-end로는 targetPool을 사용하며
    선택사항으로 sessionAffinity라는 것에  ip/port를 지정하는 것은 있으나, targetPool 생성시에만 설정가능하고 수정 불가합니다.
    sessionAffinity
    [선택사항] 백엔드 가상 머신 인스턴스를 선택하는 데 사용되는 방법을 제어합니다. 이 값은 대상 풀을 만드는 도중에만 설정할 수 있습니다. 이 값을 설정하고 나면 수정할 수 없습니다
    
  • Ref) https://cloud.google.com/load-balancing/docs/target-pools

@dogfootman
Copy link
Contributor

dogfootman commented Jun 7, 2022

[GCPHealthCheckerInfo] 관련 내용입니다.

GCP는 health checker를 따로 등록한 후 resourceID를 선택하는 방식입니다.
변경시에도 동일하게 변경할 resourceID(health checker url)가 와야 하는데
irs.HealthCheckInfo에는 관련 인자가 없습니다.
그래서 healthCheckerInfo에도 IID가 추가되면 SystemId에 healthcker url을 할당해 사용할 수 있을 것 같습니다.

CspID 에는 연결된 resourceID(url)을 set하기 때문에
삭제는 가능하나
변경할 health checker정보가 parameter에 없어서 추가 할 수 없는 상태입니다.

관련 API
CreateNLB
ChangeHealthCheckerInfo

ps : health checker에 대하여
1개의 health checker 만 가능하여 변경 기능은 없고 삭제 후 추가 하는 방식으로 개발해야 할 것 같습니다.
아니면, health checker 수정 불가로 할까요?

@powerkimhub
Copy link
Member Author

@choryang

[Tencent] AddVMs/RemoveVMs시 Backend Port 설정 관련 특이사항

  • 현재 Port 관련 인자 없어 설정 불가
  • 대안:
    • (1) listener port와 동일한 port 사용
    • (2) Tag등을 이용하여 사용할 port 정보 등록
  • 추진:
    • (1)안으로 추진 후 필요시 개선

//---------

  • 참고
    Tencent 의 NLB 이슈사항 공유드립니다.
    - Tencent에서는 AddVMs/RemoveVMs경우 listener에서 backend로 전달할 port정보가 필요합니다. (protocol은 TCP로 고정) 따라서 파라미터에 port 정보를 추가할 수 있으면 좋을 것 같습니다. 가능할까요?
    - 가능하지 않다면
    1) listener port와 동일한 port 사용
    2) Tag등을 이용하여 사용할 port 정보 등록
    등의 방안을 생각하고 있는데 어떻게 하는 것이 좋을까요.
    

@powerkimhub
Copy link
Member Author

@dogfootman

[GCP] HealthChecker SystemId 관련

  • ChangeHealthCheckerInfo(nlbIID, ...)에서 입력되는 nlbIID를 통해서
  • Driver 내부에서 얻을 수 있는 방법이 없을 지요?

[GCPHealthCheckerInfo] 관련 내용입니다.

GCP는 health checker를 따로 등록한 후 resourceID를 선택하는 방식입니다. 변경시에도 동일하게 변경할 resourceID(health checker url)가 와야 하는데 irs.HealthCheckInfo에는 관련 인자가 없습니다. 그래서 healthCheckerInfo에도 IID가 추가되면 SystemId에 healthcker url을 할당해 사용할 수 있을 것 같습니다.

CspID 에는 연결된 resourceID(url)을 set하기 때문에 삭제는 가능하나 변경할 health checker정보가 parameter에 없어서 추가 할 수 없는 상태입니다.

관련 API CreateNLB ChangeHealthCheckerInfo

ps : health checker에 대하여 1개의 health checker 만 가능하여 변경 기능은 없고 삭제 후 추가 하는 방식으로 개발해야 할 것 같습니다. 아니면, health checker 수정 불가로 할까요?

@dogfootman
Copy link
Contributor

health Check List 전체에서 에서 Protocol, Port 가 동일한 것이 여러개면
설정할 healthker 는 선택해서 내려와야 하므로 드라이버 내부에서 set은...

동일현상인 front-end의 경우 back-end와 동일한 이름으로 삭제 후 insert하는 방식인데
동일한 방식으로 구현은 가능할 것 같습니다.
즉 nlb name = front-end name(listener) = back-end name(vmGroup) = health checker name
모두 동일하게 하면
목록에서 nlb name에 해당하는 health checker를 삭제 후 nlb name과 넘어온 param 값으로 insert하는 방식.

transaction 으로 묶이지 않는 문제는 있습니다.

@dogfootman
Copy link
Contributor

GCP Health checker 내용 추가합니다.

health checker자체는 health checker api로 수정은 가능하네요
일단 등록이 되었다면 api를 통해 port, interval 등을 수정할 수 있을 것 같습니다.

다만 nlb 처음 생성 시 사용할 health checker를 생성할 것인지 기존에 있는 health checker도 선택할 수 있을지 결정이 필요합니다.

  1. 생성하는 경우 원안과 같이 nlb name = health checker name 으로 하고
    nlb 생성 시점에 health checker도 생성. 해당 이름을 set

  2. nlb name과 다른 기존 있는 health checker 사용 시에는 health check id(url) 를 parameter로 넘겨 받아야 함.

@powerkimhub
Copy link
Member Author

@dogfootman

  • 일단, 1안으로 추진 하시면 되겠습니다.
  • 감사합니다.

@powerkimhub
Copy link
Member Author

Create/Delete 중간 오류 발생시

[생성 중간 오류 발생시]

  • 이전에 함수 내에서 생성한 자원 반납 후 현재 오류 반환

[삭제 중간 오류 발생시]

  • 사용자가 필요 없어서 삭제를 요청했던 것이므로, 사용 안할 NLB로 가정하고,
  • 오류 발생시 오류 메시지의 앞쪽에
  • 현재까지 삭제 성공한 자원 목록을 추가 후 오류 메시지 반환
  • 다시 삭제 성공했던 자원을 만들어 주는 것도 방법이겠지만,
    • 현재는 이렇게 만든 자원이 기존 남은 자원과 잘 엮어져서 동작할지 알 수 없으므로
    • 삭제 과정에서 오류가 났음을 사용자에게 전달해서,
    • 현재 NLB가 망가졌음을 사용자에게 알리고,
    • 사용자가 다시 지우거나 또는 다른 방법의 조치 취할 수 있도록 에러 메시지를 통해서 상황을 가이드
  • 오류 메시지 예시
    • (1) XXX deleted
    • (2) YYY deleted
    • (3) ~~~~~ error.... (= CSP 반환 메시지)

@powerkimhub
Copy link
Member Author

powerkimhub commented Jun 10, 2022

@powerkimhub
Copy link
Member Author

[AWS 참고] #683

  • AWS NLB 생성전 중복 이름 체크 로직 추가
  • AWS NLB생성 시 IP및 DNS 설정 요청의 경우 기능 미지원 오류 메시지 추가
    • AWS는 고정 IP들을 NLB가 아닌 개별 AZ(서브넷)별로 설정하기 때문에 IP를 설정할 서브넷 정보가 없어서 IP를 설정할 수 없음
  • AWS NLB의 정보 조회 시 고정IP가 사용된 AZ(서브넷)가 있으면 리턴 정보에 IP 정보들을 추가 함.

[고정 IP및 DNS 참고]

  1. NLB(서브넷)에 고정 IP 설정을 위해 필요한 정보
    • 1개의 고정 IP는 1개의 서브넷에만 할당 가능하며 NLB에 설정하려는 고정 IP별 서브넷 Id, EIP의 할당Id 정보가 필요 함.
    • VPC의 AZ당 1개의 서브넷만 선택 가능
  2. DNS 설정은 Route53을 이용해서 추가해야 함.

@powerkimhub
Copy link
Member Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants