-
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-3 (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) (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) SetNodeGroupAutoScaling(clusterIID IID, nodeGroupIID IID, on bool) (bool, 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.1 => V0.2
- Cluster 생성시 default NodeGroup 동시 생성
- 독립적이던 NodeGroup 생성 및 관리를 특정 Cluster 하에서 관리
- NodeGroup Size 관리를 Autoscaling 방법으로만 제공
- NodeGroupHandler를 ClusterHandler 안으로 통합
- NodeGroup.Status 추가
- NodeGroup AutoScaling On/Off 설정 API 추가
-
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]