使用 KubeEdge 和 EdgeMesh 实现边缘复杂网络场景下的节点通信

2023年 7月 9日 65.3k 0

作者:吴波,来自北京的运维工程师,专注于云原生,KubeSphere 狂热爱好者。

简介

KubeEdge 是面向边缘计算场景、专为边云协同设计的业界首个云原生边缘计算框架,在 K8s 原生的容器编排调度能力之上实现了边云之间的应用协同、资源协同、数据协同和设备协同等能力,完整打通了边缘计算中云、边、设备协同的场景。其中 KubeEdge 架构主要包含云边端三部分:

  • 云上是统一的控制面,包含原生的 K8s 管理组件,以及 KubeEdge 自研的 CloudCore 组件,负责监听云端资源的变化,提供可靠和高效的云边消息同步。
  • 边侧主要是 EdgeCore 组件,包含 Edged、MetaManager、EdgeHub 等模块,通过接收云端的消息,负责容器的生命周期管理。
  • 端侧主要是 device mapper 和 eventBus,负责端侧设备的接入。

底层逻辑

KubeEdge 是 K8s 在边缘场景下的延伸。目标是将 K8s 对容器编排的能力延伸到边缘上;
KubeEdge 主要包含两个组件,云端的 CloudCore 和边缘节点上 EdgeCore,同时还有一个 Device 模块,用于管理海量的边缘设备。

KubeEdge 功能组件

  • Edged: 在边缘节点上运行并管理容器化应用程序的代理。
  • EdgeHub: Web 套接字客户端,负责与 Cloud Service 进行交互以进行边缘计算(例如 KubeEdge 体系结构中的 Edge Controller)。这包括将云侧资源更新同步到边缘,并将边缘侧主机和设备状态变更报告给云。
  • CloudHub: Web 套接字服务器,负责在云端缓存信息、监视变更,并向 EdgeHub 端发送消息。
  • EdgeController: kubernetes 的扩展控制器,用于管理边缘节点和 pod 的元数据,以便可以将数据定位到对应的边缘节点。
  • EventBus: 一个与 MQTT 服务器(mosquitto)进行交互的 MQTT 客户端,为其他组件提供发布和订阅功能。
  • DeviceTwin: 负责存储设备状态并将设备状态同步到云端。它还为应用程序提供查询接口。
  • MetaManager: Edged 端和 EdgeHub 端之间的消息处理器。它还负责将元数据存储到轻量级数据库(SQLite)或从轻量级数据库(SQLite)检索元数据。

KubeEdge

为了更好的支持 KubeEdge 并提供可视化界面管理边缘节点,本文档使用 KubeSphere 平台用来管理边缘节点,KubeSphere 官方文档。

配置云端(KubeEdge Master 节点)

1、启用 KubeEdge

