Skip to content

Instantly share code, notes, and snippets.

@danielepolencic
Created August 10, 2018 19:52
Show Gist options
  • Save danielepolencic/c1d63486ae0b601177dd7192473ed627 to your computer and use it in GitHub Desktop.
Save danielepolencic/c1d63486ae0b601177dd7192473ed627 to your computer and use it in GitHub Desktop.
Creating a 3 node cluster with kubeadm and Vagrant
BOX_IMAGE = "bento/ubuntu-16.04"
KUBERNETES_VERSION = "stable-1.10"
KUBEADM_VERSION = "1.10.3-00"
FLANNEL_VERSION = "v0.9.1"
Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |v|
v.memory = 1024
v.cpus = 1
end
config.vm.provision :shell, privileged: true, inline: $install_common_tools
config.vm.define :master do |master|
master.vm.box = BOX_IMAGE
master.vm.hostname = "master"
master.vm.network :private_network, ip: "10.0.0.10"
master.vm.provision :shell, privileged: false, inline: $provision_master_node
end
%w{worker1 worker2}.each_with_index do |name, i|
config.vm.define name do |worker|
worker.vm.box = BOX_IMAGE
worker.vm.hostname = name
worker.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "512"]
end
worker.vm.network :private_network, ip: "10.0.0.#{i + 11}"
worker.vm.provision :shell, privileged: false, inline: <<-SHELL
sudo /vagrant/join.sh
echo 'Environment="KUBELET_EXTRA_ARGS=--node-ip=10.0.0.#{i + 11}"' | sudo tee -a /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart kubelet
SHELL
end
end
config.vm.provision "shell", inline: $install_multicast
end
$install_common_tools = <<-SCRIPT
# disable swap
swapoff -a
sed -i '/swap/d' /etc/fstab
# Install kubeadm, kubectl and kubelet
export DEBIAN_FRONTEND=noninteractive
apt-get -qq install ebtables ethtool
apt-get -qq update
apt-get -qq install -y docker.io apt-transport-https curl
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 -qq update
apt-get -qq install -y kubelet=#{KUBEADM_VERSION} kubeadm=#{KUBEADM_VERSION} kubectl=#{KUBEADM_VERSION}
SCRIPT
$provision_master_node = <<-SHELL
OUTPUT_FILE=/vagrant/join.sh
rm -rf $OUTPUT_FILE
# Start cluster
sudo kubeadm init --apiserver-advertise-address=10.0.0.10 --pod-network-cidr=10.244.0.0/16 --kubernetes-version #{KUBERNETES_VERSION} | grep "kubeadm join" > ${OUTPUT_FILE}
chmod +x $OUTPUT_FILE
# Configure kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# Fix kubelet IP
echo 'Environment="KUBELET_EXTRA_ARGS=--node-ip=10.0.0.10"' | sudo tee -a /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# Configure flannel
curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/#{FLANNEL_VERSION}/Documentation/kube-flannel.yml
sed -i.bak 's|"/opt/bin/flanneld",|"/opt/bin/flanneld", "--iface=eth1",|' kube-flannel.yml
kubectl create -f kube-flannel.yml
sudo systemctl daemon-reload
sudo systemctl restart kubelet
SHELL
$install_multicast = <<-SHELL
apt-get -qq install -y avahi-daemon libnss-mdns
SHELL
@danielepolencic
Copy link
Author

You can create a new cluster with:

vagrant up

To use kubectl you need to log in to the master first:

vagrant ssh master
kubectl cluster-info

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment