Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
VagrantFile for automating Kubernetes Setup
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.require_version ">= 1.6.0"
# K8s Master Nodes
M_NODES = ENV['M_NODES'] || 1
# K8s Minion Nodes
H_NODES = ENV['H_NODES'] || 2
# Master node Memory & CPUs
M_MEM = ENV['M_MEM'] || 512
M_CPUS = ENV['M_CPUS'] || 1
# Minion Host Memory & CPUs
H_MEM = ENV['H_MEM'] || 1024
H_CPUS = ENV['H_CPUS'] || 1
#Local Variables
master_ip_address = %Q(ifconfig | grep -oP "inet addr:\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" | grep -oP "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" | tail -n 2 | head -n 1)
get_master_ip_address = ""
token = "a5f0cb.caa312d12724203d"
# Generic installer script common for server(s) & client(s)
# This expects arguments that provide runtime values
$installer = <<SCRIPT
#!/bin/bash
echo Will run the common installer script ...
# Update apt and get dependencies
sudo apt-get update
sudo apt-get install -y unzip curl wget
# Install docker and K8s
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
# Install docker if you don't have it already.
apt-get install -y docker.io
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
SCRIPT
$kubeadminit = <<SCRIPT
#!/bin/bash
echo Will run the kubeadm init script ...
kubeadm init --api-advertise-addresses=$1 --token=$2
SCRIPT
#Will be used in coming revisions
#$kubeadmjoin = <<SCRIPT
#!/bin/bash
#echo Will run the kubeadm join script ...
#kubeadm join --token=$1 $2
#SCRIPT
required_plugins = %w(vagrant-cachier vagrant-triggers)
required_plugins.each do |plugin|
need_restart = false
unless Vagrant.has_plugin? plugin
system "vagrant plugin install #{plugin}"
need_restart = true
end
exec "vagrant #{ARGV.join(' ')}" if need_restart
end
def configureVM(vmCfg, hostname, cpus, mem)
vmCfg.vm.box = "ubuntu/xenial64"
vmCfg.vm.hostname = hostname
vmCfg.vm.network "private_network", type: "dhcp"
#Adding Vagrant-cachier
if Vagrant.has_plugin?("vagrant-cachier")
vmCfg.cache.scope = :machine
vmCfg.cache.enable :apt
vmCfg.cache.enable :gem
#To fix the apt permission issue.
vmCfg.cache.synced_folder_opts = {owner: "_apt", group: "_apt"}
end
# Set resources w.r.t Virtualbox provider
vmCfg.vm.provider "virtualbox" do |vb|
vb.memory = mem
vb.cpus = cpus
vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
end
# Script will make some directories before installation procedure
vmCfg.vm.provision "shell", inline: $installer, privileged: true
return vmCfg
end
# Entry point of this Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# K8s Master related only !!
1.upto(M_NODES.to_i) do |i|
hostname = "master-%02d" % [i]
cpus = M_CPUS
mem = M_MEM
config.vm.define hostname do |vmCfg|
vmCfg = configureVM(vmCfg, hostname, cpus, mem)
vmCfg.vm.provision :shell, inline: "echo Setting up the Master using IPAdress: $1", :args => "`#{master_ip_address}`"
vmCfg.vm.provision :shell, inline: "echo Setting up the Master using Token: $1", :args => "#{token}"
vmCfg.vm.provision :shell, inline: $kubeadminit, :args => "`#{master_ip_address}` #{token}", privileged: true
end
end
# K8s Host related only !!
1.upto(H_NODES.to_i) do |i|
hostname = "host-%02d" % [i]
cpus = H_CPUS
mem = H_MEM
config.vm.define hostname do |vmCfg|
vmCfg = configureVM(vmCfg, hostname, cpus, mem)
#We want to run this only when the VM is first provisioned and get the Master IP to join the cluster
vmCfg.vm.provision :trigger, :force => true, :stdout => true, :stderr => true do |trigger|
trigger.fire do
master_hostname = "master-01"
get_ip_address = %Q(vagrant ssh #{master_hostname} -c 'ifconfig | grep -oP "inet addr:\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" | grep -oP "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}" | tail -n 2 | head -n 1')
get_master_ip_address = `#{get_ip_address}`
info"Getting the Master IP to join the cluster..."
if get_master_ip_address == ""
info"The Kubernetes Master is down, bring it up and manually run:"
info"kubeadm --token=<token> <master_ip_address>"
info"in order to join the cluster."
else
info"Setting up the Minion using IPAddress: #{get_master_ip_address}"
info"Setting up the Minion using Token: #{token}"
@machine.communicate.sudo("kubeadm join --token=#{token} #{get_master_ip_address.strip}")
end
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.