在上一篇监控问题排查的文章中,笔者分析了 KubeSphere 3.1.0 集成 KubeEdge 中的边缘监控原理和问题排查思路,在介绍 EdgeWatcher 组件时提到了“边缘节点的内网 IP 需要集群内唯一”这样的限制条件。本文就来深入分析一下这个问题,并尝试给各位边缘开发者提供一些解决的建议和思路。

正常场景

在边缘节点加入云端集群时,需要指定 “Node Name” 和 “Internal IP”,顾名思义,就是边缘节点的节点名称和内网 IP 地址。这里的内网 IP 地址就是本文的主题,该地址需要在集群内唯一。

KubeSphere 在 EdgeWatcher 中提供了用户指定的内网 IP是否被占用的验证功能。验证失败(IP 已被占用)的情况下,则不会为该边缘节点提供加入集群的命令行输出。下面两张图展示了验证成功和失败的场景。

验证成功:

验证失败:

可以说,KubeSphere 在这一点上已经做的非常用心了,给用户提供了 UI 的 “Validate” 按钮和后台 API,不管是直接使用还是基于 KubeSphere 的二次开发都会非常便捷。

非法场景

在上一节中展示了内网 IP 被占用的结果就是不能加入集群,因为该 IP 已经被注册在了 EdgeWatcher 中,不能再被其他边缘节点使用。

那么如果一个 IP 还没有被注册到 EdgeWatcher 中,也就是边缘节点没有被真正接入集群时,还是可以跳过这一步验证,将相同内网 IP 的两个边缘节点加入同一个集群中,制造这个非法的使用场景。

这个非法场景带来的问题就是:相同 IP 的“较早加入集群”的边缘节点在 logs exec 和 metrics 的功能上都会失效。即下图的运维功能都是没有数据的。

之前,笔者也在 KubeSphere 的开发者社区提过这个问题,同时也和负责边缘模块的社区开发者有过交流,确认了在 KubeSphere 的产品设计上,内网 IP 需要管理员或者用户自行按需进行规划,保证不重复。

潜在问题

私有部署的场景下,做到 IP 的统一规划是比较容易的。那么如果基于 KubeSphere 的边缘解决方案在公有云场景中会怎么样呢?

公有云用户不受规划限制,同时并发量比较大,出现“相同 IP 加入集群”这个问题的概率会非常大。最终会导致部分用户的 logs exec 和 metrics 功能失效,大量问题工单随之而来,用户黏度下降。所以公有云场景下,这个问题是必须要解决的,下面我们就详细分析一下问题的根本原因和解决思路。

根本原因

解决问题前,要把问题产生的根本原因摸清楚,这样才能有的放矢地去解决和处理问题。

在上一篇文章中,其实也简要介绍了 metrics 数据获取在 KubeEdge 边缘场景下的实现原理:kube-apiserver 上的 iptables 转发给云端的 Cloudcore,Cloudcore 通过和 Edgecore 之间的 WebSocket 通道向边缘端进行消息和数据传递。

logs 和 exec 功能的实现原理与 metrics 是一样的。下面这张图简要的描述了这几项功能在 KubeEdge 下的工作流程。

结合上面这张图的 cloudcore (KubeEdge 云端组件)的红色部分,来解释一下为什么内网 IP 需要集群内唯一。

边缘节点(edgecore,即 KubeEdge 边缘组件)在连接到云端集群时,和云端之间会建立一个 websocket 通道。云端为了后续通过该 websocket 通道和边缘节点通信,需要将这个通道作为 session 保存在云端。表现在数据结构上就是一个“内网 IP”为 key,session (websocket 通道)为 value 的 map。

看到这里,各位开发者应该就很容易理解了,如果内网 IP 相同,则会覆盖较早加入集群的边缘节点的 session 记录。这时云端去查找“被覆盖了 session 的边缘节点”上 POD 的监控和运维数据,肯定是找不到的。

问题的根本原因找到了,解决的思路也就比较明确了,下一小节笔者简单阐述下这个问题的解决思路。

下图是在 KubeEdge 的边缘场景下,logs 功能的时序图,感兴趣的开发者可以进一步了解。

解决思路

上一节梳理清楚了根本原因,解决思路也就比较清晰明了。本着非侵入式的改造原则,尽量少改动 KubeSphere 和 KubeEdge,对上层业务逻辑进行增强和扩展是笔者心目中的最佳选择。

既然根本原因是 IP 冲突导致 session 被覆盖,那就很自然的想到提供集群内不重复 IP 的分配服务,也就是常说的 IPAM。在云端的业务逻辑层引入 IPAM 服务,为用户边缘节点提供集群内唯一的 IP 分配能力。

同时还需要关注一点的是,IPAM 服务分配出来的唯一 IP 属于内部实现,不能当作 “Internal IP” 展示给用户。用户看到的边缘节点内网 IP 地址仍然是用户自行规划和填写的 IP,只不过改造后的内网 IP 不再作为 session 的 key,也不再需要进行冲突查验,只在页面上展示方便用户搜索,提高产品的易用性。

下面就是该思路下的节点加入流程图,供各位开发者参考。

根据上面的流程图,笔者也大概罗列一下上述解决方案,需要修改的点:

  1. 新建集群内 IPAM 服务,提供分配,回收 IP 等功能,注意并发处理。
  2. 新建业务层节点服务,提供节点名称,展示用 IP,唯一 IP 等持久化能力。
  3. 修改 keadm 和 edgecore,支持 node IP 可选
  4. 修改 cloudcore,在节点注册时通过节点名称查询唯一 IP,作为 Internal IP 注册节点。
  5. 在业务层北向接口隐藏唯一 IP(K8s 上的 internal IP),替换成用户输入的展示 IP。

后记

通过对现象和原理的分析,我们提出了在公有云环境下基于 KubeSphere 的边缘节点 IP 冲突问题的解决方案。限于笔者的技术能力,有可能还存在着更为简单有效的解决办法,欢迎各位开发者提出宝贵意见,让我们一起把基于 KubeSphere 的边缘解决方案做大做强。

本文由博客一文多发平台 OpenWrite 发布!

KubeSphere 边缘节点 IP 冲突的分析和解决思路分享的更多相关文章

  1. Maven依赖版本冲突的分析及解决小结

    1:前言 做软件开发这几年遇到了许多的问题,也总结了一些问题的解决之道,之后慢慢的再遇到的都是一些重复性的问题了,当然,还有一些自己没有完全弄明白的问题.如果做的事情是重复的,遇到重复性问题的概率也就 ...

  2. Maven 3-Maven依赖版本冲突的分析及解决小结 (阿里,美团,京东面试)

    举例A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过<scope>等若干种方式控制传递依赖).这里 ...

  3. Maven 3-Maven依赖版本冲突的分析及解决小结

    我自己遇到了一个问题: 我需要使用一个api,这个api已经引入包:slf4j-log4j12 所以,在自己的pom中,如果引入了这个包,需要exclude掉: 因为在pom.xml中查询是找不到的, ...

  4. Linux load average负载量分析与解决思路

    一.load average top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载.系统平均负载表示 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或 ...

  5. Ajax跨越问题原因分析与解决思路

    1.什么是AJAX跨域问题 简单来说,就是前端调用后端服务接口时 如果服务接口不是同一个域,就会产生跨域问题 2.AJAX跨域场景 前后端分离.服务化的开发模式 前后端开发独立,前端需要大量调用后端接 ...

  6. 边缘节点 如何判断CDN的预热任务是否执行完成刷新 路由追踪 近期最少使用算法

    阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络.阿里云CDN分担源站压力,避免网络拥塞, ...

  7. 从 lite-apiserver 看 SuperEdge 边缘节点自治

    引言 在 SuperEdge 0.2.0版本中,lite-apiserver 进行了重大的架构升级和功能增强.本文将从 lite-apiserver 实现及其与其它 SuperEdge 组件协同的角度 ...

  8. 局域网内IP冲突怎么办

      对于在Internet和Intranet网络上,使用TCP/IP协议时每台主机必须具有独立的IP地址,有了IP地址的主机才能与网络上的其它主机进行通讯.但IP地址冲突会造成网络客户不能正常工作,只 ...

  9. CDN边缘节点容器调度实践(下)

    5月27日,OSC 源创会在上海成功举办.又拍云系统开发高级工程师黄励博在大会分享了<CDN 边缘节点容器调度的实践>.主要介绍又拍云自主开发的边缘节点容器调度方案,从 0 到 1 ,实现 ...

  10. CDN之多边缘节点负载均衡--学习笔记

    一.剧情 剧情是这样的,本次的多边缘节点负载均衡实验,1个LVS四层负载均衡集群和1个Nginx为反向代理的七层负载均衡集群,由Bind dns解析作为 主负载均衡服务器,调度两个集群,中间层有一台W ...

随机推荐

  1. 大语言模型(LLM)运行报错:cannot import name 'AutoModel' from 'transformers'

    解决方法: 安装pytorch即可,不过需要注意项目的README文件和requirements文件,安装对应版本的pytorch即可.

  2. AI领域的国产显卡如何在现有技术下吸引用户 —— 廉价增加显存 —— 大显存

    先给出一个不大准确的但相差不差的背景介绍: 同样性能级别的显卡,NVIDA的24G的要3W,32G的要5W,48G的要7W, 80G的要10W. 国产同同性能的显卡32G的要10W,48G的要15W, ...

  3. 一群伪专家讨论“motherland”和“fatherland”,说说个人的观点

    看了一个视频: 中国的文化里在找妈,美国的文化里在找爸!如何真正教育子女? ============================================= ================ ...

  4. 如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)

    1.背景 很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了 2.实现逻辑 1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名 ...

  5. Potplayer+Alist+网盘,实现网盘视频免费在线看4K杜比HDR

    Potplayer+Alist+网盘,实现网盘视频免费在线看4K杜比HDR 引言 最近刷视频看到了一个方法可以通过alist挂载网盘,配合potplayer可实现超高画质免费在线观看视频,这里发一下配 ...

  6. 一次生产环境mysql迁移操作(二)mysql空间释放(碎片整理)

    一次生产环境mysql迁移操作(一)数据归档 一次生产环境mysql迁移操作(二)mysql空间释放(碎片整理) 上文中增加了定时归档,现在一些大表磁盘空间一直不释放,导致数据库文件越来越大.现在介绍 ...

  7. TrueType 和 OpenType 的关系

    OpenType 和 TrueType 都是字体文件格式,它们用于在数字设备中存储和渲染文本.虽然这两种格式都广泛使用,但它们在设计和功能上有一些重要区别. TrueType 是由苹果公司和微软公司在 ...

  8. Linux 扩展磁盘分区

    之前安装 Ubuntu 虚拟机时使用的都是默认配置,虚拟机硬盘分配了 60 GB.后来想要扩容,特此记录一下扩容过程. 在操作前请做好备份 首先在 VMware 中修改虚拟硬盘大小. 然后进入虚拟机, ...

  9. drawable xx should not reference itself

    背景: 在Android中新增一个xx.xml,在layer-list 的item中设定引入的drawable后,报这个提示(xx不能引用自身) 原因: 这个错误其实很离谱,但是还是有必要记一下,万一 ...

  10. 用描述程序的方式emo,扎心了...

    用描述程序的方式emo,扎心了... 众所周知写程序是个枯燥无聊的过程,再加上生活的不顺与坎坷,当程序语言与emo结合起来,看谁还说程序员不懂感情! 首当其冲的就是循环语句了 世界上最寂寞的感觉,是我 ...