使用 admin 身份访问 KubeSphere 控制台,进入集群管理,点击定制资源定义,找到 ClusterConfiguration,编辑 ks-install

  • 在该配置文件中找到 edgeruntimekubeedge,将 enabled 的值修改为 true
  • 修改 edgeruntime.kubeedge.cloudCore.cloudHub.advertiseAddress 的值设置为公网 IP 地址;
  • 完成后点击右下角的 " 确定 ",并检查 ks-installer 的日志查看部署状态。

    2、配置公网端口转发

    启动完成后使用如下命令即可看到 CloudCore 的 NodePort 端口。

    $ kubectl get svc -n kubeedge -l k8s-app=kubeedge
    NAME        TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                                                                           AGE
    cloudcore   NodePort   10.96.0.106           10000:30000/TCP,10001:30001/TCP,10002:30002/TCP,10003:30003/TCP,10004:30004/TCP   3m
    

    需要按照下列端口配置公网端口转发,将 10000-10004 端口转发到 NodePort 的 30000-30004 端口。

    字段 外网端口 字段 内网端口
    cloudhubPort 10000 cloudhubNodePort 30000
    cloudhubQuicPort 10001 cloudhubQuicNodePort 30001
    cloudhubHttpsPort 10002 cloudhubHttpsNodePort 30002
    cloudstreamPort 10003 cloudstreamNodePort 30003
    tunnelPort 10004 tunnelNodePort 30004

    如果有云厂商,则需要创建负载均衡按照上述表格的规则进行转发。
    如果没有云厂商,可以使用如下命令配置 iptables 规则进行端口转发:

    iptables -t nat -A PREROUTING -p tcp --dport 10000 -j REDIRECT --to-ports 30000
    iptables -t nat -A PREROUTING -p tcp --dport 10001 -j REDIRECT --to-ports 30001
    iptables -t nat -A PREROUTING -p tcp --dport 10002 -j REDIRECT --to-ports 30002
    iptables -t nat -A PREROUTING -p tcp --dport 10003 -j REDIRECT --to-ports 30003
    iptables -t nat -A PREROUTING -p tcp --dport 10004 -j REDIRECT --to-ports 30004
    

    3、配置 iptables 守护进程

    部署完成后,发现 DaemonSet 资源 iptables 未调度到 k8s-master 节点上,需要配置容忍 master 污点。

    $ kubectl get pod -o wide -n kubeedge
    NAME                               READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
    cloud-iptables-manager-q9bsx       1/1     Running   0          28m   172.20.1.12    k8s-node02                
    cloud-iptables-manager-vvpv8       1/1     Running   0          28m   172.20.1.11    k8s-node01                
    cloudcore-54b7f4f699-wcpjc         1/1     Running   0          70m   10.244.0.27    k8s-node02                
    edgeservice-855fdd8f94-8zd8k       1/1     Running   0          53m   10.244.0.42    k8s-node02                
    

    找到 " 应用负载 "-" 工作负载 "-" 守护进程集 ",编辑 "cloud-iptables-manager" 添加如下配置:

    kind: DaemonSet
    apiVersion: apps/v1
    metadata:
      name: cloud-iptables-manager
      namespace: kubeedge
    spec:
      template:
        spec:
          ......
          # 添加如下配置
          tolerations:
            - key: node-role.kubernetes.io/master
              operator: Exists
              effect: NoSchedule
    

    注:如果未修改以上配置,则在 KubeSphere 上无法对边缘节点的 Pod 查看日志和执行命令。

    配置完成后再次检查 iptables 守护进程是否已经调度到所有节点。

    $ kubectl get pod -o wide -n kubeedge
    NAME                               READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
    cloud-iptables-manager-q9bsx       1/1     Running   0          28m   172.20.1.12    k8s-node02                
    cloud-iptables-manager-vvpv8       1/1     Running   0          28m   172.20.1.11    k8s-node01                
    cloud-iptables-manager-zwmdg       1/1     Running   0          29m   172.20.1.10    k8s-master                
    cloudcore-54b7f4f699-wcpjc         1/1     Running   0          70m   10.244.0.27    k8s-node02                
    edgeservice-855fdd8f94-8zd8k       1/1     Running   0          53m   10.244.0.42    k8s-node02                
    

    配置边端(KubeEdge Node 节点)

    添加边缘节点文档:https://kubesphere.com.cn/docs/installing-on-linux/cluster-operation/add-edge-nodes/

    KubeEdge 支持多种容器运行时,包括 Docker、Containerd、CRI-O 和 Virtlet。有关更多信息,请参见 KubeEdge 文档。
    为了确保 KubeSphere 可以获取 Pod 指标,需要在边缘端安装 Docker v19.3.0 或更高版本。

    添加边缘节点

    到边缘端执行 KubeSphere 上复制过来的命令:

    arch=$(uname -m); if [[ $arch != x86_64 ]]; then arch='arm64'; fi;  curl -LO https://kubeedge.pek3b.qingstor.com/bin/v1.9.2/$arch/keadm-v1.9.2-linux-$arch.tar.gz 
     &&  tar xvf keadm-v1.9.2-linux-$arch.tar.gz 
     && chmod +x keadm && ./keadm join --kubeedge-version=1.9.2 --region=zh --cloudcore-ipport=1x.xx.xx.28:10000 --quicport 10001 --certport 10002 --tunnelport 10004 --edgenode-name edge-node-01 --edgenode-ip 192.168.1.63 --token c2d7e72e15d28aa3e2b9340b9429982595b527b334a756be919993f45b7422b1.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTY2NDU5NDJ9.bQeNr4RFca5GByALxVEQbiQpEYTyyWNzpDQVhm39vc8 --with-edge-taint
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 52.3M  100 52.3M    0     0  1020k      0  0:00:52  0:00:52 --:--:-- 1057k
    ./keadm
    install MQTT service successfully.
    kubeedge-v1.9.2-linux-amd64.tar.gz checksum:
    checksum_kubeedge-v1.9.2-linux-amd64.tar.gz.txt content:
    [Run as service] start to download service file for edgecore
    [Run as service] success to download service file for edgecore
    kubeedge-v1.9.2-linux-amd64/
    kubeedge-v1.9.2-linux-amd64/cloud/
    kubeedge-v1.9.2-linux-amd64/cloud/cloudcore/
    kubeedge-v1.9.2-linux-amd64/cloud/cloudcore/cloudcore
    kubeedge-v1.9.2-linux-amd64/cloud/iptablesmanager/
    kubeedge-v1.9.2-linux-amd64/cloud/iptablesmanager/iptablesmanager
    kubeedge-v1.9.2-linux-amd64/cloud/csidriver/
    kubeedge-v1.9.2-linux-amd64/cloud/csidriver/csidriver
    kubeedge-v1.9.2-linux-amd64/cloud/admission/
    kubeedge-v1.9.2-linux-amd64/cloud/admission/admission
    kubeedge-v1.9.2-linux-amd64/edge/
    kubeedge-v1.9.2-linux-amd64/edge/edgecore
    kubeedge-v1.9.2-linux-amd64/version
     
    KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -b
    

    查看边缘节点是否添加成功:

    $ kubectl get nodes
    NAME           STATUS   ROLES                  AGE   VERSION
    edge-node-01   Ready    agent,edge             23h   v1.21.4-kubeedge-v1.9.2
    k8s-master     Ready    control-plane,master   16d   v1.21.5
    k8s-node01     Ready                     16d   v1.21.5
    k8s-node02     Ready                     25h   v1.21.5
    

    边缘节点加入集群后,部分 Pod 在调度至该边缘节点上后可能会一直处于 Pending 状态。由于部分守护进程集(例如,Calico)有强容忍度,您需要使用以下脚本手动 Patch Pod 以防止它们调度至该边缘节点。

    #!/bin/bash
    NodeSelectorPatchJson='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/master": "","node-role.kubernetes.io/worker": ""}}}}}'

    NoShedulePatchJson='{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}}}}'

    edgenode="edgenode"
    if [ $1 ]; then
    edgenode="$1"
    fi

    namespaces=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $1}' ))
    pods=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $2}' ))
    length=${#namespaces[@]}

    for((i=0;i

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论