This the multi-page printable view of this section. Click here to print.
Architecture
1 - Micro Service Framework
Cloudforet Architecture
The Cloudforet consists of a micro service architecture based on identity and inventory. Each micro services provides a plugin interface for flexibility of implementation.
Cloudforet Backend Software Framework
The Cloudforet development team has created our own S/W framework like Python Django or Java Spring. Cloudforet S/W Framework provides software framework for implementing business logic. Each business logic can present its services in various way like gRPC interface, REST interface or periodic task.
Layer | Descrption | Base Class | Implementation Directory | |
---|---|---|---|---|
Interface | Entry point of Service request | core/api.py | project/interface/interface type/ | |
Handler | Pre, Post processing before Service call | |||
Service | Business logic of service | core/service.py | project/service/ | |
Cache | Caching for manager function(optional) | core/cache/ | ||
Manager | Unit operation for each service function | core/manager.py | project/manager/ | |
Connector | Interface for Data Source(ex. DB, Other micro services) |
Backend Server Type
Based on Interface type, each micro service works as
Interface type | Description |
---|---|
gRPC server | gRPC based API server which is receiving requests from console or spacectl client |
rest server | HTTP based API server, usually receiving requests from external client like grafana |
scheduler server | Periodic task creation server, for example collecting inventory resources at every hour |
worker server | Periodic task execution server which requests came from scheduler server |
2 - Micro Service Deployment
Cloudforet Deployment
The Cloudforet can be deployed by Helm chart. Each micro services has its own Helm chart, and the top chart, spaceone/spaceone contains all sub charts like console, identity, inventory and plugin.
Cloudforet provides own Helm chart repository. The repository URL is https://cloudforet-io.github.io/charts
helm repo add spaceone https://cloudforet-io.github.io/charts
helm repo list
helm repo update
helm search repo -r spaceone
NAME CHART VERSION APP VERSION DESCRIPTION
spaceone/spaceone 1.8.6 1.8.6 A Helm chart for Cloudforet
spaceone/spaceone-initializer 1.2.8 1.x.y Cloudforet domain initializer Helm chart for Kube...
spaceone/billing 1.3.6 1.x.y Cloudforet billing Helm chart for Kubernetes
spaceone/billing-v2 1.3.6 1.x.y Cloudforet billing v2 Helm chart for Kubernetes
spaceone/config 1.3.6 1.x.y Cloudforet config Helm chart for Kubernetes
spaceone/console 1.2.5 1.x.y Cloudforet console Helm chart for Kubernetes
spaceone/console-api 1.1.8 1.x.y Cloudforet console-api Helm chart for Kubernetes
spaceone/cost-analysis 1.3.7 1.x.y Cloudforet Cost Analysis Helm chart for Kubernetes
spaceone/cost-saving 1.3.6 1.x.y Cloudforet cost_saving Helm chart for Kubernetes
spaceone/docs 2.0.0 1.0.0 Cloudforet Open-Source Project Site Helm chart fo...
spaceone/identity 1.3.7 1.x.y Cloudforet identity Helm chart for Kubernetes
spaceone/inventory 1.3.7 1.x.y Cloudforet inventory Helm chart for Kubernetes
spaceone/marketplace-assets 1.1.3 1.x.y Cloudforet marketplace-assets Helm chart for Kube...
spaceone/monitoring 1.3.15 1.x.y Cloudforet monitoring Helm chart for Kubernetes
spaceone/notification 1.3.8 1.x.y Cloudforet notification Helm chart for Kubernetes
spaceone/plugin 1.3.6 1.x.y Cloudforet plugin Helm chart for Kubernetes
spaceone/power-scheduler 1.3.6 1.x.y Cloudforet power_scheduler Helm chart for Kubernetes
spaceone/project-site 1.0.0 0.1.0 Cloudforet Open-Source Project Site Helm chart fo...
spaceone/repository 1.3.6 1.x.y Cloudforet repository Helm chart for Kubernetes
spaceone/secret 1.3.9 1.x.y Cloudforet secret Helm chart for Kubernetes
spaceone/spot-automation 1.3.6 1.x.y Cloudforet spot_automation Helm chart for Kubernetes
spaceone/spot-automation-proxy 1.0.0 1.x.y Cloudforet Spot Automation Proxy Helm chart for K...
spaceone/statistics 1.3.6 1.x.y Cloudforet statistics Helm chart for Kubernetes
spaceone/supervisor 1.1.4 1.x.y Cloudforet supervisor Helm chart for Kubernetes
Installation
Cloudforet can be easily deployed by single Helm chart with spaceone/spaceone.
See https://cloudforet.io/docs/setup_operation/
Helm Chart Code
Each repository should provide its own helm chart.
The code should be at {repository}/deploy/helm
Every Helm charts consists of four components.
File or Directory | Description |
---|---|
Chart.yaml | Information of this Helm chart |
values.yaml | Default vaule of this Helm chart |
config (directory) | Default configuration of this micro service |
templates (directory) | Helm template files |
The directory looks like
deploy
└── helm
├── Chart.yaml
├── config
│ └── config.yaml
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── application-grpc-conf.yaml
│ ├── application-rest-conf.yaml
│ ├── application-scheduler-conf.yaml
│ ├── application-worker-conf.yaml
│ ├── database-conf.yaml
│ ├── default-conf.yaml
│ ├── deployment-grpc.yaml
│ ├── deployment-rest.yaml
│ ├── deployment-scheduler.yaml
│ ├── deployment-worker.yaml
│ ├── ingress-rest.yaml
│ ├── rest-nginx-conf.yaml
│ ├── rest-nginx-proxy-conf.yaml
│ ├── service-grpc.yaml
│ ├── service-rest.yaml
│ └── shared-conf.yaml
└── values.yaml
3 directories, 21 files
Based on micro service types like frontend, backend, or supervisor, the contents of templates directory is different.
Template Samples
Since every backend services has same templates files, spaceone provides sample of templates directory.
Template Sample URL:
https://github.com/cloudforet-io/spaceone/tree/master/helm_templates
Implementation
values.yaml
values.yaml file defines default vault of templates.
Basic information
###############################
# DEFAULT
###############################
enabled: true
developer: false
grpc: true
scheduler: false
worker: false
rest: false
name: identity
image:
name: spaceone/identity
version: latest
imagePullPolicy: IfNotPresent
database: {}
- enabled: true | false defines deploy this helm chart or not
- developer: true | false for developer mode (recommendation: false)
- grpc: true if you want to deploy gRPC server
- rest: true if you want to deploy rest server
- scheduler: true if you want to deploy scheduler server
- worker: true if you want to deploy worker server
- name: micro service name
- image: docker image and version for this micro service
- imagePullPolicy: IfNotPresent | Always
- database: if you want to overwrite default database configuration
Application Configuration
Each server type like gRPC, rest, scheduler or worker server has its own specific configuration.
application_grpc: {}
application_rest: {}
application_scheduler: {}
application_worker: {}
This section is used at templates/application-{server type}-conf.yaml, then saved as ConfigMap.
Deployment file uses this ConfigMap at volumes,
then volumeMount as /opt/spaceone/{ service name }/config/application.yaml
For example, inventory scheduler server needs QUEUES and SCHEDULERS configuration.
So you can easily configure by adding configuration at application_scheduler like
application_scheduler:
QUEUES:
collector_q:
backend: spaceone.core.queue.redis_queue.RedisQueue
host: redis
port: 6379
channel: collector
SCHEDULERS:
hourly_scheduler:
backend: spaceone.inventory.scheduler.inventory_scheduler.InventoryHourlyScheduler
queue: collector_q
interval: 1
minute: ':00'
Local sidecar
If you want to append specific sidecar in this micro service.
# local sidecar
##########################
#sidecar:
Local volumes
Every micro service needs default timezone and log directory.
##########################
# Local volumes
##########################
volumes:
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Seoul
- name: log-volume
emptyDir: {}
Global variables
Every micro services need some part of same configuration or same sidecar.
#######################
# global variable
#######################
global:
shared: {}
sidecar: []
Service
gRPC or rest server needs Service
# Service
service:
grpc:
type: ClusterIP
annotations:
nil: nil
ports:
- name: grpc
port: 50051
targetPort: 50051
protocol: TCP
rest:
type: ClusterIP
annotations:
nil: nil
ports:
- name: rest
port: 80
targetPort: 80
protocol: TCP
volumeMounts
Some micro service may need additional file or configuration. In this case use volumeMounts which can attach any thing.
################################
# volumeMount per deployment
################################
volumeMounts:
application_grpc: []
application_rest: []
application_scheduler: []
application_worker: []
POD Spec
We can configure specific value for POD spec. For example, we can use nodeSelector for deploy POD at specific K8S worker node.
####################################
# pod spec (append more pod spec)
# example nodeSelect
#
# pod:
# spec:
# nodeSelector:
# application: my-node-group
####################################
pod:
spec: {}
CI (github action)
If you want to make helm chart for this micro service, trigger at github action Make Helm Chart.
Make Helm Chart
We don't need to make helm chart for each micro service usually,
since spaceone/spaceone top chart do all these steps.