Skip to content

Provider Managed Kubernetes and Driver API

ByoungSeob Kim edited this page Sep 3, 2022 · 36 revisions

PMKS(Provider Managed Kubernetes) and Driver API


- CB-Spider PMKS(Provider Managed Kubernetes) Specification V0.2
- V0.2 : 내부 검토/Driver 개발 용

1. CB-Spider PMKS Overview

  • CB-Spider는 연동 대상 클라우드(CSP)가 제공하는 관리형 K8S(Provider Managed K8S 또는 Managed K8S)를
    • 동일한 인터페이스를 사용하여 제어할 수 있는 PMKS 제어 기능을 제공한다.
  • K8S가 필요한 CB-Spider 사용자(인프라 관리자 또는 서비스 개발자)는 아래 그림과 같이,
    • ① CB-Spider 인터페이스를 활용하여 동일한 방법으로
      • 원하는 대상 클라우드에 K8S 인스턴스 생성을 요청할 수 있다.
    • ② 사용자의 요청은 Spider의 대상 연동 드라이버를 통해서
      • 대상 클라우드의 API를 호출하여 대상 클라우드의 관리형 K8S 인스턴스가 생성된다.
    • ③ 사용자는 생성된 K8S에 대하여 K8S CLI(kubectl) 또는 API 등의 풍부한 K8S 인터페이스를 사용하여
      • 사용자의 워크로드를 배포 및 관리할 수 있다.
      • 또한, LensKubesphere와 같은 K8S IDE에 연동하여 생성된 K8S의 기능을 편리하게 활용할 수도 있다.



[CB-Spider PMKS Overview]


2. CB-Spider PMKS Components


  • 사용자에 의해 생성된 하나의 PMKS 인스턴스는 아래 그림에서 보는 바와 같이 Cluster라고 한다.
  • Cluster는 크게 Control plane, Node Group, Addons 및 Endpoint로 구성된다.



[CB-Spider PMKS Components]


  • 컴포넌트별 세부 내용은 다음과 같다.

    (1) 컨트롤 플레인(Control Plane)

    - 컨트롤 플레인은 Cluster의 전체 동작 및 실행을 관장하는 마스터로서의 역할을 담당하는 컴포넌트들의 모임이며, 
    - 관리형 K8S의 경우에는 컨트롤 플레인의 관리 주체는 CSP의 Cloud 플랫폼(CloudOS)이며,
    - CSP 사용자(=CB-Spider 사용자)는 상태 확인 및 제어를 할 수 없다.
    - 참고로, Control plane은 kube-apiserver, etcd, kube-scheduler 및 kube-controller-manager, Cloud Controller Manager 등으로 구성된다. 
    

    (2) 노드 그룹(Node Group)

    - 하나의 노드 그룹은 동일한 이미지와 규격으로 생성된 VM들로 구성되며, 
    - 하나의 Cluster는 서로 다른 종류의 여러 개의 노드 그룹을 포함할 수 있다. 
    - 이와 같은 이질적인 노드 그룹 구성을 통하여 하나의 Cluster에서 다양한 종류의 워크로드의 실행 설정이 가능하다. 
    - 참고로, Node(=VM)은 컨트롤 프레인과의 협업 및 실제 Pod의 실행 처리 등을 위하여 kubelet, kube-proxy 및 Container runtime 등을 포함한다. 
    

    (3) 에드온(Addons)

    - 에드온은 CNI, DNS 및 Container Resource Monitoring 등으로 
    - Cluster 수준의 기능을 제공하는 컴포넌트다.
    - 다양한 에드온들이 존재하며, 선택적으로 구성하여 활용할 수 있다. 
    

    (4) 엔드포인트(Endpoint)

    - 외부에서 Cluster에 접근할 수 있는 방법 및 정보를 제공한다.
    

