头图

前言

在云原生技术的迅猛发展中,边缘计算逐渐成为备受关注的焦点。KubeEdge 作为一个基于 Kubernetes 的开源边缘计算平台,能够帮助开发者将 Kubernetes 的强大能力扩展到边缘场景中。在智能制造、物联网(IoT)等需要云边协同的场景中,KubeEdge 扮演着重要角色,支持跨越云端和边缘的应用部署与管理。

本篇博客将基于 Ubuntu 22.04 部署 KubeEdge-v1.18.0 环境,并通过实际操作搭建一个完整的云边协同集群。通过本次部署,读者可以深入了解 KubeEdge 的架构设计及其在边缘计算中的应用。

集群介绍

KubeEdge 的架构分为云端和边缘两部分:

  • CloudCore:运行在云端,负责管理边缘节点、设备与应用的生命周期,并与 Kubernetes API Server 进行通信。
  • EdgeCore:运行在边缘设备上,负责与 CloudCore 进行交互,同时执行本地的计算任务与设备管理。

准备工作

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

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

集群配置信息

序号CPU(核)内存(G)硬盘(G)定位主机名IP
14850masterk8s-master01192.168.148.150
24850workerk8s-worker01192.168.148.151
32425edgenodeedgenode-01192.168.148.152

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

1. Ubuntu 22.04 环境创建

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

  1. VMware虚拟机安装 Ubuntu 22.04 详细教程
  2. Ubuntu 22.04 如何配置静态IP、网关、DNS
  3. SSH连接 Ubuntu 22.04

根据上述文章完成基本操作后,开始对三台主机进一步调整相关配置。

1.1 关闭防火墙

sudo systemctl disable --now ufw

1.2 设置服务器分区

# 设置为亚洲的上海时区
sudo timedatectl set-timezone Asia/Shanghai

# 重启时间同步服务
sudo systemctl restart systemd-timesyncd.service

# 确保时间同步服务正常运行
timedatectl status

1.3 关闭Swap分区

# 临时关闭
sudo swapoff -a

# 永久关闭:注释掉带有'swap'的行目,一般是最后一行
sudo vi /etc/fstab

1.4 关闭SELinux

# 安装policycoreutils软件包
sudo apt install -y policycoreutils

# 检查selinux关闭状态
sestatus

1.5 配置hosts配置文件

sudo vi /etc/hosts

1.6 转发IPv4并让iptables接收到桥接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
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 参数而不重新启动
sudo sysctl --system

# 运行以下指令确认 br_netfilter 和 overlay 模块被加载
lsmod | grep br_netfilter
lsmod | grep overlay

# 运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

2. 安装容器运行时Containerd

在部署 KubeEdge 环境时,容器运行时是至关重要的组件。Containerd 是一个轻量级的容器运行时,它与 Kubernetes 紧密集成,并且在边缘计算场景中表现稳定。建议在 KubeEdge 的高版本中使用 Containerd 作为容器运行时,因为它提供了更好的性能和可靠性。

2.1 更新apt包

sudo apt update

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.28.13

3.1 安装依赖

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

3.2 下载K8s软件包仓库的公共签名钥匙

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3.3 添加K8s apt仓库(仅适用于1.28版本,次要版本请自行修改)

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

3.4 更新apt包

sudo apt-get update

3.5 安装并固定kubelet、kubeadm和kubectl版本

sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

3.6 查看kubeadm版本

kubeadm version

3.7 初始化集群(master节点)

这里需要保存生成的token

sudo kubeadm config images pull \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.13 \
--cri-socket=unix:///run/containerd/containerd.sock
  • sudo kubeadm config images pull:这个命令用于通过 kubeadm 拉取 Kubernetes 初始化时所需的容器镜像。
  • --image-repository=registry.aliyuncs.com/google_containers:指定使用阿里云镜像仓库来拉取镜像。由于在国内访问 Google 的官方镜像仓库较慢或可能受限,因此使用阿里云提供的镜像仓库加速拉取。
  • --kubernetes-version=v1.28.13:指定 Kubernetes 版本为 v1.28.13,确保拉取与该版本匹配的容器镜像。
  • --cri-socket=unix:///run/containerd/containerd.sock:指定使用 Containerd 作为容器运行时。cri-socket 的路径指向 Containerd 的套接字文件,kubeadm 将通过该路径与 Containerd 交互。
sudo kubeadm init \
--apiserver-advertise-address=192.168.148.150 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.13 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
  • sudo kubeadm init:这是初始化 Kubernetes 集群的命令,kubeadm 会负责启动集群的控制平面(master 节点)。
  • --apiserver-advertise-address=192.168.148.150:指定 API 服务器的监听地址,即 Kubernetes 控制平面将绑定到该 IP 地址上,并通过该地址与其他节点通信。这里的 192.168.148.150 是你主节点的内网 IP。
  • --image-repository=registry.aliyuncs.com/google_containers:同样使用阿里云镜像仓库加速拉取初始化所需的镜像。
  • --kubernetes-version=v1.28.13:指定 Kubernetes 版本为 v1.28.13,确保使用该版本的组件进行初始化。
  • --service-cidr=10.96.0.0/12:定义 Kubernetes 服务的 IP 地址范围,默认是 10.96.0.0/12,确保这个范围不会与集群内的其他子网冲突。
  • --pod-network-cidr=10.244.0.0/16:定义 Pod 网络的 IP 地址范围,这里使用的是 Flannel 网络插件的默认范围 10.244.0.0/16。后续配置网络插件时,Pod 将会分配该范围内的 IP 地址。
  • --cri-socket=unix:///run/containerd/containerd.sock:指定使用 Containerd 作为容器运行时,通过套接字文件与其通信。

