- A vultr Account
- Install clusterctl
- Install kubectl
- Install kustomize
v3.1.0+
- Packer and Ansible to build images
- Make to use
Makefile
targets - A management cluster. You can use either a VM, container or existing Kubernetes cluster as management cluster.
- If you want to use a VM, install Minikube version 0.30.0 or greater. You'll also need to install the Minikube driver. For Linux, we recommend
kvm2
. For MacOS, we recommendVirtualBox
. - If you want to use a container you'll need to install Kind.
- If you want to use an existing Kubernetes cluster you'll need to prepare a kubeconfig for the cluster you intend to use.
- If you want to use a VM, install Minikube version 0.30.0 or greater. You'll also need to install the Minikube driver. For Linux, we recommend
- Install [vultr-cli][https://github.com/vultr/vultr-cli] (optional)
# Export the Vultr API Key
export VULTR_API_KEY=yourapikey
vultr-cli ssh create --name="cluster-api-key" --key="ssh-rsa AAAAB3NzaC1yc...."
Clone the image builder repository if you haven't already:
git clone https://github.com/kubernetes-sigs/image-builder.git
Change directory to images/capi within the image builder repository:
cd image-builder/images/capi
Generate a Vultr image (choosing Ubuntu in the example below):
make build-vultr-ubuntu-2204
List of available make commands for Vultr
../capi$ make help | grep vultr
deps-vultr Installs/checks dependencies for Vultr builds
build-vultr-ubuntu-2204 Builds Ubuntu 22.04 Vultr Snapshot
validate-vultr-ubuntu-2204 Validates Ubuntu 22.04 Vultr Snapshot Packer config
Verify that the image is available in your account and remember the corresponding image ID:
vultr-cli snapshot list
# Initialize a management cluster
clusterctl init
The output will be similar to this:
Fetching providers
Installing cert-manager Version="v1.15.1"
Waiting for cert-manager to be available...
Installing Provider="cluster-api" Version="v1.7.4" TargetNamespace="capi-system"
Installing Provider="bootstrap-kubeadm" Version="v1.7.4" TargetNamespace="capi-kubeadm-bootstrap-system"
Installing Provider="control-plane-kubeadm" Version="v1.7.4" TargetNamespace="capi-kubeadm-control-plane-system"
Your management cluster has been initialized successfully!
You can now create your first workload cluster by running the following:
clusterctl generate cluster [name] --kubernetes-version [version] | kubectl apply -f -
Update value of image field below to your controller image URL in the Vultr provider.
../default/manager_image_patch.yaml
Add your VULTR_API_KEY to
../defaults/credentials.yaml
Setting up environment variables: Config example can be found in scripts/capvultr-config-example.sh
export CLUSTER_NAME=<clustername>
export KUBERNETES_VERSION=v1.29.7
export CONTROL_PLANE_MACHINE_COUNT=1
export CONTROL_PLANE_PLANID=<plan_id>
export WORKER_MACHINE_COUNT=1
export WORKER_PLANID=<plan_id>
export MACHINE_IMAGE=<snapshot_id> # created in the step above.
export REGION=<region>
export PLANID=<plan_id>
export VPCID=<vpc_id>
export SSHKEY_ID=<sshKey_id>
chmod +x scripts/capvultr-config-example.sh
source scripts/capvultr-config-example.sh
Create the workload cluster on the management cluster:
clusterctl to generate the cluster definition
clusterctl generate cluster capvultr-quickstart --from templates/cluster-template.yaml > cluster.yaml
Apply the template
kubectl apply -f cluster.yaml
cluster.cluster.x-k8s.io/capvultr-quickstart created
vultrcluster.infrastructure.cluster.x-k8s.io/capvultr-quickstart created
kubeadmcontrolplane.controlplane.cluster.x-k8s.io/capvultr-quickstart-control-plane created
vultrmachinetemplate.infrastructure.cluster.x-k8s.io/capvultr-quickstart-control-plane created
machinedeployment.cluster.x-k8s.io/capvultr-quickstart-md-0 created
vultrmachinetemplate.infrastructure.cluster.x-k8s.io/capvultr-quickstart-md-0 created
kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/capvultr-quickstart-md-0 created
You can see the workload cluster resources by using:
kubectl get cluster-api
Note: The control planes won’t be ready until you install the CNI and Vultr Cloud Controller Manager.
To verify that the first control plane is up, use:
kubectl get kubeadmcontrolplane
NAME CLUSTER INITIALIZED API SERVER AVAILABLE REPLICAS READY UPDATED UNAVAILABLE AGE VERSION
capvultr-quickstart-control-plane capvultr-quickstart true 1 1 1 20m v1.28.9
After the first control plane node has the initialized
status, you can retrieve the workload cluster's Kubeconfig:
clusterctl get kubeconfig capvultr-quickstart > capvultr-quickstart.kubeconfig
You can verify what kubernetes nodes exist in the workload cluster by using:
KUBECONFIG=capvultr-quickstart.kubeconfig kubectl get node
NAME STATUS ROLES AGE VERSION
capvultr-quickstart-control-plane-jsvrz NotReady control-plane 20m v1.28.9
capvultr-quickstart-md-0-b54j9-2szdn NotReady <none> 14m v1.28.9
capvultr-quickstart-md-0-b54j9-vb5tz NotReady <none> 14m v1.28.9
Cilium is used here as an example but you can bring your own CNI.
https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#cilium-quick-installation
# Create Vultr secret
KUBECONFIG=capvultr-quickstart.kubeconfig kubectl create secret generic vultr-ccm --namespace kube-system --from-literal api-key=$VULTR_API_KEY
# Deploy Vultr Cloud Controller Manager
KUBECONFIG=capvultr-quickstart.kubeconfig kubectl apply -f https://raw.githubusercontent.com/vultr/vultr-cloud-controller-manager/master/docs/releases/latest.yml
After the CNI and the CCM have deployed your workload cluster nodes should be in the ready
state. You can verify this by using:
KUBECONFIG=capvultr-quickstart.kubeconfig kubectl get node
NAME STATUS ROLES AGE VERSION
capvultr-quickstart-control-plane-jsvrz Ready control-plane 51m v1.28.9
capvultr-quickstart-md-0-b54j9-cw5jh Ready <none> 106s v1.28.9
capvultr-quickstart-md-0-b54j9-nvv2c Ready <none> 8m17s v1.28.9
On the Mangement Cluster you should see the following:
k get cluster-api
[0/1144]
NAME CLUSTER AGE
kubeadmconfig.bootstrap.cluster.x-k8s.io/capvultr-quickstart-control-plane-jsvrz capvultr-quickstart 56m
kubeadmconfig.bootstrap.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9-cw5jh capvultr-quickstart 6m38s
kubeadmconfig.bootstrap.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9-nvv2c capvultr-quickstart 13m
NAME AGE
kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/capvultr-quickstart-md-0 59m
NAME CLUSTERCLASS PHASE AGE VERSION
cluster.cluster.x-k8s.io/capvultr-quickstart Provisioned 59m
NAME CLUSTER REPLICAS READY UPDATED UNAVAILABLE PHASE AGE VERSION
machinedeployment.cluster.x-k8s.io/capvultr-quickstart-md-0 capvultr-quickstart 2 2 2 0 Running 59m v1.28.9
NAME CLUSTER NODENAME PROVIDERID PHASE AGE VERSION
machine.cluster.x-k8s.io/capvultr-quickstart-control-plane-jsvrz capvultr-quickstart capvultr-quickstart-control-plane-jsvrz vultr://a657b222-4215-498a-9c7a-6886c0e1c397 Running 56m v1.28.9
machine.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9-cw5jh capvultr-quickstart capvultr-quickstart-md-0-b54j9-cw5jh vultr://4c6c4b0b-9801-4b8f-8de5-e37959f33aba Running 6m38s v1.28.9
machine.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9-nvv2c capvultr-quickstart capvultr-quickstart-md-0-b54j9-nvv2c vultr://ccec9632-b7e3-482b-bfa6-3ba59a2e39d0 Running 13m v1.28.9
NAME CLUSTER REPLICAS READY AVAILABLE AGE VERSION
machineset.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9 capvultr-quickstart 2 2 2 59m v1.28.9
NAME CLUSTER INITIALIZED API SERVER AVAILABLE REPLICAS READY UPDATED UNAVAILABLE AGE VERSION
kubeadmcontrolplane.controlplane.cluster.x-k8s.io/capvultr-quickstart-control-plane capvultr-quickstart true true 1 1 1 0 59m v1.28.9
NAME CLUSTER READY
vultrcluster.infrastructure.cluster.x-k8s.io/capvultr-quickstart capvultr-quickstart true
NAME CLUSTER STATE READY INSTANCEID MACHINE
vultrmachine.infrastructure.cluster.x-k8s.io/capvultr-quickstart-control-plane-jsvrz capvultr-quickstart active true vultr://a657b222-4215-498a-9c7a-6886c0e1c397 capvultr-quickstart-control-plane-jsvrz
vultrmachine.infrastructure.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9-cw5jh capvultr-quickstart active true vultr://4c6c4b0b-9801-4b8f-8de5-e37959f33aba capvultr-quickstart-md-0-b54j9-cw5jh
vultrmachine.infrastructure.cluster.x-k8s.io/capvultr-quickstart-md-0-b54j9-nvv2c capvultr-quickstart active true vultr://ccec9632-b7e3-482b-bfa6-3ba59a2e39d0 capvultr-quickstart-md-0-b54j9-nvv2c
clusterctl describe cluster capvultr-quickstart
NAME READY SEVERITY REASON SINCE MESSAGE
Cluster/capvultr-quickstart True 53m
├─ClusterInfrastructure - VultrCluster/capvultr-quickstart
├─ControlPlane - KubeadmControlPlane/capvultr-quickstart-control-plane True 53m
│ └─Machine/capvultr-quickstart-control-plane-jsvrz True 59m
│ └─MachineInfrastructure - VultrMachine/capvultr-quickstart-control-plane-jsvrz
└─Workers
└─MachineDeployment/capvultr-quickstart-md-0 True 3m51s
└─2 Machines... True 16m See capvultr-quickstart-md-0-b54j9-cw5jh, capvultr-quickstart-md-0-b54j9-nvv2c
You can delete the workload cluster from the management cluster using:
kubectl delete cluster capvultr-quickstart