前言
在物聯網(IoT)領域,邊緣計算的應用日益廣泛,KubeEdge作為Kubernetes的擴展項目,為邊緣設備提供了高效、可擴展的管理能力。Kylin V10 SP3作為國產操作系統,以其穩定性和安全性在各類場景中得到廣泛使用。本文將詳細介紹如何在Kylin V10 SP3上部署KubeEdge-v1.18.0版本。
本篇博客將基於 Kylin V10 SP3 部署 KubeEdge-v1.18.0 環境,並通過實際操作搭建一個完整的雲邊協同集羣。通過本次部署,讀者可以深入瞭解 KubeEdge 的架構設計及其在邊緣計算中的應用。(讀者可以先閲讀基於Ubuntu22.04部署KubeEdge-v1.18.0環境,本文將展現Kylin和Ubuntu不同部署細節。)
集羣介紹
KubeEdge 的架構分為雲端和邊緣兩部分:
- CloudCore:運行在雲端,負責管理邊緣節點、設備與應用的生命週期,並與 Kubernetes API Server 進行通信。
- EdgeCore:運行在邊緣設備上,負責與 CloudCore 進行交互,同時執行本地的計算任務與設備管理。
準備工作
在開始部署之前,我們需要確保以下環境和資源準備就緒:
- Kylin V10 SP3 系統:確保雲端和邊緣節點均運行 Kylin,並進行基礎的系統更新與配置。
- Kubernetes 集羣:在雲端部署一個 Kubernetes 集羣以管理邊緣節點,推薦使用 kubeadm 進行初始化。
- 網絡環境:確保雲端與邊緣節點之間的網絡互通,以便邊緣節點能夠順利訪問雲端的 CloudCore。
- Containerd 容器運行時:在雲端和邊緣節點上使用 Containerd 作為容器運行時,以支持 KubeEdge 組件的運行。
集羣配置信息
| 序號 | CPU(核) | 內存(G) | 硬盤(G) | 定位 | 主機名 | IP |
|---|---|---|---|---|---|---|
| 1 | 4 | 8 | 50 | master | k8s-master01 | 192.168.148.200 |
| 2 | 4 | 8 | 50 | worker | k8s-worker01 | 192.168.148.201 |
| 3 | 2 | 4 | 50 | edgenode | edgenode-01 | 192.168.148.202 |
接下來,我們將介紹如何逐步完成 KubeEdge-v1.18.0 的部署和配置,並確保集羣順利運行。
1. Kylin V10 SP3 環境創建
在開始部署 KubeEdge-v1.18.0 之前,需要確保雲端和邊緣節點運行在麒麟操作系統上。具體的安裝和配置步驟可以參考以下視頻:
- 安裝銀河麒麟桌面系統V10【詳細圖文教程】
根據上述文章完成基本操作後,開始對三台主機進一步調整相關配置。
1.1 網絡配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 除了IPADDR和GATEWAY需要根據情況修改,其它設置可直接複製。
# 虛擬機網關NAT模式下一般以“.2”結尾,具體設置可在虛擬機網絡編輯器中查看。
# set PROXY_METHOD=none
# set IPADDR=192.168.148.200(本機IP)
# set PREFIX=24
# set GATEWAY=192.168.148.2
# set DNS1=119.29.29.29
# set DNS2=8.8.8.8
nmcli c
nmcli c reload
nmcli c up ens33
1.2 設置系統主機名及Host文件
# edgenode不需要設置
sudo cat << EOF >> /etc/hosts
192.168.148.200 k8s-master01
192.168.255.201 k8s-worker01
EOF
# 在對應的節點分別執行
sudo hostnamectl set-hostname k8s-master01
sudo hostnamectl set-hostname k8s-worker01
1.3 更新yum
sudo yum update -y
1.4 禁用iptables和firewalld服務
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
systemctl disable iptables
1.5 禁用selinux
# 永久關閉
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 臨時關閉
setenforce 0
1.6 禁用swap分區
# 永久關閉,將帶有“swap”的行註釋
vim /etc/fstab
# 臨時關閉
swapoff -a
1.7 調整內核參數
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
# 依次執行下面命令
sysctl -p
modprobe br_netfilter
lsmod | grep br_netfilter
1.8 配置 ipvs 功能
# 安裝ipset和ipvsadm
yum install ipset ipvsadmin -y
#如果提示No package ipvsadmin available.需要使用
yum install ipvsadm
# 添加需要加載的模塊寫入腳本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 為腳本文件添加執行權限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 執行腳本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看對應的模塊是否加載成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
1.9 重啓
reboot
2. 安裝容器運行時Containerd
在部署 KubeEdge 環境時,容器運行時是至關重要的組件。Containerd 是一個輕量級的容器運行時,它與 Kubernetes 緊密集成,並且在邊緣計算場景中表現穩定。建議在 KubeEdge 的高版本中使用 Containerd 作為容器運行時,因為它提供了更好的性能和可靠性。
這部分內容在Ubuntu、Kylin乃至於其它類CentOS系統中,基本是通用的,可以作為通用的部署流程參考。
2.1 更新yum包
sudo yum update -y
2.2 安裝Containerd
curl -LO https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz
# 解壓到根目錄
sudo tar -zxvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /
# 查看Containerd版本
containerd -v
2.3 配置Containerd
# 創建配置文件目錄
sudo mkdir /etc/containerd
# 創建配置文件
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置文件
sudo vi /etc/containerd/config.toml
# 將sandbox_image 值修改為 registry.aliyuncs.com/google_containers/pause:3.9
# 將SystemdCgroup 值修改為 true
2.4 啓動並設置開機自啓
sudo systemctl enable --now containerd
3. 安裝Kubernetes 1.29
3.1 安裝依賴
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
3.2 Master初始化
# 如果init時出現鏡像拉取失敗的error,可以使用如下命令拉取鏡像後init
# kubeadm config images pull --kubernetes-version=v1.29.9
# kubeadm reset
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.29.9 \
--apiserver-advertise-address=192.168.148.200 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
3.3 Master後續操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注:如果在3.3和3.4中出現如下錯誤“/proc/sys/net/ipv4/ip_forward contents are not set to 1”,則參考博文配置K8S出現以下錯誤“/proc/sys/net/ipv4/ip_forward contents are not set to 1
3.4 Worker加入集羣
kubeadm join 192.168.148.200:6443 --token 0grr01.zbqxdtmuc5qd9d05 \
--discovery-token-ca-cert-hash sha256:7942fdfd7e7e47318bc1b31f7ad8c1a05162b2292e706ad4c6c4b128abaa8e0b
如果忘記令牌,可以在master上重新執行打印命令
kubeadm token create --print-join-command
3.5 安裝網絡插件
3.5.1 Flannel網絡插件
# 這裏下載好kube-flannel.yml後,需要修改Network和image配置
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
kube-flannel.yml 中的 Network 與 kubeadm init --pod-network-cidr=10.244.0.0/16 一致,否則修改。
docker.io需要修改為docker.m.daocloud.io
kubectl apply -f kube-flannel.yml
3.5.2 Calico網絡插件
# 這裏下載好tigera-operator.yaml和custom-resources.yaml後,需要修改Network和image配置
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
watch kubectl get pods -n calico-system
custom-resources.yaml 中的 cidr 與 kubeadm init --pod-network-cidr=10.244.0.0/16 一致,否則修改。
quay.io需要修改為quay.m.daocloud.io
# 查找image鏡像
grep 'image:' tigera-operator.yaml
# 修改鏡像地址
sed -i 's|image: quay.io/tigera/operator:v1.34.3|image: quay.m.daocloud.io/tigera/operator:v1.34.3|g' tigera-operator.yaml
至此,k8s集羣告一段落!!!
4. 部署KubeEdge-v1.18.0 Cloudcore
4.1 部署MetalLB
# kube-proxy默認使用的是iptables轉發模式,在大規模集羣中,建議改為ipvs。如果當前轉發模式是ipvs,啓用嚴格的 ARP。
kubectl edit configmap -n kube-system kube-proxy
# 修改strictARP,將其改為true
# 修改mode,將其改為ipvs
kubectl rollout restart daemonset/kube-proxy -n kube-system
# 創建 MetalLB 命名空間
kubectl create namespace metallb-system
# 安裝MetalLB
curl https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml -O
kubectl apply -f metallb-native.yaml
# 配置 MetalLB
kubectl apply -f advertise.yaml
kubectl apply -f ip-pool.yaml
4.2 master安裝keadm
wget https://github.com/kubeedge/kubeedge/releases/download/v1.18.0/keadm-v1.18.0-linux-amd64.tar.gz
tar -zxvf keadm-v1.18.0-linux-amd64.tar.gz
cd keadm-v1.18.0-linux-amd64/keadm/
cp keadm /usr/sbin/
4.3 安裝Cloudcore
由於網絡問題,使用keadm init初始化的時候拉取‘docker.io/kubeedge/cloudcore:v1.18.0’往往會失敗,這個時候需要手動拉取‘docker.io/kubeedge/cloudcore:v1.18.0’鏡像並導入Kubernetes相關的 containerd命名空間(默認使用k8s.io)中,需要注意的是由於我們並不清楚init時Cloudcore會布在哪個節點上,所以最好所有節點都進行此操作。(cloudcore對應版本鏡像地址:https://docker.aityp.com/r/docker.io/kubeedge/cloudcore)
# containerd 拉取命令
ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubeedge/cloudcore:v1.18.0
ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubeedge/cloudcore:v1.18.0 docker.io/kubeedge/cloudcore:v1.18.0
# containerd 導出鏡像為 .tar 文件命令
ctr image export cloudcore_v1.18.0.tar docker.io/kubeedge/cloudcore:v1.18.0
# containerd 導入鏡像命令
ctr -n=k8s.io image import cloudcore_v1.18.0.tar
keadm init --advertise-address=192.168.148.200 --kubeedge-version=1.18.0
# 修改cloudcore的svc
kubectl edit svc cloudcore -n kubeedge
# 打標籤(kube-system、metallb-system、kube-flannel)
kubectl get daemonset -n kube-system |grep -v NAME |awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n kube-system --type='json' -p='[{"op": "replace","path": "/spec/template/spec/affinity","value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
kubectl get daemonset -n metallb-system |grep -v NAME |awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n metallb-system --type='json' -p='[{"op": "replace","path": "/spec/template/spec/affinity","value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
kubectl get daemonset -n kube-flannel |grep -v NAME |awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n kube-flannel --type='json' -p='[{"op": "replace","path": "/spec/template/spec/affinity","value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
4.4 edgenode接入KubeEdge
從master獲取token
keadm gettoken
4.5 edgenode安裝keadm
由於網絡問題,使用keadm join加入的時候拉取‘docker.io/kubeedge/installation-package:v1.18.0’往往會失敗,這個時候需要手動拉取‘docker.io/kubeedge/installation-package:v1.18.0’鏡像並導入Kubernetes相關的 containerd命名空間(默認使用k8s.io)中。(installation-package對應版本鏡像地址:https://docker.aityp.com/r/docker.io/kubeedge/installation-pa...)
wget https://github.com/kubeedge/kubeedge/releases/download/v1.18.0/keadm-v1.18.0-linux-amd64.tar.gz
tar -zxvf keadm-v1.18.0-linux-amd64.tar.gz
cd keadm-v1.18.0-linux-amd64/keadm/
cp keadm /usr/sbin/
# containerd 拉取命令
ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubeedge/installation-package:v1.18.0
ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kubeedge/installation-package:v1.18.0 docker.io/kubeedge/installation-package:v1.18.0
# containerd 導出鏡像為 .tar 文件命令
ctr image export installation-package_v1.18.0.tar docker.io/kubeedge/installation-package:v1.18.0
# containerd 導入鏡像命令
ctr -n=k8s.io image import installation-package_v1.18.0.tar
keadm join --cloudcore-ipport=192.168.148.200:10000 --edgenode-name=edgenode-01 --kubeedge-version=1.18.0 --token=6e8d40329efb0b66d2b124da5ec43c083e086bf827cb70e31c970abeb34f8198.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleH --cgroupdriver=systemd