3.8 执行init后续三条命令(主节点)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.9 边端加入主节点(worker节点)

sudo kubeadm join 192.168.148.150:6443 --token k0j4kb.zz1ziq97dy89ipx0         --discovery-token-ca-cert-hash sha256:12e5d81e13a8d7b40a9403f7f7205fd60630ef59aa79271e23791a8e90010d4e

3.10 查看k8s集群配置

kubectl get nodes -o wide

3.11 安装calico网络插件

创建calico资源的过程受到网络影响较大,不能确定初始化时长,但这个过程不会自动终止,请耐心等待。

# 安装Tigera Calico操作符和自定义资源定义
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml

# 下载客户端资源文件
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml

# 修改pod的网段地址
sed -i 's/cidr: 192.168.0.0/cidr: 10.244.0.0/g' custom-resources.yaml

# 创建资源
kubectl create -f custom-resources.yaml

# 监控创建过程
watch kubectl get all -o wide -n calico-system

4. 部署KubeEdge-v1.18.0 Cloudcore

4.1 安装负载均衡器 Metallb(master节点)

Cloudcore需要为Edgecore提供通信地址,LB为Cloudcore提供公网IP或者K8s集群节点相同网段IP地址。

kubectl edit configmap -n kube-system kube-proxy

# 将mode 值修改 “ipvs”
# 将ipvs.strictAPP 值修改为 true

# 重新启动kube-system
kubectl rollout restart daemonset kube-proxy -n kube-system

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml

# 创建全局IP地址
vim first-ippool.yaml

# 创建
kubectl apply -f first-ippool.yaml

192.168.148.160-192.168.148.170是虚拟机网段内空闲的ip地址

# 开启二层转发
vim l2forward.yaml

# 创建
kubectl apply -f l2forward.yaml

4.2 使用keadm部署Cloudcore(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

sudo mv keadm-v1.18.0-linux-amd64/keadm/keadm /usr/local/bin/

sudo keadm init --advertise-address=192.168.148.160 --set iptablesManager.mode="external" --profile version=v1.18.0

  • sudo keadm init用于初始化云端节点,也就是启动 CloudCore 服务,负责与边缘节点(EdgeCore)通信并管理它们。
  • --advertise-address=192.168.148.160指定 CloudCore 运行所在服务器的 IP 地址(LB分配的地址),也就是其他边缘节点与云端通信时将会连接到的 IP 地址。
  • --set iptablesManager.mode="external"配置 iptablesManager 的模式为 "external",表示不使用 KubeEdge 默认的 iptables 管理器,而是依赖外部的网络配置。这意味着集群中的网络规则需要由用户或外部工具来管理。
  • --profile version=v1.18.0指定要安装的 KubeEdge 版本为 v1.18.0。
    这里可能会遇到keadm init的问题(execute keadm command failed: failed to verify k8s component installed, err: failed to build config, err: stat /root/.kube/config: no such file or directory),出现这个错误是因为 keadm init 在初始化时找不到 Kubernetes 的配置文件 /root/.kube/config,通常这个文件是在你成功部署 Kubernetes 集群之后创建的。可以通过以下步骤来解决这个问题:

    # 检查 kubeconfig 文件
    mkdir -p /root/.kube
    cp -i /etc/kubernetes/admin.conf /root/.kube/config
    
    # 设置环境变量
    export KUBECONFIG=/etc/kubernetes/admin.conf
    
    # 重新运行 keadm init

    # 将type 值修改为 LoadBalancer
    kubectl edit svc cloudcore -n kubeedge

    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 calico-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n calico-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"}]}]}}}}]'

    这里可能会遇到问题(error: error loading config file "/etc/kubernetes/admin.conf": open /etc/kubernetes/admin.conf: permission denied),出现这个错误表示你没有权限访问 /etc/kubernetes/admin.conf 文件。可以通过以下命令来解决这个问题:

    sudo chmod 644 /etc/kubernetes/admin.conf


    这里需要保存生成的token

    keadm gettoken

    4.3 使用keadm部署Edgecore(edgenode节点)

    # 下载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
    
    sudo mv keadm-v1.18.0-linux-amd64/keadm/keadm /usr/local/bin/
    
    # keadm join
    sudo keadm join --token=$TOKEN --cloudcore-ipport=192.168.148.160:10000 --kubeedge-version=1.18.0


    这里可能会遇到镜像拉取的问题。可以通过以下命令来解决这个问题:

    sudo ctr image pull docker.io/kubeedge/installation-package:v1.18.0

总结


至此,您已经成功完成了 KubeEdge 的部署,搭建了一个强大且灵活的云边协同平台。通过 KubeEdge,您可以在云端高效管理和调度边缘节点上的应用,实现对边缘设备的轻松控制与管理。
望这篇指南能够帮助您顺利完成部署,并为后续的边缘计算应用开发打下坚实基础。如果您在实际使用中遇到任何问题,欢迎查阅官方文档或参与社区讨论,共同推动 KubeEdge 生态的发展!


Prometheus
1 声望0 粉丝