Cluster Provisioning with CAPI

This page covers how to deploy a MicroK8s multi-node cluster using the Cluster API.

Install clusterctl

The clusterctl CLI tool handles the lifecycle of a Cluster API management cluster. To install it follow the upstream instructions.
Typically this involves fetching the executable that matches your hardware architecture, and placing it in your PATH. For example, at the time this HowTo was authored for AMD64 you would:

curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.7.0/clusterctl-linux-amd64 -o clusterctl
sudo install -o root -g root -m 0755 clusterctl /usr/local/bin/clusterctl

Setup a management cluster

The management cluster hosts the CAPI providers. You can use a MicroK8s cluster as a management cluster:

sudo snap install microk8s --classic
sudo microk8s status --wait-ready
mkdir -p ~/.kube/
sudo microk8s.config  > ~/.kube/config
sudo microk8s enable dns

When setting up the management cluster place its kubeconfig under ~/.kube/config so other tools such as clusterctl can discover and interact with it.

Prepare the infrastructure provider

Before generating a cluster, you have to configure the infrastructure provider. Each such provider has its own prerequisites. Please, follow
the Cluster API instructions on the additional infrastructure specific configuration.

Example using AWS

The AWS infrastructure provider requires the clusterawsadm tool to be installed:

curl -L https://github.com/kubernetes-sigs/cluster-api-provider-aws/releases/download/v2.0.2/clusterawsadm-linux-amd64 -o clusterawsadm
chmod +x clusterawsadm
sudo mv clusterawsadm /usr/local/bin

With clusterawsadm you can then bootstrap the AWS environment that CAPI will use.

Start by setting up environment variables defining the AWS account to use, if these are not already defined

export AWS_REGION=<your-region-eg-us-east-1>
export AWS_ACCESS_KEY_ID=<your-access-key>
export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>

If you are using multi-factor authentication, you will also need:

export AWS_SESSION_TOKEN=<session-token> # If you are using Multi-Factor Auth.

The clusterawsadm uses these details to create a CloudFormation stack in your AWS account
with the correct IAM resources:

clusterawsadm bootstrap iam create-cloudformation-stack

The credentials should also be encoded and stored as a kubernetes secret

export AWS_B64ENCODED_CREDENTIALS=$(clusterawsadm bootstrap credentials encode-as-profile)

Initialse the management cluster

To initialise the management cluster with the latest released version of the providers and the infrastructure of your choice:

clusterctl init --bootstrap microk8s --control-plane microk8s -i <infra-provider-of-choice>

Generate a cluster spec manifest

As soon as the bootstrap and control-plane controllers are up and running you can apply the cluster manifests with the specifications of the cluster you want to provision.

For MicroK8s there are example manifests in the bootstrap provider examples directory on GitHub.

Alternatively, you can generate a cluster manifest for a selected set of commonly used infrastructures via templates provided by the MicroK8s team.
Visit the usage instructions for a list of different providers and their deployment.

Make sure you have initialised the desired infrastructure provider and fetch the MicroK8s bootstrap provider repository:

git clone https://github.com/canonical/cluster-api-bootstrap-provider-microk8s

Review list of variables needed for the cluster template:

cd cluster-api-bootstrap-provider-microk8s
clusterctl generate cluster microk8s-<cloud_provider> --from ./templates/cluster-template-<cloud_provider>.yaml --list-variables

Set the respective environment variables by editing the rc file as needed before sourcing it. Then generate the cluster manifest:

source ./templates/cluster-template-<cloud_provider>.rc
clusterctl generate cluster microk8s-<cloud_provider> --from ./templates/cluster-template-<cloud_proider>.yaml > cluster.yaml

Each provisioned node is associated with a MicroK8sConfig, through which you can set the cluster’s properties.
Please, review the available options in the respective definitions file and
edit the cluster manifest (cluster.yaml above) to match your needs.
Note that the configuration structure followed is similar to that of kubeadm - in the MicroK8sConfig you will find a ClusterConfiguration and an InitConfiguration section.

Deploy the cluster

Deploying the cluster is achieved by running:

sudo microk8s kubectl apply -f cluster.yaml

To see the deployed machines:

sudo microk8s kubectl get machine 

After the first control plane node is provisioned you are able to get the kubeconfig of the workload cluster:

clusterctl get kubeconfig <provisioned-cluster> > kubeconfig

You can then see the workload nodes using:

KUBECONFIG=./kubeconfig kubectl get node

Delete the cluster

To get the list of provisioned clusters:

sudo microk8s kubectl get clusters

To delete one

microk8s kubectl delete cluster <provisioned-cluster>