以下為 Ubuntu 22.04 上建立 Kubernetes cluster 的操作步驟,會建立:
- 1 個 master node
- 2 個 worker node,並透過
kubeadm join
到 master node
安裝前準備
要能夠作為 kubernetes nodes,硬體必須要:
- 2 cores CPU 或更多
- 至少 2GB RAM
- SWAP 必須停用
Cluster Info
這邊建立的 cluster 會有三個 node,IP 請依照自己的測試環境替換:
192.168.0.100
:master.kube.lab
192.168.0.101
:worker1.kube.lab
192.168.0.102
:worker2.kube.lab
設定 hostname
使用 hostnamectl
分別設定 3 個 node 的 hostname:
sudo hostnamectl set-hostname "master.kube.lab" sudo hostnamectl set-hostname "worker1.kube.lab" sudo hostnamectl set-hostname "worker2.kube.lab"
設定 /etc/hosts
將 node 的 IP / hostname 寫入 /etc/hosts
:
192.168.0.100 master.kube.lab 192.168.0.101 worker1.kube.lab 192.168.0.101 worker2.kube.lab
停用 SWAP
記得在所有的 kubernetes node 停用 SWAP:
sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
設定 iptables
這邊需要設定 IP forwarding 和 bridges:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter 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
設定完成以後,載入新的設定:
sudo sysctl --system
安裝 containerd.io
安裝 containerd 的步驟,可以直接參考 docker 的官方文件「Install Docker Engine on Ubuntu」。
先安裝必要套件:
sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release \ apt-transport-https
加入 docker 的 repository:
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/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/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新套件庫,並安裝 containerd:
sudo apt-get update sudo apt-get install containerd.io
使用 cgroup 來跑 containerd:
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1 sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
設定完成後,重新啟動 containerd:
sudo systemctl restart containerd sudo systemctl enable containerd
安裝 kubeadm
可以參考官方文件「Install kubeadm」的步驟來安裝 kubeadm。
新增 kubeadm 套件庫:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
安裝 kubeadm
:
sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
到此告一個段落。
機下來的步驟會依照 master node 以及 worker node 而有所不同。master node 會需要特別安裝一些控制套件;worker node 則比較簡單,只需要直接 join 到 master node 即可,不需要特別的設定。
設定 Kubernetes master node
啟動 master node 需要二個步驟:
kubeadm init
- 安裝 Calico
初始化 kubeadm,記得修改 endpoint 的名稱:
sudo kubeadm init --control-plane-endpoint="master.kube.lab"
這個步驟會花掉一點時間。當所有動作都正確完成後,會看到類似下面的訊息:
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config .... Then you can join any number of worker nodes by running the following on each as root: kubeadm join master.kube.lab:6443 --token n07eg4.nedanz2kqztuvws2 \ --discovery-token-ca-cert-hash sha256:f5e929bb2c6dbbaa7e2529955b18ccd99a71bb2c7282791e5ebb07013c8047c4
先將最後一行 kubeadm join
的指令記下來,這個指令將由 worker node 的 kubeadm 執行。
按照說明,建立 kube 的設定檔:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
動作都完成以後,執行 kubectl get nodes 就可以看到 cluster 的狀態:
kubectl get nodes NAME STATUS ROLES AGE VERSION master.kube.lab Ready control-plane 20m v1.25.3
master node 因為剛初始化完畢,所以只會顯示一個 node。等到 worker node 都 join 到 master node 以後,就可以看到所有 nodes 的狀態。
master node 需要多安裝 Calico 套件,執行以下指令來安裝:
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O kubectl apply -f calico.yaml
指令執行以後,會在 kube-system
啟動需要的 pods:
kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-58dbc876ff-ls2br 1/1 Running 0 3m33s calico-node-4m7jq 1/1 Running 0 3m33s calico-node-5zr5b 1/1 Running 0 3m33s coredns-565d847f94-8tclp 1/1 Running 0 16m coredns-565d847f94-g6mwh 1/1 Running 0 16m etcd-master.kube.lab 1/1 Running 2 (13m ago) 16m kube-apiserver-master.kube.lab 1/1 Running 2 (13m ago) 16m kube-controller-manager-master.kube.lab 1/1 Running 2 (13m ago) 16m kube-proxy-vp8rr 1/1 Running 0 6m47s kube-proxy-whzmv 1/1 Running 1 (13m ago) 16m kube-scheduler-master.kube.lab 1/1 Running 2 (13m ago) 16m
若 pods 都正常啟動,代表 master node 準備好讓 worker node join 了。
設定 worker node
worker node 不需要 kubeadm init
,直接執行 kubeadm join
即可。將上方 worker node 的 join 指令直接貼上並執行:
sudo kubeadm join master.kube.lab:6443 --token 3bg0gz.ltu6i9qgylycwo8z \ --discovery-token-ca-cert-hash sha256:30c700960b8eb1033f37cc057c7bde64dcab4ba1663e9e430bd5679d90d5ca03
這個步驟也會花掉一些時間。執行完成以後,可以回到 worker node 執行 kubectl get nodes
,變可以看到 join 成功的 worker node。
第二個 worker node 一樣透過上面的方法直接做 join 即可。
有正常運作的話,在 master node 執行 kubectl get nodes
就可以看到 nodes 的狀態了,例如:
kubectl get nodes NAME STATUS ROLES AGE VERSION master.kube.lab Ready control-plane 12m v1.25.3 worker1.kube.lab Ready <none> 70s v1.25.3 worker2.kube.lab Ready <none> 5m10s v1.25.3
備註:若 kubeadm 設定有發生錯誤的話,可以透過 kubeadm reset
重新建立設定檔。