3. 드라이버 개발 노트

  • Zonal vs Regional 관련 선택 옵션 제공하는 경우

    • 현재는 Zonal로 설정, Zone 값은 Connection에서 획득 후 적용
  • 최초 Cluster 생성시 default NodeGroup을 동시에 생성 (VPC/Subnet 처럼)

    • 이후 NodeGroup 추가/삭제 가능
    • 사유: NHN와 같이 Cluster만 별도 생성 불가한 경우 존재
  • Version 관련

    • 1.21(AWS), 1.21.6-gke.1500(GCP), v1.23.3(NHN) 등 CSP별로 차이가 있음
    • Driver는 "" 또는 "default"를 수신하면, CSP가 default 버전으로 생성하는 처리 지원하면 default 생성 처리,
      • 제공하지 않는 경우는 현 시점의 대상 CSP Web Console 기준 default 값으로 생성
    • 버전 값을 입력 받으면 -현재: 1.23.3 형식으로 입력 받음, driver에서는 1.23.3 정보에서 유효한 정보를 파싱 후 활용,
      • 그 외 정보는 CSP의 default에 가까운 값으로 설정
  • PMKS는 VPC 의존적이다. 즉, 특정 VPC에 소속되는 관리형 K8S를 생성 및 구성할 수 있다.

  • 사용자는 PMKS 생성 요청 전에 필요한 VPC/Subnet 및 Security Group을 적절하게 생성 하여 인자로 함께 호출함을 가정한다.

    • AWS의 경우 사전에 Role의 생성이 필요하며, 현재는 role 이름을 다음 이름으로 일치 시킨다.(추후 필요시 개선)
      • Cluster: cloud-barista-spider-eks-cluster-role
      • NodeGroup: cloud-barista-spider-eks-nodegroup-role
    • 추가로 사전 생성이 필요한 자원이 있는 CSP는 상단 링크의 이슈에 현황을 공유 부탁드립니다.
  • IP Address Family의 경우 Driver 내부에서 IPv4로 설정한다. (IPv6 필요시 추후 고려)

  • 공통 API에서 제공되지 않는 설정일 경우는 상단 링크의 이슈에 현황을 공유하고,

    • Driver 내에서 기본 값(최신 버전 등 가급적 CSP의 default 값 활용)으로 설정 처리해 주시기 바랍니다. (추후 개선)
    • 예시) AWS에서 kube-proxy version 값 등
  • NodeGroup의 Node(VM) 제공 정보 범위

    • IID 목록만 반환하고, 필요시 사용자가 VMHandler를 활용한 추가 정보 활용
    • 필요시 추후 개선
  • Endpoint 제공 관련: TBD

  • Addons 설정 관련: cni, dns 등 설정 API 존재시 이슈 공유 및 현재는 default 설정, 추후 재고려

  • Upgrade Cluster: 추후 고려

  • PMKS는 주로 공통 API를 이용한 Cluster 관리 중심의 제어 기능을 제공하며,

    • 사용자는 Addon 설치/관리, Workload deploy 및 모니터링이나 Taint, Tag, Label 설정 등과 같은
    • K8S 활용 자체는 K8S kubectl과 K8S 인터페이스 또는 Lens와 같은 Third party 지원 도구를 활용한다.
  • 그 외에 대상 CSP Driver 개발시 부족한 부분이 있으시면 이슈에 공유 부탁 드립니다.


