實驗環境:Debian GNU/Linux 12 (bookworm) x86_64
安裝 containerd
安裝 k8s 前,需要先安裝 containerd。kubeedge 邊端只需要安裝 containerd 就好了,雲端需要安裝 k8s。
安裝 k8s 前準備
設定流量轉發
修改 iptables 的配置,啟用「br_netfilter」模組,讓 kubernetes 可以檢查和轉發網路流量。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system
關閉 Linux Swap 分割區
基於安全性(如在官方文件中承諾的 Secret 只會在記憶體中讀寫,不會落盤)、有利於保證節點同步一致性等原因,從 1.8 版開始,Kubernetes 就在它的文件中明確宣告了它預設不支援 Swap 分割區,在未關閉 Swap 分割區的機器中,叢集將直接無法啟動。
sudo cp /etc/fstab /etc/fstab_bak
sudo swapoff -a
sudo sed -ri '/\\sswap\\s/s/^#?/#/' /etc/fstab
註冊 apt 軟體源
選擇清華鏡像源,官方文件為:https://mirrors.tuna.tsinghua.edu.cn/help/kubernetes/
sudo apt install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg <https://packages.cloud.google.com/apt/doc/apt-key.gpg>
新建 /etc/apt/sources.list.d/kubernetes.list,內容為:
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] <https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt> kubernetes-xenial main
然後
sudo apt update
安裝 kubeadm,kubelet,kubectl
三個工具的作用請自行學習。
sudo apt install kubeadm kubelet kubectl
個人沒有鎖定版本,如果有鎖定版本的需要,請閱讀參考文章。
查看安裝結果:
cloud@cloud:~$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.10", GitCommit:"21be1d76a90bc00e2b0f6676a664bdf097224155", GitTreeState:"clean", BuildDate:"2024-05-14T10:51:30Z", GoVersion:"go1.21.9", Compiler:"gc", Platform:"linux/amd64"}
cloud@cloud:~$ kubectl version
Client Version: v1.28.10
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?
cloud@cloud:~$ kubelet --version
Kubernetes v1.28.10
了解後續需要的鏡像版本:
cloud@cloud:~$ sudo kubeadm config images list --kubernetes-version v1.28.10
registry.k8s.io/kube-apiserver:v1.28.10
registry.k8s.io/kube-controller-manager:v1.28.10
registry.k8s.io/kube-scheduler:v1.28.10
registry.k8s.io/kube-proxy:v1.28.10
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0
registry.k8s.io/coredns/coredns:v1.10.1
初始化叢集控制面
1.啟動 kubelet,保證開機執行
sudo systemctl start kubelet
sudo systemctl enable kubelet
2.開始部署,這裡切換到 root 帳號
kubeadm init \\
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \\
--pod-network-cidr=10.10.0.0/16 \\
--apiserver-advertise-address=10.129.196.8 \\
--kubernetes-version=v1.28.10 \\
--v=5
參數解釋(這裡直接摘抄原參考文章啦):
-image-repository:從阿里雲伺服器上拉取上面需要的基礎鏡像,如果不設定,就得去 Google 伺服器拉取;-pod-network-cidr:設定叢集中 Pod 的網路位址段,這是給後面安裝網路外掛 Flannel 使用的;-kubernetes-version:指定 Kubernetes 版本;-v=5:顯示詳細的追蹤日誌,可以參考這裡;-apiserver-advertise-address:指定 api-server 的 IP 位址,如果有多張網卡,請明確選擇哪張網卡。由於 apiserver 在 Kubernetes 叢集中有很重要的地位,很多配置(如 ConfigMap 資源等)都直接儲存了該位址,後續更改起來十分麻煩,所以要慎重。
3.按照日誌提示進行 kube config 配置
我的做法是在 root 下,後續 kubeedge 部署時,預設的 config 檔案就在 $HOME/.kube/config,也就是 /root/.kube/config。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
安裝網路外掛
關於 k8s 的網路外掛,請自行學習,我也需要再學習一下...
這裡我們按照原參考文章一樣選擇 Flannel。
從 Github 取得安裝檔案 kube-flannel.yml,然後對其進行修改:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
將上面的 Network 調整為我們之前初始化叢集時設定的 pod 網段:
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
最後我們使用 kubectl apply 進行安裝:
kubectl apply -f kube-flannel.yml
也可以按照 flannel 官網的方式直接
kubectl apply -f <https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml>
感覺版本的話都可以問題不大,但是不管怎麼樣 pod 網段應該都需要配置的。
有一個小問題需要注意
在後續執行 edgemesh 測試案例的過程中,發現部署在邊端的 pod 始終處於 ContainerCreating 的狀態,邊端的 edgecore 日誌顯示原因是 /run/flannel/subnet.env 不存在,把雲端的這個檔案內容複製到邊端之後才可以正常部署。因此可以留意一下這個問題,在部署 edgemesh 的時候我還會再說一遍。
關於鏡像
在沒有設定 containerd 的代理之前,我遇到了 flannel 鏡像無法拉取的問題,我推薦一個我使用的國內鏡像源替代的方法。
在渡渡鳥鏡像同步站搜尋相關的鏡像,kubectl edit pod/deployment/daemonset ** -n ** 直接替換為國內的鏡像。如果渡渡鳥鏡像同步站沒有相關鏡像的話,也可以按照網站的使用指南進行新增。
移除 master 上的汙點
移除汙點是為了讓 master 節點可以部署業務服務,當時部署 cloudcore 的時候就因為這個問題耽誤了一些時間...
kubectl taint nodes cloud node-role.kubernetes.io/control-plane:NoSchedule-
參考文章中的調整 NodePort 範圍,目前我還沒有遇到問題,因此先跳過了,需要的請閱讀參考文章。
增加 Worker 節點也暫時沒有必要,需要的請閱讀參考文章。
安裝 Docker
此外,在執行聯合推理案例時,需要構建聯合推理頭盔檢測大小模型的鏡像(執行案例中的 build_image.sh 腳本,這個到時候也會說),因此需要安裝 docker ce。
清華鏡像源安裝 docker ce,官方文件:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
另外 Docker 也最好配置代理和國內鏡像,請自行搜尋方法。
參考文章
- Kubernetes 叢集安裝(Debian 版):https://demonlee.tech/archives/2212002#移除-master-上的污点