Disk and Driver API - cloud-barista/cb-spider GitHub Wiki

Disk(Volume) and Driver API

- CB-Spider Disk Specification V0.3
- V0.3 : CB-Tumblebug 검토/개발 용

1. CB-Spider Disk Overview

  • CB-Spider는 연동 대상 클라우드(CSP)가 제공하는 Disk(또는 Volume)를
    • 동일한 인터페이스를 사용하여 제어할 수 있는 Disk 제어 기능을 제공한다.
  • CB-Spider 사용자는 Disk를 아래 그림과 같이 Root-Disk(R-Disk, 운영체제 포함)와 Data-Disk(D-Disk)로 활용할 수 있다.
    • [1. Root-Disk 활용]

      • (생성/부착) 사용자가 VM 생성 요청시 자동으로 Root-Disk가 생성되며,
        • 생성된 VM에 생성된 Root-Disk가 부착(Attach) 되어 OS 운영에 필요한 시스템 디스크로 활용된다.
        • 하나의 VM은 하나의 Root-Disk를 소유할 수 있다.
      • (해제/삭제) Root-Disk는 VM으로 부터 명시적인 해제(Detach)가 불가능하며,
        • Disk를 소유한 VM 삭제 시에 자동으로 사용 해제(Detach) 되며 VM과 함께 삭제된다.
      • 사용자는 VM 생성 요청 시에 Root-Disk의 Disk Type과 Disk Size를 설정할 수 있다.
    • [2. Data-Disk 활용]

      • (생성) 사용자는 필요 시점에 Data-Disk를 생성할 수 있다.
      • (부착) 사용자는 생성한 Data-Disk를 운영 중인 특정 VM에 부착(Attach)하여 VM에서 활용할 수 있다.
        • 또한, VM 생성시에 존재하는 Data-Disk를 부착할 수 있도록 설정할 수도 있다.
        • 하나의 VM에 여러 개의 Data-Disk 부착이 가능하며, 하나의 Data-Disk는 하나의 VM에만 부착이 가능하다.
      • (해제) 사용자는 VM이 소유 중인 Data-Disk를 명시적으로 해제(Detach) 요청하여 회수할 수 있다.
        • VM 삭제 시에는 대상 VM이 소유 중인 Data-Disk가 자동으로 소유 해제된다.
      • (삭제) 사용자는 더 이상 Data-Disk가 필요 없을 경우 Data-Disk를 삭제할 수 있다.
  • ※ 참고: Format / Mount / UMount

    • VM에 부착된 Data-Disk를 VM에서 파일 저장 목적으로 활용하기 위해서는 파일 시스템 포맷과 마운트 과정이 필요하다.

    • 부착된 Data-Disk 확인 예시

      $ lsblk
      NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
      loop0     7:0    0  44.7M  1 loop /snap/snapd/15534
      loop1     7:1    0  55.5M  1 loop /snap/core18/2344
       ...
      sda       8:0    0    10G  0 disk
      |-sda1    8:1    0   9.9G  0 part /
      |-sda14   8:14   0     4M  0 part
      `-sda15   8:15   0   106M  0 part /boot/efi
      sdc       8:16   0    18G  0 disk                   <=======
      
    • 파일 시스템 포맷 예시

      • disk 속성 확인: 속성이 data일 경우 format 필요
        $ sudo file -s /dev/sdc
        /dev/sdc: data
        
      • format
        $ sudo mkfs -t xfs /dev/sdc
        meta-data=/dev/sdc               isize=512    agcount=4, agsize=1048576 blks
                 =                       sectsz=4096  attr=2, projid32bit=1
                 =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
        data     =                       bsize=4096   blocks=4194304, imaxpct=25
                 =                       sunit=0      swidth=0 blks
        naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
        log      =internal log           bsize=4096   blocks=2560, version=2
                 =                       sectsz=4096  sunit=1 blks, lazy-count=1
        realtime =none                   extsz=4096   blocks=0, rtextents=0
        
    • 마운트 예시

      • disk 속성 확인

        $ sudo file -s /dev/sdc
        /dev/sdc: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
        
      • mount

        $ mkdir data
        $ sudo mount /dev/sdc data
        $ cd data
        $ sudo chown cb-user:cb-user .
        
      • usage

        $ cd ~/data
        $ vi input.dat
        
    • 마운트 해제 예시

      • umount
        $ sudo umount -d /dev/sdc
        

2. CB-Spider Disk 제공 기능

  • Disk 생성
    • Root-Disk는 VM 생성에 의해 자동 생성되며,
    • 사용자는 Data-Disk만 생성 가능하다.
    • Disk 생성 요청시 Disk 타입과 Size(단위:GB)의 설정이 가능하다.
  • Disk 목록
    • Root-Disk, Data-Disk 구분 없이 모든 Disk 목록을 제공한다.
  • Disk 정보
    • 특정 Disk의 타입, Size, 상태 및 소유 VM IID 정보 등을 제공한다.
    • 제공하는 Disk 상태 종류는 다음과 같다.
      • Creating: Disk가 생성 중인 상태
      • Available: Disk가 VM에 부착 되지 않고 사용 가능한 상태
      • Attached: Disk가 VM에 부착되어 특정 VM이 소유 중인 상태
        • Attached 상태일 때는 대상 Disk가 부착된 소유 VM IID 정보가 제공된다.
      • Deleting: Disk가 삭제 중인 상태
  • Disk 변경
    • Disk Size 변경이 가능하며, 기존 보다 큰 크기로만 변경이 가능하다.
    • 참고: AWS의 경우 수정 후에는 6시간이 경과해야 수정 가능하다.
  • Disk 부착
    • Available 상태인 Disk는 특정 VM에서 사용할 수 있도록 부착(Attach)이 가능하다.
    • 부착된 Disk는 VM의 block device로 활용이 가능하며,
    • 파일 시스템을 탑재하여 활용하고자 할 경우 포맷 및 마운트 과정이 필요하다.
    • 하나의 VM에는 여러 개의 Data-Disk 부착이 가능하며, 하나의 Data-Disk는 하나의 VM에만 부착이 가능하다.
  • Disk 해제
    • 특정 VM에 부착된 Disk를 해제(Detach)할 수 있다.
    • 해제된 Disk는 다른 VM에 부착하여 활용할 수 있다.
  • Disk 삭제
    • 사용하지 않는 Disk를 삭제할 수 있다.

3. 드라이버 개발 노트

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

    • 현재는 Zonal로 설정, Zone 값은 Connection에서 획득 후 적용
  • IOPS 정보 등 CSP별로 제공하는 유용한 반환 정보는

    • 현재는 KeyValueList에 추가하여 반환해주시기 바랍니다.
    • 부가 정보로 제공하기 위함뿐만 아니라
    • 모든 CSP가 공통으로 제공하는 정보라면 향후 제공 정보로 확장하기 위함입니다.
  • Data-Disk Disk Type 및 Size 설정 및 처리 관련

    • Root-Disk Type 처리 방법과 유사한 방법으로 처리
      • ./cloud-driver-libs/cloudos_meta.yaml:disktype
      • ./cloud-driver-libs/cloudos_meta.yaml:disksize
  • Default disk type 및 size 처리 관련

    • CB-Tumblebug과 같이 Code 수준에서 CSP별로 제공하는 Disk type을 구분해가면서 Disk 생성 요청하기는 어려움이 있습니다.
    • 또한, Test 등을 위해서 Type이나 size를 고민하지 않고 빠른 Disk 생성이 필요한 경우가 있습니다.
    • 이러한 요구를 위해서 default type 및 size를 제공합니다.
    • 사용자 REST API는 'default'와 ""(빈문자열)을 다 제공하지만,
      • Driver로 내려 보내지는 값은 빈문자열만 내려갑니다.
    • default type 및 size의 선정 다음 순서로 고려해주시기 바랍니다.
        (1) CSP API가 default type 및 Size 개념을 제공할 경우 이를 활용
        (2) CSP Console에서 사용자에게 기본 설정 값으로 제공하는 값을 활용
        (3) Reference할 default Type이 없는 경우 Root-Disk의 default type을 활용
        (4) Reference할 Size 값이 없는 경우 50GB로 설정
      
  • 꼭 필요해 보이는데 공통 API에서 제공되지 않는 설정일 경우는 상단 링크의 이슈에 현황을 공유 부탁드립니다.

  • 그 외에 대상 CSP Driver 개발시 부족한 부분이 있으시면 상단 링크의 이슈에 공유 부탁드립니다.

4. Disk 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
        |-- DiskHandler.go  <======================= Disk Driver API
        |-- IId.go
        |-- ImageHandler.go
        |-- KeyPairHandler.go
        |-- KeyValue.go
        |-- NLBHandler.go
        |-- SecurityHandler.go
        |-- VMHandler.go
        |-- VMSpecHandler.go
        `-- VPCHandler.go
    
  • Disk Driver API Spec v0.6.6 (latest)

          package resources
    
          import "time"
    
    
          //-------- Const
          type DiskStatus string
    
          const (
                  DiskCreating    DiskStatus = "Creating"
                  DiskAvailable   DiskStatus = "Available"
                  DiskAttached    DiskStatus = "Attached"
                  DiskDeleting    DiskStatus = "Deleting"
                  DiskError       DiskStatus = "Error"
          )
    
          //-------- Info Structure
          type DiskInfo struct {
                  IId     IID     // {NameId, SystemId}
    
                  DiskType string  // "", "SSD(gp2)", "Premium SSD", ...
                  DiskSize string  // "", "default", "50", "1000"  # (GB)
    
                  Status          DiskStatus      // DiskCreating | DiskAvailable | DiskAttached | DiskDeleting | DiskError
                  OwnerVM         IID             // When the Status is DiskAttached
    
                  CreatedTime     time.Time
                  KeyValueList []KeyValue
          }
    
    
          //-------- Disk API
          type DiskHandler interface {
    
                  //------ Disk Management
                  CreateDisk(DiskReqInfo DiskInfo) (DiskInfo, error)
                  ListDisk() ([]*DiskInfo, error)
                  GetDisk(diskIID IID) (DiskInfo, error)
                  ChangeDiskSize(diskIID IID, size string) (bool, error)
                  DeleteDisk(diskIID IID) (bool, error)
    
    
                  //------ Disk Attachment
                  AttachDisk(diskIID IID, ownerVM IID) (DiskInfo, error)
                  DetachDisk(diskIID IID, ownerVM IID) (bool, error)
          }
    
  • Disk 관련 VMHandler API 변경: 모든 Driver 반영 필요

    • Data-Disk 부착(Attach) 제공을 위한 속성 추가

    • 변경 내용

      type VMReqInfo struct {
          IId IID // {NameId, SystemId}
      
          ...
      
          RootDiskType string  // "", "SSD(gp2)", "Premium SSD", ...
          RootDiskSize string  // "", "default", "50", "1000" (GB)
      
          DataDiskIIDs []IID  <======================= 추가: Attach할 Disk list
      
          VMUserId     string
          VMUserPasswd string
      }
      
      type VMInfo struct {
          IId       IID       // {NameId, SystemId}
          StartTime time.Time // Timezone: based on cloud-barista server location.
      
          ...
      
          RootDiskType    string  // "SSD(gp2)", "Premium SSD", ...
          RootDiskSize    string  // "default", "50", "1000" (GB)
          RootDeviceName  string // "/dev/sda1", ...
      
          DataDiskIIDs []IID  <======================= 추가: Attach된 Disk list
      
          VMBootDisk      string // Deprecated soon  <======================= 삭제 예정
          VMBlockDisk     string // Deprecated soon  <======================= 삭제 예정
      
          ...
      }
      

5. CB-Spider Disk REST API 규격


History

- V0.2 => V0.3
  - Add REST API
- V0.1 => V0.2
  - Add DiskError Status