4. PMKS 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
        |-- ClusterHandler.go  <======================= PMKS Driver API
        |-- IId.go
        |-- ImageHandler.go
        |-- KeyPairHandler.go
        |-- KeyValue.go
        |-- NLBHandler.go
        |-- SecurityHandler.go
        |-- VMHandler.go
        |-- VMSpecHandler.go
        `-- VPCHandler.go
    
  • Driver API Spec v0.6.7-patch-1 (latest)

          package resources
    
          import "time"
    
    
          //-------- Const
          type ClusterStatus string
    
          const (
                  ClusterCreating ClusterStatus = "Creating"
                  ClusterActive   ClusterStatus = "Active"
                  ClusterInactive ClusterStatus = "Inactive"
                  ClusterUpdating ClusterStatus = "Updating"
                  ClusterDeleting ClusterStatus = "Deleting"
          )
    
          type NodeGroupStatus string
    
          const (
                  NodeGroupCreating NodeGroupStatus = "Creating"
                  NodeGroupActive   NodeGroupStatus = "Active"
                  NodeGroupInactive NodeGroupStatus = "Inactive"
                  NodeGroupUpdating NodeGroupStatus = "Updating"
                  NodeGroupDeleting NodeGroupStatus = "Deleting"
          )
    
          //-------- Info Structure
          type ClusterInfo struct {
                  IId             IID     // {NameId, SystemId}
    
                  Version         string  // Kubernetes Version, ex) 1.23.3
    
                  Network         NetworkInfo
                  NodeGroupList   []NodeGroupInfo
                  Addons          AddonsInfo
    
    
                  Status          ClusterStatus
    
                  CreatedTime     time.Time
                  KeyValueList []KeyValue
          }
    
          type NetworkInfo struct {
                  VpcIID          IID     // {NameId, SystemId}
                  SubnetIID       []IID
                  SecurityGroupIIDs []IID
    
                  KeyValueList []KeyValue
          }
    
          type NodeGroupInfo struct {
                  IId             IID     // {NameId, SystemId}
    
                  // VM config.
                  ImageIID        IID
                  VMSpecName      string
                  RootDiskType    string  // "SSD(gp2)", "Premium SSD", ...
                  RootDiskSize    string  // "", "default", "50", "1000" (GB)
                  KeyPairIID      IID
    
                  Status          NodeGroupStatus
    
                  // Scaling config.
                  OnAutoScaling	bool // default: true
                  DesiredNodeSize int
                  MinNodeSize     int
                  MaxNodeSize     int
    
    
                  NodeList        []IID
                  KeyValueList []KeyValue
          }
    
          // CNI, DNS, .... @todo
          type AddonsInfo struct {
                  KeyValueList []KeyValue
          }
    
    
          //-------- Cluster API
          type ClusterHandler interface {
    
                  //------ Cluster Management
                  CreateCluster(clusterReqInfo ClusterInfo, nodeReqInfo NodeGroupInfo) (ClusterInfo, error)
                  ListCluster() ([]*ClusterInfo, error)
                  GetCluster(clusterIID IID) (ClusterInfo, error)
                  DeleteCluster(clusterIID IID) (bool, error)
    
                  //------ NodeGroup Management
                  AddNodeGroup(clusterIID IID, nodeGroupReqInfo NodeGroupInfo) (NodeGroupInfo, error)
                  ListNodeGroup(clusterIID IID) ([]*NodeGroupInfo, error)
                  GetNodeGroup(clusterIID IID, nodeGroupIID IID) (NodeGroupInfo, error)
                  ChangeNodeGroupScaling(clusterIID IID, nodeGroupIID IID,
                          DesiredNodeSize int, MinNodeSize int, MaxNodeSize int) (NodeGroupInfo, error)
                  RemoveNodeGroup(clusterIID IID, nodeGroupIID IID) (bool, error)
    
                  //------ Upgrade K8S
                  UpgradeCluster(clusterIID IID, newVersion string) (ClusterInfo, error)
          }

History

- V0.2 => V0.2-Patch-1
  - OnAutoScaling 속성 추가
- V0.1 => V0.2
  - Cluster 생성시 default NodeGroup 동시 생성
  - 독립적이던 NodeGroup 생성 및 관리를 특정 Cluster 하에서 관리
  - NodeGroup Size 관리를 Autoscaling 방법으로만 제공
  - NodeGroupHandler를 ClusterHandler 안으로 통합
  - NodeGroup.Status 추가

Table of contents



Clone this wiki locally