Getting quick feedback is essential while developing. When it comes to setting up infrastructure, it often involves tons of scripting and is good to have a simple workflow you can iterate on. This tutorial is all about giving you a solid head start if you're itching to dive into DevOps and build your own homelab. We'll be installing microk8s, a fully compliant and up-to-date Kubernetes distribution that boasts minimal machine requirements.
To manage our VMs we will use Vagrant, its a complete cli tool to manage virtual machines and provides a simple but complete workflow. Vagrant is very good at giving us a context to our project, instead of configuring each VM individually and running provisioning scripts against them we have one declarative file that describe the project.
Vagrant installation
$ brew install virtualbox
$ brew cask install vagrant
Vagrantfile
Vagrant uses a Vagrantfile to describe the machines the project is going to need. Here we will have our provisioning script that will install update repositories, install Ansible, and setup host records. For each machine we describe we will run the provisioning script when we call "vagrant up ".
# -*- mode: ruby -*-
# vi: set ft=ruby :
$script = <<-SCRIPT
apt-get update
apt-get install -y ansible sshpass
echo "192.168.56.11 controller" >> /etc/hosts
echo "192.168.56.12 node-1" >> /etc/hosts
SCRIPT
Vagrant.configure("2") do |config|
config.vm.define "controller" do |controller|
controller.vm.box = "ubuntu/focal64"
controller.vm.network "private_network", ip: "192.168.56.11"
controller.vm.hostname = "controller"
controller.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
end
controller.vm.provision "shell", inline: $script
end
config.vm.define "node1" do |node1|
node1.vm.box = "ubuntu/focal64"
node1.vm.network "private_network", ip: "192.168.56.12"
node1.vm.hostname = "node1"
node1.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
node1.vm.provision "shell", inline: $script
end
end
NOTE: if you need a ip range out of vagrant default '192.168.56.0/21', create a file '/etc/vbox/networks.conf' and add the line with the range you need. Ex: * 192.168.32.0/24.
Next we call vagrant up:
$ vagrant up controller
If you already run and need to make changes to any VM described in the Vagrantfile, run the command again with the flag --provision, that will run the provisioning script again for the targeted VM.
Ansible playbook
For k8s provisioning we will be using a Ansible. Ansible is a powerful automation to provision and manage resources, we can automate rolling updates and state management of our deployments in a declarative file. Here we will use in its simplest form to install microk8s and add alias to kubectl and completion using a playbook.
---
- name: Install Microk8s
hosts: localhost
gather_facts: false
become: true
tasks:
- name: Install microk8s
snap:
name: microk8s
state: present
classic: yes
- name: Add alias to kubectl
become: false
lineinfile:
path: '{{ lookup("env", "HOME") }}/.bashrc'
regexp: '^alias kubectl='
line: 'alias kubectl="microk8s kubectl"'
state: present
- name: Add bash completion for kubectl
become: false
lineinfile:
path: '{{ lookup("env", "HOME") }}/.bashrc'
regexp: '^source \<\(kubectl'
line: 'source <(kubectl completion bash)'
state: present
Now we just need to access the vm using ssh, Vagrant already setup a user with ssh access to the machines, so we only need to run:
vagrant ssh controller
Ansible is already installed, we did that in the provisioning script so now we only need to run the playbook:
$ ansible-playbook /vagrant/homelab-microk8s.yml
After ansible finish to run the playbook, we need to source the .bashrc, you can just log out wait 2s and log back in with vagrant ssh:
$ exit
$ vagrant ssh controller
Now you can use kubectl with completion and get info of the services running:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
controller Ready <none> 60m v1.28.3
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-sfngb 1/1 Running 0 61m
kube-system coredns-864597b5fd-drm79 1/1 Running 0 60m
kube-system calico-kube-controllers-77bd7c5b-vnx5j 1/1 Running 0 60m
references:
https://developer.hashicorp.com/vagrant/docs/vagrantfile
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_intro.html
Here you will find a repo with the files used in this guide.
Photo by Jordan Harrison on Unsplash
Top comments (1)
how to install virtualbox on m1 ?