Skip to content

Instantly share code, notes, and snippets.

@TheFlash2k
Created October 3, 2023 01:21
Show Gist options
  • Save TheFlash2k/87a58a53f0cf794f20573f15e40c842d to your computer and use it in GitHub Desktop.
Save TheFlash2k/87a58a53f0cf794f20573f15e40c842d to your computer and use it in GitHub Desktop.
This is used to automate the deployment of 2-Node/1-Master Kubernetes Configuration. The `deploy.sh` and `master-setup.sh` are attached as well, but to create a single script, they were base64 encoded and then included in the same script. In case of vagrant deployment, the user may only need to run `setup-kube-cluster.sh` (but the VMs must be up…
#!/bin/bash
## Author: @TheFlash2k
set -e
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# Apply sysctl params without reboot
sudo sysctl --system
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install containerd.io
echo '' | sudo tee /etc/containerd/config.toml
echo '''[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true''' > /etc/containerd/config.toml
sudo systemctl restart containerd
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
#!/bin/bash
set -e
## Only run this on the Master Node:
interface=enp0s8
pod_cidr="10.244.0.0/16"
weave_net_name="weave-net" # By default its weave-net but is prone to change
namespace="kube-system"
output_log_file="/tmp/kubeadm.log"
## Extracting the IP
ip=`ip a s | grep $interface | grep inet | cut -d ' ' -f 6 | cut -d '/' -f 1`
sudo kubeadm config images pull
sudo kubeadm init --pod-network-cidr=$pod_cidr --apiserver-advertise-address=$ip | tee $output_log_file
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
echo -e "[PLEASE NOTE] You will have to modify the IPALLOC_RANGE Environment variable inside the weave daemonset.\nThe environment variable must be like this:\n- name: IPALLOC_RANGE\n value: $pod_cidr"
read -p "Press any key to enter into the editor." _
kubectl edit ds $weave_net_name -n $namespace
join_cmd=`grep -A1 'kubeadm join' $output_log_file`
echo -e "[*] Networking setup done.\nPlease run the following command on the nodes to join them:\n$join_cmd"
#!/bin/bash
## Author: @TheFlash2k
set -e
# The name of the master node:
master_node=kubemaster
############# Can also be used? ##################
#### But this solution requires extra files ######
#### But is more readable?? IDK, look at it ######
## Path to the deploy.sh
# deploy_script_file="./deploy.sh"
# deploy_script=`base64 -w0 $deploy_script_file`
## Path to master-setup.sh
# master_script_file="./master-setup.sh"
# master_script=`base64 -w0 $master_script_file`
##################################################
## Inside the master_node
output_log_file="/tmp/kubeadm.log"
setup_file="/tmp/setup.sh"
echo "[*] Master Node set as: $master_node"
deploy_script="fCBzdWRvIGdwZyAtLWRlYXJtb3IgLW8gL2V0Yy9hcHQva2V5cmluZ3MvZG9ja2VyLmdwZwpzdWRvIGNobW9kIGErciAvZXRjL2FwdC9rZXlyaW5ncy9kb2NrZXIuZ3BnCgojIEFkZCB0aGUgcmVwb3NpdG9yeSB0byBBcHQgc291cmNlczoKZWNobyBcCiAgImRlYiBbYXJjaD0iJChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKSIgc2lnbmVkLWJ5PS9ldGMvYXB0L2tleXJpbmdzL2RvY2tlci5ncGddIGh0dHBzOi8vZG93bmxvYWQuZG9ja2VyLmNvbS9saW51eC91YnVudHUgXAogICIkKC4gL2V0Yy9vcy1yZWxlYXNlICYmIGVjaG8gIiRWRVJTSU9OX0NPREVOQU1FIikiIHN0YWJsZSIgfCBcCiAgc3VkbyB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG9ja2VyLmxpc3QgPiAvZGV2L251bGwKc3VkbyBhcHQtZ2V0IHVwZGF0ZQoKc3VkbyBhcHQtZ2V0IGluc3RhbGwgY29udGFpbmVyZC5pbwoKZWNobyAnJyB8IHN1ZG8gdGVlIC9ldGMvY29udGFpbmVyZC9jb25maWcudG9tbAoKZWNobyAnJydbcGx1Z2lucy4iaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSIuY29udGFpbmVyZC5ydW50aW1lcy5ydW5jXQogIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5jb250YWluZXJkLnJ1bnRpbWVzLnJ1bmMub3B0aW9uc10KICAgIFN5c3RlbWRDZ3JvdXAgPSB0cnVlJycnID4gL2V0Yy9jb250YWluZXJkL2NvbmZpZy50b21sCgpzdWRvIHN5c3RlbWN0bCByZXN0YXJ0IGNvbnRhaW5lcmQKCnN1ZG8gYXB0LWdldCB1cGRhdGUKIyBhcHQtdHJhbnNwb3J0LWh0dHBzIG1heSBiZSBhIGR1bW15IHBhY2thZ2U7IGlmIHNvLCB5b3UgY2FuIHNraXAgdGhhdCBwYWNrYWdlCnN1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGFwdC10cmFuc3BvcnQtaHR0cHMgY2EtY2VydGlmaWNhdGVzIGN1cmwKY3VybCAtZnNTTCBodHRwczovL3BrZ3MuazhzLmlvL2NvcmU6L3N0YWJsZTovdjEuMjgvZGViL1JlbGVhc2Uua2V5IHwgc3VkbyBncGcgLS1kZWFybW9yIC1vIC9ldGMvYXB0L2tleXJpbmdzL2t1YmVybmV0ZXMtYXB0LWtleXJpbmcuZ3BnCiMgVGhpcyBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBjb25maWd1cmF0aW9uIGluIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2t1YmVybmV0ZXMubGlzdAplY2hvICdkZWIgW3NpZ25lZC1ieT0vZXRjL2FwdC9rZXlyaW5ncy9rdWJlcm5ldGVzLWFwdC1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9wa2dzLms4cy5pby9jb3JlOi9zdGFibGU6L3YxLjI4L2RlYi8gLycgfCBzdWRvIHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9rdWJlcm5ldGVzLmxpc3QKc3VkbyBhcHQtZ2V0IHVwZGF0ZQpzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBrdWJlbGV0IGt1YmVhZG0ga3ViZWN0bApzdWRvIGFwdC1tYXJrIGhvbGQga3ViZWxldCBrdWJlYWRtIGt1YmVjdGw="
master_script="IyEvYmluL2Jhc2gKCnNldCAtZQoKIyMgT25seSBydW4gdGhpcyBvbiB0aGUgTWFzdGVyIE5vZGU6CmludGVyZmFjZT1lbnAwczgKcG9kX2NpZHI9IjEwLjI0NC4wLjAvMTYiCndlYXZlX25ldF9uYW1lPSJ3ZWF2ZS1uZXQiICMgQnkgZGVmYXVsdCBpdHMgd2VhdmUtbmV0IGJ1dCBpcyBwcm9uZSB0byBjaGFuZ2UKbmFtZXNwYWNlPSJrdWJlLXN5c3RlbSIKb3V0cHV0X2xvZ19maWxlPSIvdG1wL2t1YmVhZG0ubG9nIgoKIyMgRXh0cmFjdGluZyB0aGUgSVAKaXA9YGlwIGEgcyB8IGdyZXAgJGludGVyZmFjZSB8IGdyZXAgaW5ldCB8IGN1dCAtZCAnICcgLWYgNiB8IGN1dCAtZCAnLycgLWYgMWAKCnN1ZG8ga3ViZWFkbSBjb25maWcgaW1hZ2VzIHB1bGwKc3VkbyBrdWJlYWRtIGluaXQgLS1wb2QtbmV0d29yay1jaWRyPSRwb2RfY2lkciAtLWFwaXNlcnZlci1hZHZlcnRpc2UtYWRkcmVzcz0kaXAgfCB0ZWUgJG91dHB1dF9sb2dfZmlsZQoKbWtkaXIgLXAgJEhPTUUvLmt1YmUKc3VkbyBjcCAtaSAvZXRjL2t1YmVybmV0ZXMvYWRtaW4uY29uZiAkSE9NRS8ua3ViZS9jb25maWcKc3VkbyBjaG93biAkKGlkIC11KTokKGlkIC1nKSAkSE9NRS8ua3ViZS9jb25maWcKCmt1YmVjdGwgYXBwbHkgLWYgaHR0cHM6Ly9naXRodWIuY29tL3dlYXZld29ya3Mvd2VhdmUvcmVsZWFzZXMvZG93bmxvYWQvdjIuOC4xL3dlYXZlLWRhZW1vbnNldC1rOHMueWFtbAoKZWNobyAtZSAiW1BMRUFTRSBOT1RFXSBZb3Ugd2lsbCBoYXZlIHRvIG1vZGlmeSB0aGUgSVBBTExPQ19SQU5HRSBFbnZpcm9ubWVudCB2YXJpYWJsZSBpbnNpZGUgdGhlIHdlYXZlIGRhZW1vbnNldC5cblRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIGxpa2UgdGhpczpcbi0gbmFtZTogSVBBTExPQ19SQU5HRVxuICB2YWx1ZTogJHBvZF9jaWRyIgoKcmVhZCAtcCAiUHJlc3MgYW55IGtleSB0byBlbnRlciBpbnRvIHRoZSBlZGl0b3IuIiBfCgprdWJlY3RsIGVkaXQgZHMgJHdlYXZlX25ldF9uYW1lIC1uICRuYW1lc3BhY2UKam9pbl9jbWQ9YGdyZXAgLUExICdrdWJlYWRtIGpvaW4nICRvdXRwdXRfbG9nX2ZpbGVgCmVjaG8gLWUgIlsqXSBOZXR3b3JraW5nIHNldHVwIGRvbmUuXG5QbGVhc2UgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBvbiB0aGUgbm9kZXMgdG8gam9pbiB0aGVtOlxuJGpvaW5fY21kIg=="
## Finding the machines and the ports they're running on.
inter=`vagrant status | grep running | cut -d ' ' -f 1 | tr $'\n' ','`
IFS=',' read -r -a machines <<< "$inter"
inter=`vagrant ssh-config | grep Port | cut -d ' ' -f 4 | tr $'\n' ','`
IFS=',' read -r -a ports <<< "$inter"
unset inter
echo -e "[*] Following machines are deployed:\n$machines"
for machine in "${machines[@]}"; do
echo "[*] Setting up on $machine:"
vagrant ssh $machine -c "(echo $deploy_script | base64 -d) > $setup_file && chmod +x $setup_file && $setup_file"
done
echo "Setting up the master node:"
vagrant ssh $master_node -c "(echo $master_script | base64 -d) > $setup_file && chmod +x $setup_file && $setup_file"
echo -n "Extracting the join command to be run on the worker nodes"
join_cmd=`vagrant ssh $master_node -c "cat $output_log_file | tail -2"`
echo ": $join_cmd"
for machine in "${machines[@]}"; do
if [[ $machine != $master_node ]]; then
echo "Joining $machine to $master_node"
vagrant ssh $machine -c "$join_cmd"
fi
echo "Removing $setup_file from $machine:"
vagrant ssh $machine -c "rm $setup_file"
done
echo "[+] Done!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment