This the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Micro Service Deployment

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
    

    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 DirectoryDescription
    Chart.yamlInformation of this Helm chart
    values.yamlDefault 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.

    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.