当前位置: 首页 > 工具软件 > FabEdge > 使用案例 >

KubeEdge+Fabedge集成环境搭建教程

马坚
2023-12-01

KubeEdge+Fabedge集成环境搭建教程

KubeEdge 是一个开源的系统,可将本机容器化应用编排和管理扩展到边缘端设备。 它基于Kubernetes构建,为网络和应用程序提供核心基础架构支持,并在云端和边缘端部署应用,同步元数据。KubeEdge 还支持 MQTT 协议,允许开发人员编写客户逻辑,并在边缘端启用设备通信的资源约束。KubeEdge 包含云端和边缘端两部分。

FabEdge是一个专门针对边缘计算场景设计的,基于kubernetes的容器网络方案,它符合CNI规范,可以无缝集成任何K8S环境,解决边缘计算场景下云边协同,边边协同,服务发现等难题。

参考文档:https://gitee.com/mirrors/FabEdge/tree/main/docs

结合官方所给文档,我将自己部署过程出现过的问题和步骤都总结了一下。

部署Kubernetes和Kubeedge

这里官方给出了一键部署的脚本供我们使用。

安装条件

遵循 kubeadm的最低要求 ,Master && Node 最低2C2G,磁盘空间不小于10G;

⚠️注意:尽可能使用干净的系统,避免其他因素引起安装错误。

支持的操作系统

Ubuntu 18.04 (官方推荐使用,我使用的是centos7最小化安装版
Ubuntu 20.04
CentOS 7.9
CentOS 7.8

部署k8s集群

安装k8s Master 节点

在主节点也就是master节点上运行以下指令:

sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/install-k8s.sh | bash -

⚠️注意:如果加载时间过长,有可能网速较慢,请耐心等待(确实很长时间,第一个包下1.2G花了半个小时)

安装过程可能出现以下问题:

  1. “msg”: "Timeout (12s) waiting for privilege escalation prompt: "}

这个问题上网查了一下,我的解决方法是每个节点都手动配置一下hosts

vi /etc/hosts
#添加以下信息,前面为ip地址,后面为节点名
192.168.230.143 master   
192.168.230.144 edge1
192.168.230.145 edge2
  1. 解决上述问题后,重新输入了脚本安装指令,提示下面的信息
2021-11-29 04:04:21,419 INFO {'playbook': '/opt/ansible/pre-deploy.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,419 INFO {'playbook': '/opt/kubespray/cluster.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,420 INFO {'playbook': '/opt/ansible/post-deploy.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,420 INFO {'playbook': '/opt/ansible/cloudcore.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,420 INFO {'playbook': '/opt/ansible/iptables-persistent.yml', 'rc': 0} has been deployed, skipped.

这个问题我自己感觉应该是已经安装好了,但是输入kubectl get node他提示没有找到指令:kubectl
不知道是什么问题造成的没有安装上kubelet,于是我使用了万能的重启大法

reboot

重启之后再进行了一遍安装,还是提示这个错误,但是等了一会kubectl就能用了。

# kubectl get nodes

NAME     STATUS   ROLES         AGE     VERSION
master   Ready    master,node   3h19m   v1.19.7

如果有出现以下信息,表示安装成功:

PLAY RECAP *********************************************************************
master : ok=15 changed=13 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

添加k8s边缘节点(还是在master节点操作)

sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/add-edge-node.sh | bash -s -- --host-vars ansible_hostname={hostname} ansible_user={username} ansible_password={password} ansible_host={edge-node-IP}

参数说明:
ansible_hostname 指定边缘节点的主机名
ansible_user 配置边缘节点的用户名
ansible_password 配置边缘节点的密码
ansible_host 配置边缘节点的IP地址

例如:设置边缘节点的主机名为edge1、用户名是root、密码是root、IP为192.168.230.144,指令如下:

sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/add-edge-node.sh | bash -s -- --host-vars ansible_hostname=edge1 ansible_user=root ansible_password=root ansible_host=192.168.230.144

如果出现以下信息,表示安装成功:
PLAY RECAP *********************************************************************
edge1 : ok=13 changed=10 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

确认节点添加成功

sudo kubectl get node

NAME     STATUS   ROLES         AGE     VERSION
edge1    Ready    agent,edge    3h16m   v1.19.3-kubeedge-v1.5.0
master   Ready    master,node   3h19m   v1.19.7

继续添加其他子节点

sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/add-edge-node.sh | bash -s -- --host-vars ansible_hostname=edge2 ansible_user=root ansible_password=root ansible_host=192.168.230.145

PLAY RECAP *********************************************************************
edge2 : ok=13 changed=10 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

# kubectl get nodes

NAME     STATUS   ROLES         AGE     VERSION
edge1    Ready    agent,edge    3h20m   v1.19.3-kubeedge-v1.5.0
edge2    Ready    agent,edge    45s     v1.19.3-kubeedge-v1.5.0
master   Ready    master,node   3h23m   v1.19.7

部署FabEdge

前置条件

  • Kubernetes (v1.19.7)
  • Calico (v3.16.5)
  • KubeEdge (v1.8.0)
    (我们前面步骤已经一键快速部署好了)
  1. 确保所有边缘节点能够访问云端connector
  • 如果有防火墙或安全组,必须允许ESP(50),UDP/500,UDP/4500
  1. 确认所有边缘节点nodelocaldns正常运行

    $ kubectl get po -n kube-system -o wide -l "k8s-app=nodelocaldns"
    nodelocaldns-4m2jx                   1/1     Running     0    25m    10.22.45.30    master           
    nodelocaldns-p5h9k                   1/1     Running     0    35m    10.22.45.26    edge1      
    
  2. 确认所有边缘节点没有运行任何calico的组件

    $ kubectl get po -n kube-system -o wide | grep -i calico
    calico-kube-controllers-8b5ff5d58-ww4nq         1/1     Running     0          7d18h   10.22.45.30     master1   <none>           <none>
    calico-node-cxbd9                               1/1     Running     0          7d18h   10.22.45.30     master1   <none>           <none>
    
  3. 安装helm

    $ wget https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz
    $ tar -xf helm-v3.6.3-linux-amd64.tar.gz
    $ cp linux-amd64/helm /usr/bin/helm 
    
  4. 获取当前集群配置信息,供后面使用

    $ curl -s http://116.62.127.76/get_cluster_info.sh | bash -
    This may take some time. Please wait.
    
    clusterDNS               : 169.254.25.10
    clusterDomain            : root-cluster
    cluster-cidr             : 10.233.64.0/18
    service-cluster-ip-range : 10.233.0.0/18
    

配置calico

  1. 修改calico pool配置

    $ vi ippool.yaml
    apiVersion: projectcalico.org/v3
    kind: IPPool
    metadata:
      name: fabedge
    spec:
      blockSize: 26
      cidr: 10.10.0.0/16
      natOutgoing: false
      disabled: true
      ipipMode: Always
    

    cidr是一个用户自己选定的大网段,每个边缘节点会从中分配一个小网段,不能和get_cluster_info脚本输出的cluster-cidr或service-cluster-ip-range冲突。

  2. 创建calico pool

    $ calicoctl.sh create --filename=ippool.yaml
    $ calicoctl.sh get pool  # 如果有fabedge的pool说明创建成功
    NAME           CIDR             SELECTOR   
    default-pool   10.231.64.0/18   all()      
    fabedge        10.10.0.0/16     all()
    
    # 如果提示没有calicoctl.sh命令,请尝试以下指令
    $ export DATASTORE_TYPE=kubernetes
    $ export KUBECONFIG=/etc/kubernetes/admin.conf
    $ calicoctl create --filename=ippool.yaml
    $ calicoctl get pool    # 如果有fabedge的pool说明创建成功
    NAME           CIDR             SELECTOR   
    default-pool   10.231.64.0/18   all()      
    fabedge        10.10.0.0/16     all()
    

部署FabEdge

  1. 在云端选取一个运行connector的节点,并为节点做标记。以master为例,

    $ kubectl label no master node-role.kubernetes.io/connector=
    
    $ kubectl get node
    NAME     STATUS   ROLES                   AGE     VERSION
    edge1    Ready    agent,edge              3h27m   v1.19.3-kubeedge-v1.5.0
    edge2    Ready    agent,edge              8m31s   v1.19.3-kubeedge-v1.5.0
    master   Ready    connector,master,node   3h31m   v1.19.7
    
    

    选取的节点要允许运行普通的POD,不要有不能调度的污点,否则部署会失败。

  2. 所有边缘节点添加一个标签

    $ kubectl label node --overwrite=true edge1 node-role.kubernetes.io/edge=
    
    $ kubectl label node --overwrite=true edge2 node-role.kubernetes.io/edge=
    
  3. 准备helm values.yaml文件

    $ vi values.yaml
    operator:
      edgePodCIDR: 10.10.0.0/16   
      connectorPublicAddresses: 10.22.46.48 
      connectorSubnets: 10.233.0.0/18
      edgeLabels: node-role.kubernetes.io/edge
      enableProxy: true
      
    cniType: calico 
    

    说明:

    edgePodCIDR:使用上面创建的calico pool的cidr。

    connectorPublicAddresses: 前面选取的,运行connector服务的节点的地址,确保能够被边缘节点访问。

    connectorSubnets: 云端集群中的pod和service cidr,get_cluster_info脚本输出的service-cluster-ip-range。

    edgeLables:前面为边缘节点添加的标签,默认是node-role.kubernetes.io/edge

    cniType: 云端集群中使用的cni插件类型,当前支持calico。

  4. 安装FabEdge

    $ helm install fabedge --create-namespace -n fabedge -f values.yaml http://116.62.127.76/fabedge-0.3.0.tgz
    

    如果出现错误:“Error: cannot re-use a name that is still in use”,是因为fabedge helm chart已经安装,使用以下命令卸载后重试。

    $ helm uninstall -n fabedge fabedge
    release "fabedge" uninstalled
    

配置边缘节点

  1. 每个边缘节点上修改edgecore配置文件

    $ vi /etc/kubeedge/config/edgecore.yaml
    
    # 必须禁用edgeMesh
    edgeMesh:
      enable: false
    
    edged:
        enable: true
        cniBinDir: /opt/cni/bin
        cniCacheDirs: /var/lib/cni/cache
        cniConfDir: /etc/cni/net.d
        networkPluginName: cni
        networkPluginMTU: 1500
        # get_cluster_info脚本输出的clusterDNS
        clusterDNS: "169.254.25.10"
        # get_cluster_info脚本输出的clusterDomain
        clusterDomain: "root-cluster"
    
  2. 每个边缘节点上重启edgecore

    $ systemctl restart edgecore
    

部署后验证

  1. 管理节点上确认边缘节点就绪

    [root@master ~]# kubectl get node
    NAME     STATUS   ROLES                   AGE     VERSION
    edge1    Ready    agent,edge              3h37m   v1.19.3-kubeedge-v1.5.0
    edge2    Ready    agent,edge              18m     v1.19.3-kubeedge-v1.5.0
    master   Ready    connector,master,node   3h41m   v1.19.7
    
  2. 管理节点上确认FabEdge服务正常启动

    [root@master ~]#  kubectl get po -n fabedge
    NAME                                READY   STATUS      RESTARTS   AGE
    cert-rf795                          0/1     Completed   0          5m28s
    connector-5db569b98b-7wv5b          2/2     Running     0          5m10s
    fabedge-agent-edge1                 2/2     Running     0          4m53s
    fabedge-agent-edge2                 2/2     Running     0          4m53s
    fabedge-operator-869dc7dbff-fvcxd   1/1     Running     0          5m10s
    

常见问题

  1. 有的网络环境存在非对称路由,需要在云端节点关闭rp_filter

    $ for i in /proc/sys/net/ipv4/conf/*/rp_filter; do  echo 0 >$i; done
    
    #保存配置
    $ vi /etc/sysctl.conf
    net.ipv4.conf.default.rp_filter=0
    net.ipv4.conf.all.rp_filter=0
    

后续问题待补充…


 类似资料: