Notes: getting started with Cluster-API (CAPI)! #28
July 26, 2021
Last friday, I attended a kubernetes
#in-dev community session around the Cluster API (CAPI) project.
This was my very first time knowing what CAPI project is about (although, I’ve come across the name quite a lot of times before). And well, I found it to be a very interesting one for me. The reason being CAPI is a project, a tooling that helps with managing cluster infrastructure as declarative configuration. And this is the area that I’m concerned with, on a regular basis.
This blog is just me taking notes as I try to understand the concepts of the CAPI project & further play, around while seting it up locally.
Before I start with the commands, here is the definition for the CAPI (from he Cluster API Book).
Cluster API is a Kubernetes sub-project focused on providing declarative APIs and tooling to simplify provisioning, upgrading, and operating multiple Kubernetes clusters.
Started by the Kubernetes Special Interest Group (SIG) Cluster Lifecycle, the Cluster API project uses Kubernetes-style APIs and patterns to automate cluster lifecycle management for platform operators. The supporting infrastructure, like virtual machines, networks, load balancers, and VPCs, as well as the Kubernetes cluster configuration are all defined in the same way that application developers operate deploying and managing their workloads. This enables consistent and repeatable cluster deployments across a wide variety of infrastructure environments.
With that, let’s get started now!
It is required to have the following installed & setup on the machine (as pre-requisites):
STEP-1: Once the above pre-requisites are setup, the first step is, creating a local kubernetes cluster locally. (I’ll do this with
Later in the post, I’ll be using
Docker infrastructure provider(while playing around with CAPI to generate workload cluster, something we will discuss later in the post)
infrastructure provideras any of these cloud providers like AWS, GCP, Azure, etc that provides compute and resources, required in order to spin up a cluster. Because I are going to do it locally, I’ll be using docker containers as my infrastructure provider (i.e. use docker containers as computer resources) to create a cluster using CAPI.
I require to create a custom
kindconfig file as the following (for allowing the Docker provider to access Docker on the host):
cat > kind-cluster-with-extramounts.yaml <<EOF kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraMounts: - hostPath: /var/run/docker.sock containerPath: /var/run/docker.sock EOF
And then I create a kind cluster, with the above config file.
kind create cluster --config kind-cluster-with-extramounts.yaml
STEP-2: Installing the
clusterctl CLI tool. It handles the lifecycle of a Cluster API management cluster.
Since, I’m on a linux OS, following are the commands I’m using:
$ curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v0.4.0/clusterctl-linux-amd64 -o clusterctl $ chmod +x ./clusterctl $ sudo mv ./clusterctl /usr/local/bin/clusterctl $ clusterctl version
STEP-3: At this step, I’ll use
clusterctl tool to transform the (one I spinned up above) kind cluster into a
management cluster by using
clusterctl init. The command accepts as input a list of providers to install.
A Management cluster is a Kubernetes cluster that manages the lifecycle of Workload Clusters. A Management Cluster is also where one or more Infrastructure Providers run, and where resources such as Machines are stored.
Since, I’m using Docker infrastructure provider, I will add the
--infrastructure dockerflag to my command.
clusterctl init --infrastructure docker
The above command actually created the following CRD (custom resource definitions) & CR (custom resources) in the kind cluster (specific to the infrastructure provider I mentioned above)
STEP-4: Now, next step is to create a
A workload cluster is a cluster created by a ClusterAPI controller, which is not a bootstrap cluster, and is meant to be used by end-users, as opposed to by CAPI tooling.
clusterctl generate clusterwith input flags is used to generate a YAML template for creating a workload cluster. In my case, I’m using
dockeras infrasture provider, I’ll use the following command:
clusterctl generate cluster test-workload-cluster --flavor development \ --kubernetes-version v1.21.2 \ --control-plane-machine-count=3 \ --worker-machine-count=3 \ > test-workload-cluster.yaml
This command will populate the
test-workload-cluster.yamlfile with a predefined list of Cluster API objects; Cluster, Machines, Machine Deployments, etc. required to create a workload cluster with the (⬆️) listed cluster control & worker machine configs.
test-workload-cluster.yamlfile to create the workload cluster.
kubectl apply -f test-workload-cluster.yaml
STEP-5: Now is the time to verify the workload cluster deployment & actually accessing it.
Check the status of the cluster
kubectl get cluster
clusterctlto view of the cluster and its resources
clusterctl describe cluster test-workload-cluster
Check the status of the control plane
kubectl get kubeadmcontrolplane
Note: *The control plane won’t be
Readyuntil I’ll insall a CNI (container network interface) in the following step.
STEP-6: Deploy a CNI solution.
First, retrieve the workload cluster kubeconfig:
clusterctl get kubeconfig test-workload-cluster > test-workload-cluster.kubeconfig
Here, it will use
calicofor an example.
kubectl --kubeconfig=./test-workload-cluster.kubeconfig apply -f https://docs.projectcalico.org/v3.18/manifests/calico.yaml
After a short while, the nodes should be up & running
kubectl --kubeconfig=./test-workload-cluster.kubeconfig get nodes
Note that in the above commands, we are using the
workerload clusterkubeconfig, and so, with that we are accessing the workload cluster, not the kind (management cluster) we spinned up for the first.
STEP-7: Finally, step is to delete the workload cluster & the management cluster
Delete the workload cluster
kubectl delete cluster test-workload-cluster
Delete the management cluster
kind delete cluster