Introduction

A plugin for CloudStack to create, manage Kubernetes cluster through CloudStack management server API and UI. This plugin will not make any changes to CloudStack core architecture or schema. It will be disabled by default and can be enabled using global setting value.

It will provide following features,


Document History

VersionAuhtor/ReviewerDate
1.0Abhishek Kumar24/September/2019

References

Pull request:


Use Cases

Plugin will provide Kubernetes integration with CloudStack enabling user to run containerized services using Kubernetes clusters.


Feature Specification

CloudStack Kubernetes Service plugin will add Kubernetes integration in the CloudStack. Plugin will be disabled by default and admin can control its usage using global setting. It will enable run containerized services using Kubernetes clusters.

CKS will use the CoreOS based template for node VMs for running Kubernetes services. For installation of Kubernetes binaries on cluster nodes, a binaries ISO will be used to achieve faster, offline installation. Root admin will be provided with API and UI to upload/register such ISOs for a particular Kubernetes version. A shell script will be added in the codebase to easily create such ISO for a Kubernetes version.

For deployment and setup Kubernetes on cluster nodes, plugin will use Kubernetes tool, kubeadm. kubeadm is the command line tool for easily provisioning a secure Kubernetes cluster on top of physical or cloud servers or virtual machine. Under the hood, master node(s) of the cluster will start a Kubernetes cluster using kubeadm init command with a custom token and worker nodes will be able to join this Kubernetes cluster using kubeadm join command with the same token. More about kubeadm, https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

To access Kubernetes dashboard securely, plugin will provide access to kube.config file data which would allow using Kubernetes tools such as kubectl to run proxy locally and thereby accessing dashboard. More about kubectl, https://kubernetes.io/docs/reference/kubectl/overview/

User will be able to create a CloudStack Kubernetes cluster using UI or API. Both UI and API will allow listing these clusters, perform lifecycle tasks over them and perform scaling for the number of nodes in a running cluster.

Minimum supported version of Kubernetes for the plugin will be 1.11

Multi-master, HA support will be available for Kubernetes version 1.16 and above.



Implementation

API

Kubernetes version management related

Kubernetes version management related APIs can only be accessed by root admins

Add a Kubernetes version that will be supported by CKS with ISO containing Kubernetes binaries for a specific Kubernetes version

Parameters

===========

name = (string) the name of the Kubernetes supported version. (required)

kubernetesversion = (string) the semantic version of the Kubernetes. (required)

url = (string) the URL to where the ISO is currently being hosted. (required)

zoneid = (uuid) the ID of the zone in which Kubernetes supported version will be available.

isoid = (uuid) the ID of the binaries ISO for Kubernetes supported version.

checksum = (boolean) the checksum value of the binaries ISO.

url = (string) the URL of the binaries ISO for Kubernetes supported version.


Delete a supported Kuberneted version

Parameters

===========

id = (uuid) the ID of the Kubernetes supported version.

deleteiso = (boolean) true if ISO associated with the Kubernetes version to be deleted else false. Default is false.



Kubernetes supported version management related APIs can be accessed by all users


Kubernetes cluster management related APIs can be accessed by all users





Schema

  1. Table for CKS cluster
    kubernetes_cluster:
    id (bigint, auto_increment),
    uuid (varchar, unique),
    name (varchar, unique),
    description (varchar),
    zone_id (bigint),
    service_offering_id (bigint),
    template_id (bigint),
    network_id (bigint),
    node_count (bigint),
    account_id (bigint),
    domain_id (bigint),
    state (enum/string),
    key_pair (varchar),
    cores (bigint),
    memory (bigint),
    endpoint (varchar),
    created (datetime)
    removed  (datetime)


  2. Table for CKS cluster details
    kubernetes_cluster_details:
    id (bigint, auto_increment),
    cluster_id (bigint),
    name (varchar),
    value (varchar)


  3. Table for CKS cluster VM reference
    kubernetes_cluster_vm_ref:
    id (bigint, auto_increment),
    cluster_id (bigint),
    vm_id (bigint)


  4. Table for CKS Kubernetes version
    kubernetes_supported_version:

    id (bigint, auto_increment),

    uuid (varchar, unique),

    name (varchar),

    kubernetes_verion (varchar),

    name (varchar),

    iso_id (bigint),

    zone_id (bigint),

    created (date)

    removed (date)

UI Changes


List of currently created clusters will be show in UI, in ui/plugins/cks.js.

UI will allow user to add, manage supported Kubernetes versions.

UI will allow user to perform lifecycle tasks on the cluster. It will show a tab based interface to provide cluster details, running VM instances, network rules and steps to access Kubernetes dashboard using kubectl tool.


Testing


Marvin tests cases

    CRUD tests:
        Add cluster, list clusters to confirm addition
        Delete cluster, list clusters to confirm deletion
        Scale cluster, list clusters to confirm scaling
    Cluster management tests:
    Start cluster
    Stop cluster
    Get cluster config