附043.KubeEdge边缘云部署实施方案

目录

KubeEdge介绍

KubeEdge概述

KubeEdge 是一个开源系统,将原生的容器化的业务流程和设备管理功能扩展到边缘节点。KubeEdge 是基于 Kubernetes 构建的,并为云,边缘之间的网络通信,应用程序部署以及元数据同步提供核心基础架构支持。同时 KubeEdge 还支持 MQTT,并允许开发人员编写自定义逻辑并在 Edge 上启用一定资源的设备进行通信。

KubeEdge 由云端和边缘端组成。

KubeEdge优势

KubeEdge 的优势主要包括:

  • 边缘计算

借助在 Edge 上运行业务应用,可以在产生数据的边端存储和处理大量数据。这样可以减少边缘和云之间的网络带宽需求和消耗,提高响应速度,降低成本并保护客户的数据隐私。

  • 简化开发

开发人员可以编写基于 HTTP 或 MQTT 的常规应用程序,对其进行容器化,然后在 Edge 或 Cloud 中的任何一个更合适的位置运行应用程序。

  • Kubernetes 原生支持

借助 KubeEdge,用户可以像在传统的 Kubernetes 集群一样,在 Edge 节点上编排应用程序,管理设备并监视应用程序和设备状态。

  • 丰富的应用

可以轻松地将现有的复杂机器学习,图像识别,事件处理等其他高级应用程序部署到 Edge。

  • 云边可靠协作

    在不稳定的云边网络上,可以保证消息传递的可靠性,不会丢失。

  • 边缘自治

    当云边之间的网络不稳定或者边缘端离线或重启时,确保边缘节点可以自主运行,同时确保边缘端的应用正常运行。

  • 边缘设备管理

    通过 Kubernetes 的原生API,并由CRD来管理边缘设备。

  • 极致轻量的边缘代理

    在资源有限的边缘端上运行的非常轻量级的边缘代理(EdgeCore)。

KubeEdge架构

KubeEdge 由以下组件组成:

云上(CloudCore)部分:

CloudHub: Web 套接字服务器,负责在云端缓存信息、监视变更,并向 EdgeHub 端发送消息。

EdgeController: kubernetes 的扩展控制器,用于管理边缘节点和 pod 的元数据,以便可以将数据定位到对应的边缘节点。

DeviceController: 一个扩展的 kubernetes 控制器,用于管理边缘 IoT 设备,以便设备元数据/状态数据可以在 edge 和 cloud 之间同步。

边缘(EdgeCore)部分:

EdgeHub: Web 套接字客户端,负责与 Cloud Service 进行交互以进行边缘计算(例如 KubeEdge 体系结构中的 Edge Controller)。这包括将云侧资源更新同步到边缘,并将边缘侧主机和设备状态变更报告给云。

Edged: 在边缘节点上运行并管理容器化应用程序的代理。

EventBus: 一个与 MQTT 服务器(mosquitto)进行交互的 MQTT 客户端,为其他组件提供发布和订阅功能。

ServiceBus: 用于与 HTTP 服务器 (REST) 交互的 HTTP 客户端,为云组件提供 HTTP 客户端功能,以访问在边缘运行的 HTTP 服务器。

DeviceTwin: 负责存储设备状态并将设备状态同步到云端。它还为应用程序提供查询接口。

MetaManager: Edged 端和 Edgehub 端之间的消息处理器。它还负责将元数据存储到轻量级数据库(SQLite)或从轻量级数据库(SQLite)检索元数据。

KubeEdge架构图如下:

提示:更多介绍参考官方文档:为什么选择KubeEdge

KubeEdge部署

部署依赖

KubeEdge基于原生Kubernetes基础上构建,将Kubernetes能力从云端延伸到边缘,并使其适配边缘计算的要求,比如网络不稳定性以及资源受限场景等,因此在部署KubeEdge前,请先准备好一个Kubernetes集群。有关 Kubernetes 的部署可参考: 附042.Kubernetes_v1.32.3生成环境高可用部署

提示:Kubernetes 和 KubeEdge 版本匹配和兼容可查看: Kubernetes compatibility

对于容器运行时,可支持如下:

  • docker
  • containerd
  • cri-o
  • virtlet

部署规划

本方案基于 Keadm 部署工具实现完整生产环境可用的 KubeEdge 边缘云部署。

其主要信息如下:

  • 版本:KubeEdge v1.20.0 版本;
  • Keadm:采用 Keadm 部署 KubeEdge ;
  • OS:Ubuntu Server 24.04 LTS;
  • containerd:容器运行时。
