Cluster Layouts

Morpheus includes many different types of Cluster Layouts out-of-the-box which support a number of provisioning technologies. Many of these Morpheus-provided Cluster Layouts may also be cloned for use in creating custom layouts. Edit or delete user-created Cluster Layouts using the pencil (✎) or trash can (🗑) icons next to the desired layout on the Cluster Layouts list page. See the next section for an

../../_images/clusterLayouts.png

Note

Morpheus now syncs available (non-preview) AKS k8s versions daily. Existing synced versions that are no longer supported by Azure are automatically disabled. The table below includes available AKS versions at time of v7.0.1 release.

  • List of Default System Cluster Layouts

    NAME

    CODE

    DESCRIPTION

    Kubernetes 1.20.7 Cluster AKS

    kubernetes-azure-aks-1.20.7

    This provisions a single kubernetes master in Azure

    Kubernetes 1.20.5 Cluster AKS

    kubernetes-azure-aks-1.20.5

    This provisions a single kubernetes master in Azure

    Kubernetes 1.19.11 Cluster AKS

    kubernetes-azure-aks-1.19.11

    This provisions a single kubernetes master in Azure

    Kubernetes 1.19.9 Cluster AKS

    kubernetes-azure-aks-1.19.9

    This provisions a single kubernetes master in Azure

    Kubernetes 1.18.19 Cluster AKS

    kubernetes-azure-aks-1.18.19

    This provisions a single kubernetes master in Azure

    Kubernetes 1.18.17 Cluster AKS

    kubernetes-azure-aks-1.18.17

    This provisions a single kubernetes master in Azure

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-xen-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in xen

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-scvmm-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in scvmm

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-opentelekom-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in opentelekom

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-nutanix-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-morpheus-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in manual

    External Kubernetes 1.20

    kubernetes-external-1.20

    Connect to an external kubernetes cluster.

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-hyperv-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in hyperv

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-huawei-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in Huawei

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-openstack-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in Openstack

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-google-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-amazon-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04

    Copy of MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    ffc21dc1-feb7-4c02-ae90-204fd080c23d

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in vmware

    Docker Cluster on Ubuntu 18.04

    docker-ubuntu-18.04.2-fusion-amd64-single

    provision a docker cluster on ubuntu 18.04 in fusion

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-vmware-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in vmware

    MKS Kubernetes 1.20 Cluster on Ubuntu 18.04

    kubernetes-1.20.2-ubuntu-18.04.5-fusion-amd64-single

    provision a kubernetes 1.20 cluster on ubuntu 18.04 in fusion

    Kubernetes 1.17 Cluster EKS

    kubernetes-amazon-eks-1.17

    This will provision a single kubernetes master in amazon with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-1.17-xen-ubuntu-16.04-cluster-weave-openebs

    This will provision a single kubernetes master in xen with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-xen-1.17-ubuntu-16.04-single

    This will provision a single kubernetes master in xen with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-scvmm-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in scvmm with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-scvmm-ubuntu-18.04-single

    This will provision a single kubernetes master in scvmm with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-openstack-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in openstack with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-openstack-ubuntu-18.04-single

    This will provision a single kubernetes master in openstack with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-opentelekom-ubuntu-18.04-single

    This will provision a single kubernetes master in opentelekom with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-nutanix-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in nutanix with weave and openebs

    Kubernetes 1.17 HA Cluster on Linux, Weave, OpenEBS

    kubernetes-1.17-morpheus-linux-cluster-weave-openebs

    This will provision a kubernetes cluster with weave and openebs

    Kubernetes 1.17 Cluster on Linux, Weave, OpenEBS

    kubernetes-1.17-morpheus-linux-single

    This will provision a single kubernetes master with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-hyperv-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in hyperv with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-hyperv-ubuntu-18.04-single

    This will provision a single kubernetes master in hyperv with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-huawei-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in huawei with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-huawei-ubuntu-18.04-single

    This will provision a single kubernetes master in huawei with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-google-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in google with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-google-ubuntu-18.04-single

    This will provision a single kubernetes master in google with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-esxi-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in esxi with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-esxi-ubuntu-18.04-single

    This will provision a single kubernetes master in esxi with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-digitalOcean-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in digitalOcean with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-digitalOcean-ubuntu-18.04-single

    This will provision a single kubernetes master in digitalOcean with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-azure-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in azure with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-azure-ubuntu-18.04-single

    This will provision a single kubernetes master in azure with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-amazon-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in amazon with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-amazon-ubuntu-18.04-single

    This will provision a single kubernetes master in amazon with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-alibaba-ubuntu-18.04-single

    This will provision a single kubernetes master in alibaba with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-vmware-ubuntu-18.04-cluster-weave-openebs

    This will provision a single kubernetes master in vmware with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-vmware-ubuntu-18.04-single

    This will provision a single kubernetes master in vmware with weave and openebs

    Copy of Kubernetes 1.14 Cluster on Ubuntu 16.04, Weave, OpenEBS

    6441b891-a61d-4f0b-a7ff-19c81d2ffd51

    This will provision a single kubernetes master in vmware with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-1.17-fusion-ubuntu-18.04-single

    This will provision a single kubernetes master in fusion with weave and openebs

    Kubernetes 1.16 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-1.16-fusion-ubuntu-18.04-single

    This will provision a single kubernetes master in fusion with weave and openebs

    Kubernetes 1.15 Cluster on Ubuntu 18.04, Weave, OpenEBS

    kubernetes-1.15-fusion-ubuntu-18.04-single

    This will provision a single kubernetes master in fusion with weave and openebs

    External Kubernetes 1.17 Cluster

    kubernetes-external-1.17

    This will allow access to an external kubernetes cluster

    External Kubernetes 1.16 Cluster

    kubernetes-external-1.16

    This will allow access to an external kubernetes cluster

    External Kubernetes 1.15 Cluster

    kubernetes-external-1.15

    This will allow access to an external kubernetes cluster

    External Kubernetes 1.14 Cluster

    kubernetes-external-1.14

    This will allow access to an external kubernetes cluster

    KVM on Ubuntu 16.04

    kvm-vmware-ubuntu-16.04-single

    This will provision a single kvm host vm in vmware

    Morpheus KVM and Container Cluster

    morpheus-kvm-combo-cluster

    This will add a KVM and container host

    VMware Docker CentOS 7.5

    docker-vmware-centos-7.5-single

    This will provision a single docker host vm in vmware

    Oracle Cloud Docker Host

    docker-oraclecloud-ubuntu-16.04-single

    This will provision a single docker host vm in oraclecloud

    Morpheus Kubernetes Manual Cluster

    morpheus-kubernetes-manual-cluster

    This will create a kubernetes manual (self-managed) cluster

    Alibaba Docker Host

    docker-alibaba-ubuntu-16.04-single

    This will provision a single docker host vm in alibaba

    SCVMM Docker Host

    docker-scvmm-ubuntu-16.04-single

    This will provision a single docker host vm in scvmm

    KVM on Ubuntu 16.04

    kvm-fusion-ubuntu-16.04-single

    This will provision a single kvm host vm in fusion

    UpCloud Docker Host

    docker-upcloud-ubuntu-16.04-single

    This will provision a single docker host vm in upcloud

    Morpheus KVM Ubuntu Cluster

    morpheus-kvm-ubuntu-cluster

    This will add a KVM Ubuntu host

    Morpheus KVM CentOS Cluster

    morpheus-kvm-centos-cluster

    This will add a KVM CentOS host

    Azure Docker Host

    docker-azure-ubuntu-16.04-single

    This will provision a single docker host vm in azure

    KVM on CentOS 7.5

    kvm-vmware-centos-7.5-single

    This will provision a single kvm host vm in vmware

    KVM on CentOS 7.5

    kvm-fusion-centos-7.5-single

    This will provision a single kvm host vm in fusion

    Kubernetes 1.14 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-bluemix-ubuntu-16.04-cluster-weave-openebs

    This will provision a single kubernetes master in bluemix with weave and openebs

    Kubernetes 1.14 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-bluemix-ubuntu-16.04-single

    This will provision a single kubernetes master in bluemix with weave and openebs

    Kubernetes 1.17 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-vcd-ubuntu-16.04-cluster-weave-openebs

    This will provision a single kubernetes master in vcd with weave and openebs

    Kubernetes 1.17 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-vcd-ubuntu-16.04-single

    This will provision a single kubernetes master in vcd with weave and openebs

    VCD Docker Host

    docker-vcd-ubuntu-16.04-single

    This will provision a single docker host vm in vcd

    Kubernetes 1.14 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-softlayer-ubuntu-16.04-cluster-weave-openebs

    This will provision a single kubernetes master in softlayer with weave and openebs

    Kubernetes 1.14 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-softlayer-ubuntu-16.04-single

    This will provision a single kubernetes master in softlayer with weave and openebs

    SoftLayer Docker Host

    docker-softlayer-ubuntu-16.04-single

    This will provision a single docker host vm in softlayer

    Open Telekom Docker Host

    docker-opentelekom-ubuntu-16.04-single

    This will provision a single docker host vm in opentelekom

    Huawei Docker Host

    docker-huawei-ubuntu-16.04-single

    This will provision a single docker host vm in huawei

    Google Docker Host

    docker-google-ubuntu-16.04-single

    This will provision a single docker host vm in google

    ESXi Docker Host

    docker-esxi-ubuntu-16.04-single

    This will provision a single docker host vm in esxi

    IBM Docker Host

    docker-bluemix-ubuntu-16.04-single

    This will provision a single docker host vm in bluemix

    Xen Docker Host

    docker-xen-ubuntu-16.04-single

    This will provision a single docker host vm in xen

    Digital Ocean Docker Host

    docker-digitalOcean-ubuntu-16.04-single

    This will provision a single docker host vm in digitalOcean

    Hyper-V Docker Host

    docker-hyperv-ubuntu-16.04-single

    This will provision a single docker host vm in hyperv

    Docker on Linux

    manual-linux-docker-morpheus-single

    This will add a single docker host

    Kubernetes Cluster 1.14 on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-morpheus-ubuntu-16.04-cluster-weave-openebs

    This will provision a kubernetes cluster with weave and openebs

    Kubernetes 1.14 on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-morpheus-ubuntu-16.04-single

    This will provision a single kubernetes master with weave and openebs

    Docker on Bare Metal

    docker-morpheus-metal-ubuntu-16.04-single

    This will provision a single docker host

    Docker on Ubuntu 16.04

    docker-morpheus-ubuntu-16.04-single

    This will provision a single docker host

    Amazon Docker Host

    docker-amazon-ubuntu-16.04-single

    This will provision a single docker host vm in amazon

    OpenStack Docker Host

    docker-openstack-ubuntu-16.04-single

    This will provision a single docker host vm in openstack

    Nutanix Docker Ubuntu 16.04

    docker-nutanix-ubuntu-16.04-single

    This will provision a single docker host vm in nutanix

    VMware Docker Ubuntu 16.04

    docker-vmware-ubuntu-16.04-single

    This will provision a single docker host vm in vmware

    Kubernetes 1.14 HA Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-fusion-ubuntu-16.04-cluster-weave-openebs

    This will provision a single kubernetes master in fusion with weave and openebs

    Kubernetes 1.14 Cluster on Ubuntu 16.04, Weave, OpenEBS

    kubernetes-fusion-ubuntu-16.04-single

    This will provision a single kubernetes master in fusion with weave and openebs

    Docker on Ubuntu 16.04

    docker-fusion-ubuntu-16.04-single

    This will provision a single docker host vm in fusion

