头图

前言

在物联网(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 进行交互,同时执行本地的计算任务与设备管理。

准备工作

在开始部署之前,我们需要确保以下环境和资源准备就绪:

  1. Kylin V10 SP3 系统:确保云端和边缘节点均运行 Kylin,并进行基础的系统更新与配置。
  2. Kubernetes 集群:在云端部署一个 Kubernetes 集群以管理边缘节点,推荐使用 kubeadm 进行初始化。
  3. 网络环境:确保云端与边缘节点之间的网络互通,以便边缘节点能够顺利访问云端的 CloudCore。
  4. Containerd 容器运行时:在云端和边缘节点上使用 Containerd 作为容器运行时,以支持 KubeEdge 组件的运行。

集群配置信息

序号CPU(核)内存(G)硬盘(G)定位主机名IP
14850masterk8s-master01192.168.148.200
24850workerk8s-worker01192.168.148.201
32450edgenodeedgenode-01192.168.148.202

接下来,我们将介绍如何逐步完成 KubeEdge-v1.18.0 的部署和配置,并确保集群顺利运行。

1. Kylin V10 SP3 环境创建

在开始部署 KubeEdge-v1.18.0 之前,需要确保云端和边缘节点运行在麒麟操作系统上。具体的安装和配置步骤可以参考以下视频:

  1. 安装银河麒麟桌面系统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

Prometheus
1 声望0 粉丝