节点主机名 IP 类型 备注
master01 172.24.8.181 Kubernetes master节点 KubeEdge Cloud节点
master02 172.24.8.182 Kubernetes master节点 KubeEdge Cloud节点
master03 172.24.8.183 Kubernetes master节点 KubeEdge Cloud节点
worker01 172.24.8.184 Kubernetes worker节点
worker02 172.24.8.185 Kubernetes worker节点
worker03 172.24.8.186 Kubernetes worker节点
worker03 172.24.8.186 Kubernetes worker节点
edgenode01 172.24.8.187 KubeEdge worker节点
edgenode02 172.24.8.188 KubeEdge worker节点

提示:Kubernetes 集群部署不在本方案讨论内,但本方案基于快速部署目的,会使用 Kubernetes 的 master01 充当部署节点,从而快速批量完成对edgenode节点的相关部署。

主机名配置

需要对所有节点主机名进行相应配置。

shell 复制代码
root@localhost:~# hostnamectl set-hostname edgenode01	    #其他节点依次修改

提示:如上需要在所有节点修改对应的主机名。

生产环境通常建议在内网部署dns服务器,使用dns服务器进行解析,本指南采用本地hosts文件名进行解析。

如下hosts文件修改仅需在master01执行,后续使用批量分发至其他所有节点。

shell 复制代码
root@master01:~# cat >> /etc/hosts << EOF
172.24.8.187 edgenode01
172.24.8.188 edgenode02
EOF

root@master01:~# cat /etc/hosts
#......
172.24.8.181 master01
172.24.8.182 master02
172.24.8.183 master03
172.24.8.184 worker01
172.24.8.185 worker02
172.24.8.186 worker03
172.24.8.187 edgenode01
172.24.8.188 edgenode02

提示:如上仅需在master01节点上操作。

变量准备

为实现自动化部署,自动化分发相关文件,提前定义相关主机名、IP组、变量等。

shell 复制代码
root@master01:~# wget http://down.linuxsb.com/mydeploy/kubeedge/v1.20.0/kubeedgenodeenv.sh

root@master01:~# vi kubeedgenodeenv.sh            #确认相关主机名和IP
#!/bin/bash
#***************************************************************#
# ScriptName: kubeedgenodeenv.sh
# Author: xhy
# Create Date: 2025-04-01 16:12
# Modify Author: xhy
# Modify Date: 2025-04-01 16:15
# Version: v1
#***************************************************************#

# Kubernetes 集群 MASTER 机器 IP 数组
export K8S_MASTER_IPS=(172.24.8.181 172.24.8.182 172.24.8.183)

# Kubernetes 集群 MASTER IP 对应的主机名数组
export K8S_MASTER_NAMES=(master01 master02 master03)

# Kubernetes 集群 NODE 机器 IP 数组
export K8S_NODE_IPS=(172.24.8.184 172.24.8.185 172.24.8.186)

# Kubernetes 集群 NODE IP 对应的主机名数组
export K8S_NODE_NAMES=(worker01 worker02 worker03)

# Kubernetes 集群 所有机器 IP 数组
export K8S_ALL_IPS=(172.24.8.181 172.24.8.182 172.24.8.183 172.24.8.184 172.24.8.185 172.24.8.186)

# Kubernetes 集群 所有IP 对应的主机名数组
export K8S_ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)

# Kubeedge 集群 所有机器 IP 数组
export EDGE_ALL_IPS=(172.24.8.187 172.24.8.188)

# Kubeedge 集群 所有IP 对应的主机名数组
export EDGE_ALL_NAMES=(edgenode01 edgenode02)

提示:如上仅需在master01节点上操作。

互信配置

为了方便远程分发文件和执行命令,本方案配置master01节点到其它节点的 ssh信任关系,即免秘钥管理所有其他节点。

shell 复制代码
root@master01:~# source kubeedgenodeenv.sh                                #载入变量
    
root@master01:~# for edge_ip in ${EDGE_ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${edge_ip}...\033[0m"
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@${edge_ip}
  done
  
root@master01:~# for edge_name in ${EDGE_ALL_NAMES[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${edge_name}...\033[0m"
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@${edge_name}
  done

root@master01:~# for all_ip in ${K8S_ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
    sleep 2
    scp -rp /etc/hosts root@${all_ip}:/etc/hosts
  done

提示:如上仅需在master01节点上操作。

环境预配置

