Skip to content

Instantly share code, notes, and snippets.

@juazasan
Forked from lizrice/Vagrantfile
Last active August 27, 2019 06:53
Show Gist options
  • Save juazasan/5dbafa98cb128b74a03470f6f28c6fab to your computer and use it in GitHub Desktop.
Save juazasan/5dbafa98cb128b74a03470f6f28c6fab to your computer and use it in GitHub Desktop.
Vagrant file for setting up a single-node Kubernetes cluster that I can access from my desktop. Read more: https://medium.com/@lizrice/kubernetes-in-vagrant-with-kubeadm-21979ded6c63
# -*- mode: ruby -*-
# vi: set ft=ruby :
# This script to install Kubernetes will get executed after we have provisioned the box
$script = <<-SCRIPT
# Install kubernetes
apt-get update && apt-get install -y apt-transport-https
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
apt-get install -y kubelet kubeadm kubectl
# kubelet requires swap off
swapoff -a
# keep swap off after reboot
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# sed -i '/ExecStart=/a Environment="KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs"' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sed -i '0,/ExecStart=/s//Environment="KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs"\n&/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# Get the IP address that VirtualBox has given this VM
IPADDR=`ifconfig eth0 | grep mask | awk '{print $2}'| cut -f2 -d:`
echo This VM has IP address $IPADDR
echo "Setting up Kubernetes..."
NODENAME=$(hostname -s)
KUBERNETES_VERSION=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)
kubeadm init --apiserver-cert-extra-sans=$IPADDR --node-name $NODENAME --kubernetes-version $KUBERNETES_VERSION --pod-network-cidr 10.0.0.0/16
echo "Allow pods to run on the master node..."
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl taint nodes --all node-role.kubernetes.io/master-
#Set up Pod network
echo "Installing Calico..."
curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -s -o /root/calico.yaml
POD_CIDR="10.0.0.0/16"
sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" /root/calico.yaml
kubectl apply -f /root/calico.yaml
echo "Installing Helm..."
helm_version="2.14.3"
mkdir $HOME/tmp
curl -L https://storage.googleapis.com/kubernetes-helm/helm-v$helm_version-linux-amd64.tar.gz -s -o $HOME/tmp/helm.tar.gz
tar zxvf $HOME/tmp/helm.tar.gz -C $HOME/tmp
sudo mv $HOME/tmp/linux-amd64/helm /usr/local/bin
sudo chmod +x /usr/local/bin/helm
rm -rf $HOME/tmp/linux-amd64
rm -f $HOME/tmp/helm.tar.gz
helm init --history-max 200
# Set up admin creds for the vagrant user
echo "Copying credentials to /home/vagrant..."
sudo --user=vagrant mkdir -p /home/vagrant/.kube
cp -i /etc/kubernetes/admin.conf /home/vagrant/.kube/config
chown $(id -u vagrant):$(id -g vagrant) /home/vagrant/.kube/config
SCRIPT
Vagrant.configure("2") do |config|
# Specify your hostname if you like
config.vm.hostname = "k8shost"
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.box = "hashicorp/bionic64"
config.vm.provider "hyperv" do |h|
h.vmname = "k8shost"
h.memory = 2048
h.maxmemory = 8192
h.cpus = 2
end
config.vm.network "private_network", type: "dhcp"
config.vm.provision "docker"
config.vm.provision "shell", inline: $script
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment