Last active 1706077627

Install K8S on your home lab!

Install.sh Raw
1#/bin/bash
2# This script is to install Kubernetes on Ubuntu 22.04 LTS, with Calico as CNI
3# This script used 10.244.0.0/16 as pod network CIDR. This network should not be used in your physical network.
4# This script used Calico v3.27.0. You can change it to the latest version.
5# Reference: https://www.cherryservers.com/blog/install-kubernetes-on-ubuntu
6
7DEBIAN_FRONTEND=noninteractive sudo apt update
8DEBIAN_FRONTEND=noninteractive sudo apt install curl gnupg2 software-properties-common apt-transport-https ca-certificates -y
9
10echo "Disable swap..."
11sudo swapoff -a
12sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
13
14echo "Uninstall Docker.ce..."
15aiur() { arg="$( cut -d ' ' -f 2- <<< "$@" )" && curl -sL https://gitlab.aiursoft.cn/aiursoft/aiurscript/-/raw/master/$1.sh | sudo bash -s $arg; }
16aiur uninstall/docker
17sudo apt autoremove -y
18
19echo "Install Docker.io..."
20DEBIAN_FRONTEND=noninteractive sudo apt install docker.io -y
21
22echo "Prepare network..."
23cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
24overlay
25br_netfilter
26EOF
27sudo modprobe overlay
28sudo modprobe br_netfilter
29# sysctl params required by setup, params persist across reboots
30cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
31net.bridge.bridge-nf-call-iptables = 1
32net.bridge.bridge-nf-call-ip6tables = 1
33net.ipv4.ip_forward = 1
34EOF
35sudo sysctl --system
36
37echo "Prepare runtime to setup containerd..."
38sudo mkdir /etc/containerd > /dev/null 2>&1
39sudo sh -c "containerd config default > /etc/containerd/config.toml"
40sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
41sudo systemctl restart containerd.service
42sudo systemctl restart kubelet.service > /dev/null 2>&1
43
44echo "Install K8S..."
45curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes.gpg --yes
46echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/kubernetes.gpg] http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list
47sudo apt update
48DEBIAN_FRONTEND=noninteractive sudo apt install kubeadm kubelet kubectl kubernetes-cni -y
49
50# Init (Only on Master)
51echo "Init K8S..."
52sudo kubeadm config images pull
53sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.64.50.111
54read -p "Please copy the kubeadm join command above and run it on worker nodes. Press any key to continue..."
55
56# Config (Only on Master)
57echo "Config K8S..."
58mkdir -p $HOME/.kube
59sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
60sudo chown $(id -u):$(id -g) $HOME/.kube/config
61
62# Calico (Only on Master)
63echo "Install Calico..."
64kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
65curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml -O
66sed -i 's/cidr: 192\.168\.0\.0\/16/cidr: 10\.244\.0\.0\/16/' custom-resources.yaml
67kubectl create -f custom-resources.yaml
68sudo systemctl restart kubelet.service
69
70# Test (Only on Master)
71echo "Test K8S..."
72while [ "$(kubectl get nodes | grep -v "Ready" | wc -l)" -gt 1 ]; do
73 echo "Waiting for all nodes to be ready..."
74 kubectl get nodes -o wide
75 sleep 5
76done
77
78while [ "$(kubectl get pods --all-namespaces | grep -v "Running" | wc -l)" -gt 1 ]; do
79 echo "Waiting for all pods to be running..."
80 kubectl get pods --all-namespaces -o wide
81 sleep 5
82done
83
84# Install Dashboard (Only on Master)
85echo "Install dashboard..."
86kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
87kubectl create serviceaccount -n kubernetes-dashboard admin-user
88cat << EOF > rbac.yaml
89apiVersion: rbac.authorization.k8s.io/v1
90kind: ClusterRoleBinding
91metadata:
92 name: admin-user
93roleRef:
94 apiGroup: rbac.authorization.k8s.io
95 kind: ClusterRole
96 name: cluster-admin
97subjects:
98- kind: ServiceAccount
99 name: admin-user
100 namespace: kubernetes-dashboard
101EOF
102kubectl apply -f rbac.yaml
103rm rbac.yaml
104token=$(kubectl -n kubernetes-dashboard create token admin-user)
105echo "Dashboard token: $token"
106kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard --address 0.0.0.0 10443:443
107hostname=$(hostname)
108echo "Dashboard URL: https://$hostname:10443"
109