需要在每个边缘节点上安装一个容器运行时,以使边缘引擎 EdgeCore 能够成功安装,并且边缘 Pod 可以运行在边缘节点上。

Keadm 用于部署 KubeEdge ,在正式使用 Keadm 部署 KubeEdge 之前需要对操作系统环境进行准备,即环境预配置。

环境的预配置本方案使用脚本自动完成。

使用如下脚本对基础环境进行初始化,主要功能包括:

  • 安装 containerd ,边缘引擎 EdgeCore 依赖的容器组件
  • 关闭 SELinux 及防火墙
  • 优化相关内核参数,针对生产环境的基础系统调优配置
  • 关闭 swap
  • 设置相关模块,主要为转发模块
  • 配置相关基础软件,系统部分基础依赖包
  • 创建 container 所使用的独立目录
  • 配置 crictl 和运行时的连接,便于后期使用 crictl 命令

提示:后续ctr命令下载镜像的时候,若需要使用containerd的加速,必须带上--hosts-dir,ctr 当前环境所管理的镜像都属于 k8s.io ,因此创建一个别名。

shell 复制代码
root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.32.3/uk8spreconfig.sh

root@master01:~# vim uk8spreconfig.sh
#!/bin/bash
#***************************************************************#
# ScriptName: uk8spreconfig.sh
# Author: xhy
# Create Date: 2025-03-29 12:30
# Modify Author: xhy
# Modify Date: 2025-04-01 16:43
# Version: v1
#***************************************************************#

CONTAINERD_VERSION=1.7.26-1

# Initialize the machine. This needs to be executed on every machine.
apt update && apt upgrade -y && apt autoremove -y

# Install package
sudo apt -y install conntrack ntpdate ntp ipvsadm ipset jq iptables sysstat wget

# Add Docker's official GPG key
sudo apt -y install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

# Install and config containerd
apt-cache madison containerd
sudo apt -y install containerd.io=${CONTAINERD_VERSION}
sleep 3s

mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /data/containerd

cat > /etc/containerd/config.toml <<EOF
disabled_plugins = ["io.containerd.internal.v1.restart"]
root = "/data/containerd"
version = 2

[plugins]

  [plugins."io.containerd.grpc.v1.cri"]
#    sandbox_image = "registry.k8s.io/pause:3.10"
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"

    [plugins."io.containerd.grpc.v1.cri".containerd]

      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          runtime_type = "io.containerd.runc.v2"

          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            SystemdCgroup = true

    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"

  [plugins."io.containerd.runtime.v1.linux"]
    shim_debug = true
EOF

cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://registry-1.docker.io"

[host."https://docker.1ms.run"]
  capabilities = ["pull", "resolve", "push"]

[host."https://dbzucv6w.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve", "push"]

[host."https://docker.xuanyuan.me"]
  capabilities = ["pull", "resolve", "push"]
EOF

# config crictl & containerd
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

echo 'alias ctrpull="ctr -n k8s.io images pull --hosts-dir /etc/containerd/certs.d"' >> /etc/profile.d/custom_bash.sh

systemctl restart containerd
systemctl enable containerd --now

# Turn off and disable the firewalld.
systemctl disable ufw --now || true

# Modify related kernel parameters & Disable the swap.
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
modprobe br_netfilter
modprobe overlay

sysctl --system

# Add ipvs modules
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
overlay
EOF

systemctl restart systemd-modules-load.service

提示:containerd 镜像加速配置更多可参考:

containerd配置镜像加速器 containerd官方加速配置

提示:如上仅需在master01节点上操作,建议初始化完后进行重启。

shell 复制代码
root@master01:~# source kubeedgenodeenv.sh
root@master01:~# chmod +x *.sh

root@master01:~# for edge_ip in ${EDGE_ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${edge_ip}...\033[0m"
    sleep 2
    scp -rp /etc/hosts root@${edge_ip}:/etc/hosts
    scp -rp uk8spreconfig.sh root@${edge_ip}:/root/
    ssh root@${edge_ip} "bash /root/uk8spreconfig.sh"
  done

提示:如上仅需在master01节点上操作。

安装keadm

云端(CloudCore)部分需要设置云端节点,即 KubeEdge 主节点,边缘(EdgeCore)部分需要设置边缘端节点,即 KubeEdge 工作节点。

因此建议所有节点安装 keadm 工具。

