添加边缘节点

KubeSphere 利用 KubeEdge 将原生容器化应用程序编排功能扩展到边缘的主机。KubeEdge 拥有单独的云端和边端核心模块,提供完整的边缘计算解决方案,但安装过程可能较为繁琐。

kubeedge_arch

备注

有关 KubeEdge 不同组件的更多信息,请参见 KubeEdge 文档

本教程演示如何将边缘节点添加到集群。

准备工作

  • 您需要启用 KubeEdge
  • 您有一个可用节点作为边缘节点,该节点可以运行 Ubuntu(建议)或 CentOS。本教程以 Ubuntu 18.04 为例。
  • 与 Kubernetes 集群节点不同,边缘节点应部署在单独的网络中。

配置边缘节点

您需要在边缘节点上安装容器运行时并配置 EdgeMesh。

安装容器运行时

KubeEdge 支持多种容器运行时,包括 Docker、containerd、CRI-O 和 Virtlet。有关更多信息,请参见 KubeEdge 文档

备注

如果您的边缘节点使用 Docker 作为容器运行时,为确保 KubeSphere 可以获取 Pod 指标,请务必在边缘节点上安装 Docker v19.3.0 或更高版本。

配置 EdgeMesh

执行以下步骤以在边缘节点上配置 EdgeMesh

  1. 编辑 /etc/nsswitch.conf

    1. vi /etc/nsswitch.conf
  2. 在该文件中添加以下内容。

    1. hosts: dns files mdns4_minimal [NOTFOUND=return]
  3. 保存文件并运行以下命令启用 IP 转发:

    1. sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
  4. 验证修改:

    1. sudo sysctl -p | grep ip_forward

    预期结果:

    1. net.ipv4.ip_forward = 1

创建防火墙规则和端口转发规则

若要确保边缘节点可以成功地与集群通信,您必须转发端口,以便外部流量进入您的网络。您可以根据下表将外网端口映射到相应的内网 IP 地址(主节点)和端口。此外,您还需要创建防火墙规则以允许流量进入这些端口(1000010004)。

备注

在 ks-installer 的 ClusterConfiguration中,如果您设置的是局域网地址,那么需要配置转发规则。如果您未配置转发规则,直接连接 30000 – 30004 端口即可。

字段外网端口字段内网端口
cloudhubPort10000cloudhubNodePort30000
cloudhubQuicPort10001cloudhubQuicNodePort30001
cloudhubHttpsPort10002cloudhubHttpsNodePort30002
cloudstreamPort10003cloudstreamNodePort30003
tunnelPort10004tunnelNodePort30004

添加边缘节点

  1. 使用 admin 用户登录控制台,点击左上角的平台管理

  2. 选择集群管理,然后导航至节点下的边缘节点

    备注

    如果已经启用多集群管理,则需要首先选择一个集群。

  3. 点击添加。在出现的对话框中,设置边缘节点的节点名称并输入其内网 IP 地址。点击验证以继续。

    备注

    • 内网 IP 地址仅用于节点间通信,您不一定要使用边缘节点的真实内网 IP 地址。只要 IP 地址验证成功,您就可以使用该 IP 地址。
    • 建议您勾选方框添加默认污点。
  4. 复制边缘节点配置命令下自动创建的命令,并在您的边缘节点上运行该命令。

    备注

    在运行该命令前,请确保您的边缘节点上已安装 wget

  5. 关闭对话框,刷新页面,您将看到边缘节点显示在列表中。

    备注

    添加边缘节点后,如果在边缘节点页面查看不到 CPU 和内存资源使用情况,请确保您的集群中已安装 Metrics Server 0.4.1 或以上版本。

收集边缘节点监控信息

如果需要收集边缘节点的监控信息,请先在ClusterConfiguration 中开启 metrics_server,以及在 KubeEdge 中开启 edgeStream

  1. 在 KubeSphere 控制台上,点击平台管理 > 集群管理

  2. 在左侧导航栏。点击定制资源定义

  3. 在右侧的搜索框中,输入 clusterconfiguration,并点击结果查看其详细页面。

  4. 点击 ks-installer 右侧的 添加边缘节点 - 图2,选择编辑 YAML

  5. 找到 metrics_server,将 enabledfalse 更改为 true

    1. metrics_server:
    2. enabled: true # 将“false”更改为“true”。
  6. 点击右下角的确定,保存配置。

  7. 进入 /etc/kubeedge/config 文件,搜索 edgeStream,将 false 更改为 true 并保存文件。

    1. cd /etc/kubeedge/config
    2. vi edgecore.yaml
    1. edgeStream:
    2. enable: true #将“false”更改为“true”。
    3. handshakeTimeout: 30
    4. readDeadline: 15
    5. server: xx.xxx.xxx.xxx:10004 #如果没有添加端口转发,将端口修改为30004。
    6. tlsTunnelCAFile: /etc/kubeedge/ca/rootCA.crt
    7. tlsTunnelCertFile: /etc/kubeedge/certs/server.crt
    8. tlsTunnelPrivateKeyFile: /etc/kubeedge/certs/server.key
    9. writeDeadline: 15
  8. 重启 edgecore.service

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

    1. #!/bin/bash
    2. NodeSelectorPatchJson='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/master": "","node-role.kubernetes.io/worker": ""}}}}}'
    3. NoShedulePatchJson='{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}}}}'
    4. edgenode="edgenode"
    5. if [ $1 ]; then
    6. edgenode="$1"
    7. fi
    8. namespaces=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $1}' ))
    9. pods=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $2}' ))
    10. length=${#namespaces[@]}
    11. for((i=0;i<$length;i++));
    12. do
    13. ns=${namespaces[$i]}
    14. pod=${pods[$i]}
    15. resources=$(kubectl -n $ns describe pod $pod | grep "Controlled By" |awk '{print $3}')
    16. echo "Patching for ns:"${namespaces[$i]}",resources:"$resources
    17. kubectl -n $ns patch $resources --type merge --patch "$NoShedulePatchJson"
    18. sleep 1
    19. done
  10. 如果仍然无法显示监控数据,执行以下命令:

    1. journalctl -u edgecore.service -b -r

    备注

    如果提示 failed to check the running environment: kube-proxy should not running on edge node when running edgecore,需要参考步骤 8 再次重启 edgecore.service

移除边缘节点

移除边缘节点之前,请删除在该节点上运行的全部工作负载。

  1. 在边缘节点上运行以下命令:

    1. ./keadm reset
    1. apt remove mosquitto
    1. rm -rf /var/lib/kubeedge /var/lib/edged /etc/kubeedge/ca /etc/kubeedge/certs

    备注

    如果无法删除 tmpfs 挂载的文件夹,请重启节点或先取消挂载该文件夹。

  2. 运行以下命令从集群中移除边缘节点:

    1. kubectl delete node <edgenode-name>
  3. 如需从集群中卸载 KubeEdge,运行以下命令:

    1. helm uninstall kubeedge -n kubeedge
    1. kubectl delete ns kubeedge

    备注

    卸载完成后,您将无法为集群添加边缘节点。