We automate the install of Kubernetes in the form of MicroK8s using Ansible on Ubuntu 20.04. In this way the MicroK8s install is correct with nothing forgotten. We also add aliases to Kubernetes kubectl in the .bashrc file and Kubernetes command completion, all with Ansible. We could, of course install MicroK8s from the command line but there a few steps.
- Install docker
- Snap install Microk8s
- Add user to docker and microk8s groups
- Add alias for kubectl
- Add bash completion for kubectl
To be repeatable correct Ansible can be a great free tool no matter if at home or in the office. We automate the install of MicroK8s, a lightweight Kubernetes implementation, onto Ubuntu 20.04 using Ansible. In this way it is quick easy and nothing is forgotten. I am a big fan of Vagrant VirtualBox Virtual Machines. A very quck and easy way to manage machines. The machines are controlled by the Vagrantfile which, in this case, installs ansible and sets up host records if I later extend the MicroK8s cluster after the install with Ansible.
# -*- 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 node1" >> /etc/hosts echo "192.168.56.13 node2" >> /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 config.vm.define "node2" do |node2| node2.vm.box = "ubuntu/focal64" node2.vm.network "private_network", ip: "192.168.56.13" node2.vm.hostname = "node2" node2.vm.provider "virtualbox" do |vb| vb.memory = "1024" end node2.vm.provision "shell", inline: $script end end
This deploys 3 Ubuntu systems all with Ansible installed and correct hosts entries. In the same dirextory as the Vagrantfile we create the Ansible Playbook.
--- - name: Install Microk8s hosts: localhost gather_facts: false become: true tasks: - name: Install docker apt: name: docker.io update_cache: true cache_valid_time: 86400 state: present - name: Install microk8s snap: name: microk8s state: present classic: yes - name: Add user to Docker and Microk8s groups, they will need to logout and in again user: name: '{{ lookup("env", "USER") }}' state: present groups: - docker - microk8s append: true - 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
This directory is mapped to /vagrant in the guest VM when it is started, We start it with up and use ssh to login
$ vagrant up controller $ vagrant ssh controller
When logged in we run the Playbook
$ ansible-playbook /vagrant/microk8s.yml
Logout and back in to up date groups and run .bashrc.