221 lines
7.6 KiB
Ruby
221 lines
7.6 KiB
Ruby
# -*- mode: ruby -*-
|
|
# vi: set ft=ruby :
|
|
|
|
servers = [
|
|
{
|
|
:name => "k8s-lbhaproxy",
|
|
:type => "lbhaproxy",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.13",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-master-1",
|
|
:type => "master",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.10",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-master-2",
|
|
:type => "master-join",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.11",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-master-3",
|
|
:type => "master-join",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.12",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-node-1",
|
|
:type => "node",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.14",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-node-2",
|
|
:type => "node",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.15",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-node-3",
|
|
:type => "node",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.16",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-node-4",
|
|
:type => "node",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.17",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
},
|
|
{
|
|
:name => "k8s-node-5",
|
|
:type => "node",
|
|
:box => "ubuntu/xenial64",
|
|
:box_version => "20180831.0.0",
|
|
:eth1 => "192.168.205.18",
|
|
:mem => "2048",
|
|
:cpu => "2"
|
|
}
|
|
]
|
|
|
|
# This script to install k8s using kubeadm will get executed after a box is provisioned
|
|
$configureBox = <<-SCRIPT
|
|
|
|
# install docker v17.03
|
|
# reason for not using docker provision is that it always installs latest version of the docker, but kubeadm requires 17.03 or older
|
|
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 https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
|
|
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')
|
|
|
|
# run docker commands as vagrant user (sudo not required)
|
|
usermod -aG docker vagrant
|
|
|
|
# install kubeadm
|
|
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 http://apt.kubernetes.io/ kubernetes-xenial main
|
|
EOF
|
|
apt-get update
|
|
apt-get install -y kubelet kubeadm kubectl
|
|
apt-mark hold kubelet kubeadm kubectl
|
|
|
|
# kubelet requires swap off
|
|
swapoff -a
|
|
|
|
# keep swap off after reboot
|
|
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
|
|
|
|
# ip of this box
|
|
IP_ADDR=`ifconfig enp0s8 | grep Mask | awk '{print $2}'| cut -f2 -d:`
|
|
# set node-ip
|
|
sudo wget https://raw.githubusercontent.com/SirishaGopigiri/airship-host-config/master/kubernetes/config/kubelet -O /etc/default/kubelet
|
|
sudo sed -i "/^[^#]*KUBELET_EXTRA_ARGS=/c\KUBELET_EXTRA_ARGS=--node-ip=$IP_ADDR" /etc/default/kubelet
|
|
sudo systemctl restart kubelet
|
|
sudo --user=vagrant touch /home/vagrant/.Xauthority
|
|
|
|
# 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
|
|
|
|
$configureMaster = <<-SCRIPT
|
|
echo -e "\nThis is master:\n"
|
|
# 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 --pod-network-cidr=172.16.0.0/16 --control-plane-endpoint "192.168.205.13:443" --upload-certs
|
|
|
|
#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=/etc/kubernetes/admin.conf
|
|
kubectl apply -f https://raw.githubusercontent.com/SirishaGopigiri/airship-host-config/master/kubernetes/calico/calico.yaml
|
|
|
|
kubeadm init phase upload-certs --upload-certs > /etc/upload_cert
|
|
kubeadm token create --print-join-command >> /etc/kubeadm_join_cmd.sh
|
|
chmod +x /etc/kubeadm_join_cmd.sh
|
|
|
|
cat /etc/kubeadm_join_cmd.sh > /etc/kubeadm_join_master.sh
|
|
CERT=`tail -1 /etc/upload_cert`
|
|
sed -i '$ s/$/ --control-plane --certificate-key '"$CERT"'/' /etc/kubeadm_join_master.sh
|
|
|
|
#Install sshpass for futher docker image copy
|
|
apt-get install -y sshpass
|
|
|
|
SCRIPT
|
|
|
|
$configureMasterJoin = <<-SCRIPT
|
|
echo -e "\nThis is Master with Join Commadn:\n"
|
|
apt-get install -y sshpass
|
|
sshpass -p "vagrant" scp -o StrictHostKeyChecking=no vagrant@192.168.205.10:/etc/kubeadm_join_master.sh .
|
|
IP_ADDR=`ifconfig enp0s8 | grep Mask | awk '{print $2}'| cut -f2 -d:`
|
|
|
|
sed -i '$ s/$/ --apiserver-advertise-address '"$IP_ADDR"'/' kubeadm_join_master.sh
|
|
sh ./kubeadm_join_master.sh
|
|
SCRIPT
|
|
|
|
$configureNode = <<-SCRIPT
|
|
echo -e "\nThis is worker:\n"
|
|
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 |config|
|
|
|
|
config.vm.box = opts[:box]
|
|
config.vm.box_version = opts[:box_version]
|
|
config.vm.hostname = opts[:name]
|
|
config.vm.network :private_network, ip: opts[:eth1]
|
|
config.vm.network :forwarded_port, guest: 22, host: 2222, id: "ssh", disabled: true
|
|
config.vm.network :forwarded_port, guest: 22, host: 2200, auto_correct: true
|
|
config.vm.provider "virtualbox" do |v|
|
|
|
|
v.name = opts[:name]
|
|
v.customize ["modifyvm", :id, "--groups", "/Ballerina Development"]
|
|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
|
|
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
|
|
|
|
end
|
|
|
|
|
|
if opts[:type] == "master"
|
|
config.vm.provision "shell", inline: $configureBox
|
|
config.vm.provision "shell", inline: $configureMaster
|
|
config.vm.provision "file", source: "../airship-host-config", destination: "/home/vagrant/airship-host-config/airship-host-config"
|
|
elsif opts[:type] == "lbhaproxy"
|
|
config.vm.provision "shell", :path => "haproxy.sh"
|
|
elsif opts[:type] == "master-join"
|
|
config.vm.provision "shell", inline: $configureBox
|
|
config.vm.provision "shell", inline: $configureMasterJoin
|
|
else
|
|
config.vm.provision "shell", inline: $configureBox
|
|
config.vm.provision "shell", inline: $configureNode
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|