Skip to content

Instantly share code, notes, and snippets.

@rssws
Last active June 28, 2024 06:55
Show Gist options
  • Save rssws/e2d82275ef04940b50294dafb3fa6bdd to your computer and use it in GitHub Desktop.
Save rssws/e2d82275ef04940b50294dafb3fa6bdd to your computer and use it in GitHub Desktop.
Install k8s + flannel on debian / ubuntu for master / worker node
install_docker () {
distro=$(cat /etc/*-release | grep DISTRIB_ID | awk -F '=' '{print $2}' | awk '{print tolower($0)}')
distroList=("debian" "ubuntu")
if [[ -n "${distro}" ]]; then
if [[ " ${distroList[*]} " =~ " ${distro} " ]]; then
echo "Installing kubernetes on $distro"
else
echo "Upsupported system distro: ${distro}"
echo "<distro> must be one of: ${distroList[*]}"
exit 1
fi
else
echo "Unknown system distro"
exit 1
fi
# Install docker
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/${distro}/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${distro} \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
}
install_kubernetes () {
# Install kubernetes (kubeadm)
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /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
# Remove containerd config and restart
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
}
setup_master () {
# Initialize master node using kubeadm
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# Run kubernetes as a regular user
sudo mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# Apply flannel add-on
sudo apt-get install -y wget
wget https://github.com/flannel-io/flannel/releases/download/v0.18.1/flanneld-amd64
sudo mkdir -p /opt/bin
sudo mv flanneld-amd64 /opt/bin/flanneld
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# Print join information again
kubeadm token create --print-join-command
# Untaint master node to allow pod scheduling on master node
# kubectl taint nodes --all node-role.kubernetes.io/master-
# kubectl taint nodes --all node-role.kubernetes.io/control-plane-
}
setup_worker () {
# Join master node
echo "==================================================================================="
echo "Joining master node by running the following command:"
echo "-----------------------------------------------------------------------------------"
echo "kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>"
echo "==================================================================================="
}
main () {
variant=$1
variantList=("master" "worker")
if [[ -n "${variant}" ]]; then
if [[ " ${variantList[*]} " =~ " ${variant} " ]]; then
echo "Installing kubernetes for ${variant} node"
else
echo "Upsupported variant: ${variant}"
echo "<variant> must be one of: ${variantList[*]}"
exit 1
fi
else
echo "Unknown variant"
echo "Usage: $0 [master|worker]"
exit 1
fi
# Swap can cause problem for `kubeadm init`
# This works only temporarily. See the blow comments for a permanent solution.
sudo swapoff -a
install_docker
install_kubernetes
if [[ "${variant}" == "master" ]]; then
setup_master
else
setup_worker
fi
echo "Done!"
}
main "$@"; exit
@rssws
Copy link
Author

rssws commented Jul 16, 2022

Usage:

bash install-k8s-flannel-debian+ubuntu.bash [master|worker]

Do not run this script with sudo since some commands should not be run as root.

Pitfalls:

  1. Turn off the swap permanently. If you have swap on, you might have a problem with kubeadm init.
    • sudo swapoff -a can temporarily turn off your swap.
    • To turn it off permanently, comment out the line for swap in /etc/fstab and then restart. You can delete the swap file to free some space.
  2. (2022-07-23) It is known that Kubernetes might not work on some newest Linux distributions such as Ubuntu >= 21 and Debian >= 11 (List not complete). It has something to do with the cgroup version. Check the issue for more details. Therefore, try to install them on an older OS version such as Ubuntu 20.04 or Debian 10.
    • (2022-09-26) UPDATE: The support for cgroup v2 has already been added to the stable release of kubernetes. If the error still happens, try to add this line.
  3. Normally, you should set up a static internal IP for your master. If the internal IP of the master changed after the reboot, kubelet won't be able to start.

Useful Commands:

  1. Restart kubelet: sudo systemctl restart kubelet;
  2. Monitor the log of kubelet: sudo journalctl -u kubelet -n 100 -f;
  3. Reset kubeadm if something goes wrong: sudo kubeadm reset. You may need to remove ~/.kube as well.

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