跳至文章
Shemolk8s 叢集安裝以及 kubeedge 部署前準備
流程记录 / 云原生

k8s 叢集安裝以及 kubeedge 部署前準備

實驗環境:Debian GNU/Linux 12 (bookworm) x86_64

安裝 containerd

安裝 k8s 前,需要先安裝 containerd。kubeedge 邊端只需要安裝 containerd 就好了,雲端需要安裝 k8s。

安裝 k8s 前準備

設定流量轉發

修改 iptables 的配置,啟用「br_netfilter」模組,讓 kubernetes 可以檢查和轉發網路流量。

shell
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 分割區的機器中,叢集將直接無法啟動。
shell
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/

shell
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,內容為:

shell
deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] <https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt> kubernetes-xenial main

然後

shell
sudo apt update

安裝 kubeadm,kubelet,kubectl

三個工具的作用請自行學習。

shell
sudo apt install kubeadm kubelet kubectl

個人沒有鎖定版本,如果有鎖定版本的需要,請閱讀參考文章。

查看安裝結果:

shell
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

了解後續需要的鏡像版本:

shell
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,保證開機執行

shell
sudo systemctl start kubelet
sudo systemctl enable kubelet

2.開始部署,這裡切換到 root 帳號

shell
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。

shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

安裝網路外掛

關於 k8s 的網路外掛,請自行學習,我也需要再學習一下...

這裡我們按照原參考文章一樣選擇 Flannel。

從 Github 取得安裝檔案 kube-flannel.yml,然後對其進行修改:

plain text
net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

將上面的 Network 調整為我們之前初始化叢集時設定的 pod 網段:

yaml
net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

最後我們使用 kubectl apply 進行安裝:

plain text
kubectl apply -f kube-flannel.yml

也可以按照 flannel 官網的方式直接

shell
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 的時候就因為這個問題耽誤了一些時間...

shell
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 也最好配置代理和國內鏡像,請自行搜尋方法。

參考文章