Skip to content

Instantly share code, notes, and snippets.

@kenanhancer
Last active September 26, 2019 21:32
Show Gist options
  • Save kenanhancer/18f461398e4db424554ba426f25786dd to your computer and use it in GitHub Desktop.
Save kenanhancer/18f461398e4db424554ba426f25786dd to your computer and use it in GitHub Desktop.
# -*- mode: ruby -*-
# vi: set ft=ruby :
servers = [
{
:name => "k8s-master-node",
:type => "master",
:box => "ubuntu/xenial64",
:box_version => "20180831.0.0",
:eth1 => "192.168.205.10",
:port_forward => "8001",
:mem => "2048",
:cpu => "2"
},
{
:name => "k8s-worker-node-1",
:type => "node",
:box => "ubuntu/xenial64",
:box_version => "20180831.0.0",
:eth1 => "192.168.205.11",
:port_forward => "",
:mem => "2048",
:cpu => "2"
},
{
:name => "k8s-worker-node-2",
:type => "node",
:box => "ubuntu/xenial64",
:box_version => "20180831.0.0",
:eth1 => "192.168.205.12",
:port_forward => "",
:mem => "2048",
:cpu => "2"
}
]
dockerScript = %{
apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 18.09 | head -1 | awk '{print $3}')
# run docker commands as vagrant user (sudo not required)
usermod -aG docker vagrant
}
kubeadm_kubelet_kubectl_Script = %{
apt-get update && apt-get install -y 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 https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
}
$configureBox = <<-SCRIPT
#{dockerScript}
#{kubeadm_kubelet_kubectl_Script}
SCRIPT
$configureMaster = <<-SCRIPT
echo "This is master"
# ip of this box
IP_ADDR=`ifconfig enp0s8 | grep Mask | awk '{print $2}'| cut -f2 -d:`
# install k8s master
HOST_NAME=$(hostname -s)
kubeadm init --apiserver-advertise-address=$IP_ADDR --apiserver-cert-extra-sans=$IP_ADDR --node-name $HOST_NAME
#copying credentials to regular user - 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
# install Calico pod network addon
export KUBECONFIG=/home/vagrant/.kube/config
# kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
# kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubeadm token create --print-join-command --ttl 0 >> /etc/kubeadm_join_cmd.sh
chmod +x /etc/kubeadm_join_cmd.sh
# required for setting up password less ssh between guest VMs
sudo sed -i "/^[^#]*PasswordAuthentication[[:space:]]no/c\PasswordAuthentication yes" /etc/ssh/sshd_config
sudo service sshd restart
SCRIPT
$configureNode = <<-SCRIPT
echo "This is worker"
apt-get install -y sshpass
sshpass -p "vagrant" scp -o StrictHostKeyChecking=no vagrant@192.168.205.10:/etc/kubeadm_join_cmd.sh .
sh ./kubeadm_join_cmd.sh
SCRIPT
Vagrant.configure("2") do |config|
servers.each do |opts|
config.vm.define opts[:name] do |node|
node.vm.box = opts[:box]
node.vm.box_version = opts[:box_version]
node.vm.hostname = opts[:name]
node.vm.network :private_network, ip: opts[:eth1]
if opts[:port_forward] != ""
node.vm.network "forwarded_port", guest: opts[:port_forward], host: opts[:port_forward]
end
node.vm.provider "virtualbox" do |v|
v.name = opts[:name]
v.customize ["modifyvm", :id, "--groups", "/Kenan Hancer"]
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end
node.vm.provision "shell", inline: $configureBox
if opts[:type] == "master"
node.vm.provision "shell", inline: $configureMaster
else
node.vm.provision "shell", inline: $configureNode
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment