-
Notifications
You must be signed in to change notification settings - Fork 47
Provider Managed Kubernetes and Driver API
- CB-Spider PMKS(Provider Managed Kubernetes) Specification V0.2
- V0.2 : 내부 검토/Driver 개발 용
- 검토의견: https://github.com/cloud-barista/cb-spider/issues/716
- 분석참고: 추후 필요시 공유
- 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 인터페이스를 사용하여
- 사용자의 워크로드를 배포 및 관리할 수 있다.
- 또한, Lens 및 Kubesphere와 같은 K8S IDE에 연동하여 생성된 K8S의 기능을 편리하게 활용할 수도 있다.
- ① CB-Spider 인터페이스를 활용하여 동일한 방법으로
[CB-Spider PMKS Overview]
- 사용자에 의해 생성된 하나의 PMKS 인스턴스는 아래 그림에서 보는 바와 같이 Cluster라고 한다.
- Cluster는 크게 Control plane, Node Group, Addons 및 Endpoint로 구성된다.
[CB-Spider PMKS Components]
-
컴포넌트별 세부 내용은 다음과 같다.
- 컨트롤 플레인은 Cluster의 전체 동작 및 실행을 관장하는 마스터로서의 역할을 담당하는 컴포넌트들의 모임이며, - 관리형 K8S의 경우에는 컨트롤 플레인의 관리 주체는 CSP의 Cloud 플랫폼(CloudOS)이며, - CSP 사용자(=CB-Spider 사용자)는 상태 확인 및 제어를 할 수 없다. - 참고로, Control plane은 kube-apiserver, etcd, kube-scheduler 및 kube-controller-manager, Cloud Controller Manager 등으로 구성된다.
- 하나의 노드 그룹은 동일한 이미지와 규격으로 생성된 VM들로 구성되며, - 하나의 Cluster는 서로 다른 종류의 여러 개의 노드 그룹을 포함할 수 있다. - 이와 같은 이질적인 노드 그룹 구성을 통하여 하나의 Cluster에서 다양한 종류의 워크로드의 실행 설정이 가능하다. - 참고로, Node(=VM)은 컨트롤 프레인과의 협업 및 실제 Pod의 실행 처리 등을 위하여 kubelet, kube-proxy 및 Container runtime 등을 포함한다.
- 에드온은 CNI, DNS 및 Container Resource Monitoring 등으로 - Cluster 수준의 기능을 제공하는 컴포넌트다. - 다양한 에드온들이 존재하며, 선택적으로 구성하여 활용할 수 있다.
- 외부에서 Cluster에 접근할 수 있는 방법 및 정보를 제공한다.
-
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는 상단 링크의 이슈에 현황을 공유 부탁드립니다.
- AWS의 경우 사전에 Role의 생성이 필요하며, 현재는 role 이름을 다음 이름으로 일치 시킨다.(추후 필요시 개선)
-
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 개발시 부족한 부분이 있으시면 이슈에 공유 부탁 드립니다.
-
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) }
- V0.2 => V0.2-Patch-1
- OnAutoScaling 속성 추가
- V0.1 => V0.2
- Cluster 생성시 default NodeGroup 동시 생성
- 독립적이던 NodeGroup 생성 및 관리를 특정 Cluster 하에서 관리
- NodeGroup Size 관리를 Autoscaling 방법으로만 제공
- NodeGroupHandler를 ClusterHandler 안으로 통합
- NodeGroup.Status 추가
-
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]