shell 复制代码
root@master01:~# mkdir keadm
root@master01:~# cd keadm/
root@master01:~/keadm# KEADMVERSION=v1.20.0
root@master01:~/keadm# wget https://github.com/kubeedge/kubeedge/releases/download/${KEADMVERSION}/keadm-${KEADMVERSION}-linux-amd64.tar.gz
root@master01:~/keadm# tar -zxvf keadm-${KEADMVERSION}-linux-amd64.tar.gz
root@master01:~/keadm# cp keadm-${KEADMVERSION}-linux-amd64/keadm/keadm /usr/local/bin/keadm
root@master01:~/keadm# keadm version
version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"bae61505d4919c404665f70347ad0646aaa98958", GitTreeState:"clean", BuildDate:"2025-01-21T12:47:49Z", GoVersion:"go1.22.9", Compiler:"gc", Platform:"linux/amd64"}

分发keadm工具。

shell 复制代码
root@master01:~/keadm# source /root/kubeedgenodeenv.sh

root@master01:~/keadm# for edge_ip in ${EDGE_ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${edge_ip}...\033[0m"
    sleep 2
    scp -rp /usr/local/bin/keadm root@${edge_ip}:/usr/local/bin/keadm
  done

设置标签

本实验直接复用 Kubernetes master 的高可用,采用 VIP 对外暴露,因此规划将 CloudCore 部署在 master 节点。

keadm 底层基于 Kubernetes helm chart 进行部署,因此也支持通过 helm values 来创建自定义参数来控制部署情况。

shell 复制代码
root@master01:~/keadm# kubectl label nodes master0{1,2,3} cloudcore=enabled

安装CNI

默认边缘节点安装containerd并不会安装cni,需要手动额外安装。

同时需要配置calico网络以及手动分发相关calico证书,本实验直接从当前已存在的master01节点快速分发。

shell 复制代码
root@master01:~/keadm# source /root/kubeedgenodeenv.sh