Creating Custom Cluster Layouts

Custer Layouts can be built for an infinite number of use cases and targeting a wide range of configurations or provisioning technologies. However, it still may help to see an example Cluster Layout created. In this section, we’ll create an example Cluster Layout which provisions a Kubernetes Cluster to a VMware vCenter Cloud containing a master node and three worker nodes. We’ll build out two Node Types to embed in the Cluster, one master and one worker. Within the Node Types, we will embed Script Templates needed to configure the nodes as they are provisioned and allow the workers to join the cluster. Script Templates can be configured to execute at various phases of the lifecycle of the node, similar to a Provisioning Workflow, so Morpheus can orchestrate the whole process.

Creating Script Templates

We’ll first start by creating the necessary Script Templates. In this example, I’ll use a generic prep script that both the master and worker nodes will utilize and then I’ll create three additional scripts (two for the master node and one for the worker nodes) to accomplish various Kubernetes cluster setup tasks (kubeadm init, creating Role Bindings, joining workers to the cluster, etc.). I’ll briefly describe each here and step through the process of creating the Script Template objects in Morpheus.

To begin a new Script Template, navigate to Library > Templates > Script Templates and click + ADD. All of the scripts used in this example will be “Bash” type, run as user “root” and with SUDO marked.

The first script to add will be a prep script that both the master and worker nodes will use. This script turns swap off, installs containerd, runs updates, sets network config, and installs kubelet, kubeadm, and kubectl. Set this script to run in the PreProvision phase. The complete script, named “k8sprep” in my example can be viewed below:

  • k8sprep Script Template

    function wait_for_dpkg() {
      FRONT_END_LOCK_FILE=/var/lib/dpkg/lock-frontend
      DPKG_LOCK_FILE=/var/lib/apt/lists/lock
    
      echo "checking for dpkq lock existence..."
      if [ -e "$DPKG_LOCK_FILE" ]; then
        while fuser $DPKG_LOCK_FILE >/dev/null 2>&1 ; do
          echo "Waiting for lock $DPKG_LOCK_FILE..."
          sleep 1
        done
      fi
      echo "checking for dpkq lock-frontend existence..."
      if [ -e "$FRONT_END_LOCK_FILE" ]; then
        while fuser $FRONT_END_LOCK_FILE >/dev/null 2>&1 ; do
          echo "Waiting for lock $FRONT_END_LOCK_FILE..."
          sleep 1
        done
        echo "force removing lock $FRONT_END_LOCK_FILE"
        sudo rm $FRONT_END_LOCK_FILE
        sleep 5
      fi
    }
      # Swap must be turned off see https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
    sudo swapoff -a ; sudo sed -i '/ swap / s/^/#/' /etc/fstab
      # Install containerd packages from Debian sse: https://docs.docker.com/engine/install/ubuntu/
    wait_for_dpkg
    sudo apt-get update
    sudo apt-get install ca-certificates curl gnupg lsb-release -y
    sudo mkdir -m 0755 -p /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo mkdir -m 0755 -p /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgsudo
    echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
      # the Docker documentation advises to install the whole Docker runtime environment but containerd.io is sufficient
    sudo apt-get install containerd.io -y
      # Prepare the necessary network config see: https://kubernetes.io/docs/setup/production-environment/container-runtimes/
    sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
    sudo modprobe overlay
    sudo modprobe br_netfilter
    sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
      # Apply sysctl params without reboot
    sudo sysctl --system
      # Install kubeadm follwing the K8s documentation: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
    sudo apt-get install -y apt-transport-https ca-certificates curl
    sudo curl -fsSL  https://packages.cloud.google.com/apt/doc/apt-key.gpg|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/k8s.gpg
    sudo echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    sudo apt-get -y install -y kubelet=1.26.1-00 kubeadm=1.26.1-00 kubectl=1.26.1-00
    
    sudo apt-mark hold kubelet kubeadm kubectl
      # see https://github.com/etcd-io/etcd/issues/13670
    cat << EOF | sudo tee /etc/containerd/config.toml
    version = 2
      [plugins]
      [plugins."io.containerd.grpc.v1.cri"]
       [plugins."io.containerd.grpc.v1.cri".containerd]
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
            [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
              runtime_type = "io.containerd.runc.v2"
              [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
                SystemdCgroup = true
    EOF
    sudo systemctl restart containerd
    

Next we’ll add a script called “kubeadm-init” in this example which will create and configure some working directories, set the kubeadm config yaml, and run kubeadm init. Set this script to run in the PreProvision phase as well. The complete script can be viewed below:

  • kubeadm-init Script Template

    mkdir -p <%=morpheus.morpheusHome%>/kube
    mkdir -p <%=morpheus.morpheusHome%>/kube/working
    mkdir -p <%=morpheus.morpheusHome%>/.kube
    sudo chown <%=morpheus.morpheusUser%>:<%=morpheus.morpheusUser%> <%=morpheus.morpheusHome%>/kube
    sudo chown <%=morpheus.morpheusUser%>:<%=morpheus.morpheusUser%> <%=morpheus.morpheusHome%>/kube/working
    cat <<EOF | sudo tee <%=morpheus.morpheusHome%>/kube/working/kubeadm-config.yaml
    # kubeadm-config.yaml
    kind: ClusterConfiguration
    apiVersion: kubeadm.k8s.io/v1beta3
    kubernetesVersion: v1.26.1
    networking:
      serviceSubnet: "10.96.0.0/16"
      podSubnet: "10.244.0.0/24"
      dnsDomain: "cluster.local"
    apiServer:
      extraArgs:
        authorization-mode: "Node,RBAC"
    clusterName: "example-cluster"
    ---
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    cgroupDriver: systemd
    EOF
    sudo kubeadm init --config <%=morpheus.morpheusHome%>/kube/working/kubeadm-config.yaml
    sudo cp -i /etc/kubernetes/admin.conf <%=morpheus.morpheusHome%>/.kube/config &&
    sudo chown <%=morpheus.morpheusUser%>:<%=morpheus.morpheusUser%> <%=morpheus.morpheusHome%>/.kube/config
    

Lastly, we’ll add a setup script for the Kubernetes master node called “k8s-master-setup” for this example. This script creates the service account and role bindings. Set this script to run in the PostProvision phase and view the complete script below:

  • k8s-master-setup Script Template

    #create a service account
    cd <%=morpheus.morpheusHome%>
    #kubectl -n kube-system create sa morpheus
    kubectl create sa morpheus
    cat <<EOF | tee <%=morpheus.morpheusHome%>/kube/morpheus-sa.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: morpheus-token
      annotations:
        kubernetes.io/service-account.name: morpheus
    type: kubernetes.io/service-account-token
    EOF
    kubectl create clusterrolebinding serviceaccounts-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts
    kubectl create -f <%=morpheus.morpheusHome%>/kube/morpheus-sa.yaml
    kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
    

The three scripts we’ve just created will prepare the master node for our cluster. We now need an additional script that will prepare the worker nodes and join them to the cluster. The worker nodes will also use the “k8s-prep” script we added in the very first step which you’ll see in the next step when we create the node types.

Add a fourth script which I’ve called “k8s-join” for this example. This script takes advantage of a special joinCommand variable as you’ll see when you view the full script. If you want to see exactly what this does later, you can create a new Bash script Task that echoes out that variable and run it against an existing Kubernetes worker node VM (echo "<%=morpheus.kubernetes.joinCommand%>"). Set this script to run in the PostProvision phase and view the full script below:

  • k8s-join Script Template

    sudo <%=morpheus.kubernetes.joinCommand%>
    

This completes the needed Script Templates which we will set on two new Node Types in the next step. Continue on to the next section.

Creating Node Types

With the Script Templates created we now need to make two new Node Types, one for the master node and one for the worker nodes. In this example case, we don’t need to add a new Virtual Image because we can use one of the preinstalled system images for Ubuntu on VMware vCenter which will work fine. Node Types are created in Library > Blueprints > Node Types. Once there, click + ADD. Within the modal for the new Node Type, configure the following:

  • NAME: Provide a name for the Node Type, can be anything to denote this is the master node

  • SHORT NAME: A shortened version of the name without any spaces

  • VERSION: The version number you wish to apply for this particular Node Type which is useful if you iterate on your Node Types at any point

  • TECHNOLOGY: For this example case, VMware. Once set, additional options will appear

  • VM IMAGE: A pre-installed Ubuntu system image will work

  • SCRIPTS: Using the typeahead field, set the “k8sprep”, “kubeadm-init” and “k8s-master-setup” Script Templates (you may have called them something different)

Finally, click SAVE CHANGES.

Repeat the process to create a second Node Type. The second time around, use the following configurations:

  • NAME: Provide a name for the Node Type, can be anything to denote this is the worker node

  • SHORT NAME: A shortened version of the name without any spaces

  • VERSION: The version number you wish to apply for this particular Node Type which is useful if you iterate on your Node Types at any point

  • TECHNOLOGY: For this example case, VMware. Once set, additional options will appear

  • VM IMAGE: A pre-installed Ubuntu system image will work

  • SCRIPTS: Using the typeahead field, set the “k8sprep” and “k8s-join” Script Templates (you may have called them something different)

Once done, click SAVE CHANGES to save the second Node Type. With the pieces in place, we are now ready to create the Cluster Layout object itself. Continue on to the next section.

Creating a Cluster Layout

At this point we can create the Cluster Layout object in Morpheus and attach the Node Types we’ve just created (which themselves have our Script Templates applied). Cluster Layouts are created in Library > Blueprints > Cluster Layouts. Click + ADD and configure the following:

  • NAME: Provide a name for the Cluster Layout, can be anything to denote this is a Kubernetes cluster

  • VERSION: The version number you wish to apply to this Cluster Layout which is useful if you later iterate on this Cluster Layout

  • CLUSTER TYPE: Kubernetes Cluster

  • TECHNOLOGY: VMware

  • MINIMUM MEMORY: 4096 MB

  • INPUTS: Use the typeahead field to add configured Inputs to the Cluster Layout

  • MASTER NODES: Use the typeahead field to find the Kubernetes master Node Type we just created

  • WORKER NODES: Use the typeahead field to find the Kubernetes worker Node Type we just created. Set the “Count” value to three (3) since we wish to have three worker nodes in this cluster

  • CLUSTER PACKAGES: Use the typeahead field to add configued Cluster Packages to the Cluster Layout. Cluster Packages are created in the Templates section

  • SPEC TEMPLATES: Use the typeahead field to add Spec Templates to the Cluster Layout

Click SAVE CHANGES to save the Cluster Layout.

Testing and Wrap-Up

At this point we are finished and we have a viable Kubernetes cluster that we can deploy with just one click. To add a new managed cluster to this Morpheus environment, navigate to Infrastructure > Clusters. To provision a cluster from the layout we just created, click + ADD CLUSTER and select “Kubernetes Cluster” from the dropdown menu. Make the appropriate selections to target the new cluster to an existing VMware vCenter Cloud and complete the wizard. Once complete, the new cluster will be visible on your clusters list page and from there you can drill into the detail page to view relevant details about the cluster including monitoring metrics, current workloads, and more.