root@master01:~/keadm# for edge_ip in ${EDGE_ALL_IPS[@]}
  do
    echo -e "\n\n\033[33m[INFO] >>> ${edge_ip}...\033[0m"
    sleep 2
    scp -rp /opt/cni/bin/* root@${edge_ip}:/opt/cni/bin/
    scp -rp /etc/cni/net.d/* root@${edge_ip}:/etc/cni/net.d/
  done

提示:也可参考如下手动安装cni:

shell 复制代码
root@master01:~/keadm# wget https://github.com/containernetworking/plugins/releases/download/v1.6.2/cni-plugins-linux-amd64-v1.6.2.tgz
root@master01:~/keadm# tar zxvf cni-plugins-linux-amd64-v1.6.2.tgz -C /opt/cni/bin

设置云端

使用 keadm init 设置 KubeEdge 主节点,即设置 CloudCore 端。

默认情况下边缘节点需要访问 cloudcore 中 10000 ,10002 端口。

  • 自定义部署
    创建自定义相关配置,然后进行部署。
shell 复制代码
root@master01:~/keadm# vim myvalues.yaml
cloudCore:
  replicaCount: 3
  nodeSelector:
    cloudcore: enabled
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      effect: NoSchedule

  modules:
    cloudHub:
      advertiseAddress:
        - "172.24.8.180"

    dynamicController:
      enable: true 

iptablesManager:
  nodeSelector:
    cloudcore: enabled
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      effect: NoSchedule

mosquitto:
  nodeSelector:
    cloudcore: enabled
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      effect: NoSchedule

root@master01:~/keadm# keadm init \
  --profile=myvalues.yaml \
  --kubeedge-version=v1.20.0 \
  --kube-config=/root/.kube/config

提示:keadm init 将安装并运行 cloudcore,生成证书并安装 CRD,同时提供了--set key=value 命令行参数,通过它可以设置特定的配置。也支持 helm 方式配置参数,官方默认的 helm chart 参数参考:cloudcore-values.yaml

  • 查看结果
    查看云端部署结果。
shell 复制代码
root@master01:~/keadm# kubectl -n kubeedge get all -owide

设置调度

在边缘节点添加至集群之前,建议设置调度策略,避免系统自带的 DaemonSet 调度到边缘节点。

主要需要设置的相关Pod有 calico-node ,kube-proxy 。

shell 复制代码
root@master01:~/keadm# 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"}]}]}}}}]'

root@master01:~/keadm# kubectl -n kube-system rollout restart daemonset kube-proxy calico-node

root@master01:~/keadm# kubectl -n kube-system get daemonset kube-proxy -o yaml | grep -A5 affinity
root@master01:~/keadm# kubectl -n kube-system get daemonset calico-node -o yaml | grep -A5 affinity

本实验持久存储 Longhorn 也存在 DaemonSet ,且 Longhorn 是基于 helm 部署,需要做如下调整:

shell 复制代码
root@master01:~/longhorn# vim myvalues.yaml
longhornManager:
  nodeSelector:
    longhorn-storage: enabled

  extraVolumeMounts:
    - name: timeconfig
      mountPath: /etc/localtime
      readOnly: true
  extraVolumes:
    - name: timeconfig
      hostPath:
        path: /etc/localtime

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role.kubernetes.io/edge
            operator: DoesNotExist

longhornDriver:
  nodeSelector:
    longhorn-storage: enabled

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role.kubernetes.io/edge
            operator: DoesNotExist

csi:
  plugin:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: node-role.kubernetes.io/edge
              operator: DoesNotExist
  attacher:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: node-role.kubernetes.io/edge
              operator: DoesNotExist
  provisioner:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: node-role.kubernetes.io/edge
              operator: DoesNotExist
  resizer:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: node-role.kubernetes.io/edge
              operator: DoesNotExist

longhornUI:
  replicas: 3
  nodeSelector:
    longhorn-ui: enabled
  tolerations:
    - key: node-role.kubernetes.io/control-plane
      effect: NoSchedule

  extraVolumeMounts:
    - name: timeconfig
      mountPath: /etc/localtime
      readOnly: true
  extraVolumes:
    - name: timeconfig
      hostPath:
        path: /etc/localtime

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role.kubernetes.io/edge
            operator: DoesNotExist
ingress:
  enabled: true
  ingressClassName: "nginx"
  host: "longhorn.linuxsb.com"
  path: /
  pathType: Prefix
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: longhorn-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
    nginx.ingress.kubernetes.io/proxy-body-size: 50m
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

root@master01:~/longhorn# helm upgrade --install longhorn longhorn/longhorn --create-namespace --namespace longhorn-system -f myvalues.yaml
root@master01:~/longhorn# kubectl -n longhorn-system rollout restart  daemonsets.apps engine-image-ei-db6c2b6f longhorn-csi-plugin longhorn-manager

设置边缘端

使用 keadm joini 设置 KubeEdge 边缘节点,即设置 EdgeCore 端。

默认情况下边缘节点需要访问 cloudcore 中 10000 ,10002 端口。

提示:

  1. --cloudcore-ipport 是必填参数。
  2. 加上 --token 会自动为边缘节点生成证书。
  3. 需要保证云和边缘端使用的 KubeEdge 版本相同。
  • 获取加入的token
    在云端获取token,然后在边缘端加入。
shell 复制代码
root@master01:~/keadm# keadm gettoken
2b299ac235ea1ae400a02dfd2442bafa57f5e7b1a0239a6551e7d5c8e6366ecd.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQwNDAzNjV9.v8fv9295l4OaqwISKpIDkRrA8FT-0y45VJRmSwgSJaY
  • 边缘节点join
shell 复制代码
root@edgenode01:~# keadm join --cloudcore-ipport=172.24.8.180:10000 \
 --token=2b299ac235ea1ae400a02dfd2442bafa57f5e7b1a0239a6551e7d5c8e6366ecd.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQwNDAzNjV9.v8fv9295l4OaqwISKpIDkRrA8FT-0y45VJRmSwgSJaY \
 --kubeedge-version=v1.20.0 --cgroupdriver=systemd --edgenode-name=edgenode01

root@edgenode02:~# keadm join --cloudcore-ipport=172.24.8.180:10000 \
 --token=2b299ac235ea1ae400a02dfd2442bafa57f5e7b1a0239a6551e7d5c8e6366ecd.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQwNDAzNjV9.v8fv9295l4OaqwISKpIDkRrA8FT-0y45VJRmSwgSJaY \
 --kubeedge-version=v1.20.0 --cgroupdriver=systemd --edgenode-name=edgenode02

边缘端优化

edgeStream用于边缘节点与云端的通信,建议开启。

shell 复制代码
root@edgenode01:~# vim /etc/kubeedge/config/edgecore.yaml
apiVersion: edgecore.config.kubeedge.io/v1alpha2
#......
modules:
#......
  edgeStream:
    enable: true
root@edgenode01:~# systemctl restart edgecore.service

root@edgenode02:~# vim /etc/kubeedge/config/edgecore.yaml
apiVersion: edgecore.config.kubeedge.io/v1alpha2
#......
modules:
#......
  edgeStream:
    enable: true
    
root@edgenode02:~# systemctl restart edgecore.service

确认验证

查看当前部署情况。

shell 复制代码
root@master01:~/keadm# kubectl get nodes -o wide
NAME         STATUS   ROLES           AGE   VERSION                    INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
edgenode01   Ready    agent,edge      62m   v1.30.7-kubeedge-v1.20.0   172.24.8.187   <none>        Ubuntu 24.04.2 LTS   6.8.0-57-generic   containerd://1.7.27
edgenode02   Ready    agent,edge      62m   v1.30.7-kubeedge-v1.20.0   172.24.8.188   <none>        Ubuntu 24.04.2 LTS   6.8.0-57-generic   containerd://1.7.27
master01     Ready    control-plane   8d    v1.32.3                    172.24.8.181   <none>        Ubuntu 24.04.2 LTS   6.8.0-56-generic   containerd://1.7.26
master02     Ready    control-plane   8d    v1.32.3                    172.24.8.182   <none>        Ubuntu 24.04.2 LTS   6.8.0-56-generic   containerd://1.7.26
master03     Ready    control-plane   8d    v1.32.3                    172.24.8.183   <none>        Ubuntu 24.04.2 LTS   6.8.0-56-generic   containerd://1.7.26
worker01     Ready    <none>          8d    v1.32.3                    172.24.8.184   <none>        Ubuntu 24.04.2 LTS   6.8.0-56-generic   containerd://1.7.26
worker02     Ready    <none>          8d    v1.32.3                    172.24.8.185   <none>        Ubuntu 24.04.2 LTS   6.8.0-56-generic   containerd://1.7.26
worker03     Ready    <none>          8d    v1.32.3                    172.24.8.186   <none>        Ubuntu 24.04.2 LTS   6.8.0-56-generic   containerd://1.7.26

查看当前KubeEdge的Pod。

shell 复制代码
root@master01:~/keadm# kubectl get pods -o wide -n kubeedge
NAME                           READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
cloud-iptables-manager-klqkb   1/1     Running   0          92m   172.24.8.182   master02     <none>           <none>
cloud-iptables-manager-v4np5   1/1     Running   0          92m   172.24.8.181   master01     <none>           <none>
cloud-iptables-manager-vknlw   1/1     Running   0          92m   172.24.8.183   master03     <none>           <none>
cloudcore-5cc47bd5c7-bfk9f     1/1     Running   0          92m   172.24.8.181   master01     <none>           <none>
cloudcore-5cc47bd5c7-x822x     1/1     Running   0          92m   172.24.8.182   master02     <none>           <none>
cloudcore-5cc47bd5c7-zh9z2     1/1     Running   0          92m   172.24.8.183   master03     <none>           <none>
edge-eclipse-mosquitto-hfl88   1/1     Running   0          64m   172.24.8.188   edgenode02   <none>           <none>
edge-eclipse-mosquitto-j8ft7   1/1     Running   0          64m   172.24.8.187   edgenode01   <none>           <none>

KubeEdge测试验证

调度测试

KubeEdge部署好之后,可以使用定向调度测试应用运行。

shell 复制代码
root@master01:~/keadm# cat > edgetest.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-edgename
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeName: edgenode01
      hostNetwork: true
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

root@master01:~/keadm# kubectl apply -f edgetest.yaml

root@master01:~/keadm# kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
nginx-edgename-75c465f8b9-hcxj7   1/1     Running   0          3m38s   172.24.8.187   edgenode01   <none>           <none>

访问: http://172.24.8.187 验证部署情况。

相关推荐
LCY1334 小时前
3.k8s是如何工作的
云原生·容器·kubernetes
LCY1336 小时前
4. k8s核心概念 pod deployment service
云原生·容器·kubernetes
weixin_399380697 小时前
k8s+helm部署tongweb7云容器版(by lqw)
云原生·容器·kubernetes
爱的叹息8 小时前
微服务的服务调用详解以及常见解决方案对比
微服务·云原生·架构
阿里云云原生11 小时前
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
云原生
Blockchain13 小时前
从头开始使用 Go 构建 Orchestrator(第十部分:重构)
kubernetes
Blockchain13 小时前
从头开始使用 Go 构建 Orchestrator(第 六部分:指标)
后端·kubernetes
Blockchain13 小时前
从头开始使用 Go 构建 Orchestrator(第 八部分:Manager API)
kubernetes
Blockchain13 小时前
从头开始使用 Go 构建 Orchestrator(第五部分:Worker 的 API)
后端·kubernetes