应对网络不可靠挑战,用 OpenYurt 实现边缘业务连续性

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
简介: 应对网络不可靠挑战,用 OpenYurt 实现边缘业务连续性

作者:陈璐、陈东


背景


OpenYurt 项目的使命是将 Kubernetes 在云端强大的管控能力下放到边缘测,把海量的异构边缘资源纳入进一个统一的边缘计算平台中。但边缘场景的一些特点并不符合为在云上运行而设计的 Kubernetes 的预设。这也正是 OpenYurt 需要解决的问题。边缘自治能力就是在这样的背景下诞生的。


与安全稳定的云上网络环境不同,在边缘场景中,边缘节点与云上的节点通常是不在一个网络平面内,需要通过公网与云端连接。公网连接带来了几方面的问题,比如高昂的公网流量成本,跨网域通信能力的需求以及本文所关注的公网连接的不稳定性问题。这些在 OpenYurt 体系里都得到了很好的解决。


我们今天主要想和大家分享 OpenYurt 社区针对最后一个问题的思考,以及针对其而设计的 OpenYurt 边缘自治能力。


Kubernetes 在不稳定网络环境下的问题


我们先看看原生 Kubernetes 在不稳定网络环境下会如何表现。当一个 Node 节点网络连接中断,那么接下来在 Kubernetes 集群会有一系列的动作来处理这个事件[1]


  1. Node 节点上的 kubelet 在 10s 内发现网络问题,并且更新 NodeStatus,但是由于网络断开无法上报到 Control Plane
  2. Control Plane 的 NodeLifeCycle Controller 在 40s 内接收不到 Node 的心跳,该节点状态被调整为 Not Ready,不会再有新的 Pod 调度到该节点上
  3. Control Plane 的 NodeLifeCycle Controller 在 5min 内接收不到 Node 的心跳,开始驱逐 Node 节点上所有的 Pod


当一个节点无法上报心跳,Kubernetes 集群据此判断该节点存在异常,作为异常资源它不再适合支持上层的应用。这样的做法对于数据中心里全天 24h 随时在线的机器是合适的,但在网络环境复杂的边缘场景里,这样的策略就有待商榷了。


首先,在一些边缘场景中,边缘节点需要主动地中断网络连接来支持断网维护的需求,此时原生 Kubernetes 会驱逐边缘容器,一些边缘组件也会由于 APIServer 无法连接,资源同步失败而报错,甚至退出,这显然是无法接受的。更深入一些,节点无法上报心跳这个现象背后可能有两方面的原因,要么是机器故障带着所有的 workload 一起挂掉了,要么是机器仍在正常运行但网络断连。Kubernetes 对这两种情况不做分别,直接将没有心跳的节点置为 Not Ready。但在边缘场景中,网络断连是一种常见的场景甚至需求,我们能不能分辨出这两类原因,仅在节点故障时才对 Pod 进行迁移重建。


其次,还有一类典型的边缘业务甚至要求在节点故障时也不要对 Pod 进行驱逐,它们需要将特定的 Pod 绑定到特定的节点上。比如图像处理的应用需要绑定到摄像头对应的机器上,智慧交通的应用需要固定在某个路口的机器上。这种与节点绑定的需求实际上违背了 Kubernetes 将底层资源与上层应用隔离开的设计理念,但这也是边缘业务确有的诉求,是需要 OpenYurt 来支持的。


最后,我们还需要考虑断网重启的情况。在原生 Kubernetes 架构下,Slave Agent(Kubelet) 的容器信息都保存在内存中,而断网状态下又无法从云端获取业务数据,如果此时边缘节点或者边缘节点的 Kubelet 发生异常重启,它们将无法进行业务容器恢复。


OpenYurt 边缘自洽能力保障业务持续运行


如果用一句话来总结边缘自治的需求,那就是保障弱网甚至断网环境下边缘业务的持续运行。而在 Kubernetes 体系下要实现这样的能力,我们需要解决以下几个问题:


  1. 节点异常或重启时,内存数据丢失,网络断连时业务容器无法恢复
  2. 网络长时间断连,云端控制器对业务容器进行驱逐
  3. 边缘业务如何绑定到特定边缘节点


OpenYurt 提供了从云到边一整套完整的解决方案来应对边缘自治的挑战。


边缘侧数据缓存

image.png

在边缘测,OpenYurt 引入了一个重要的组件——YurtHub。YurtHub 在边缘节点上提供 web 缓存及请求代理的的能力,节点上系统组件(如 kubelet)以及业务容器和云端通信都将经由该组件代理。


  1. 云边网络正常时,YurtHub 相当于一个带有数据缓存功能的“透明网关”,将请求转发到云端并缓存返回的数据。
  2. 云边网络断连时,YurtHub 将请求切流至本地缓存,使得边缘组件依然能成功获取资源。如果此时发生节点或组件重启,不需要依赖云端的数据,边缘业务可以通过本地数据缓存恢复。
  3. 与云端的通信恢复后,Yurthub 切流回云上的中心站点,本地缓存得以更新,代理请求恢复正常转发。


YurtHub 不仅优雅地解决了断网重启问题(问题1),而且这一层对 APIServer 额外的封装也拓展出了许多其他重要的 OpenYurt 能力[2]


中心式心跳代理机制

OpenYurt 对原生 Kubernetes 的 Pod 驱逐策略进行了一定程度的增强。在原生 Kubernetes 中,边缘节点心跳一定时间没有上报时,云端控制器将对节点上 Pod 进行驱逐(删除并在正常节点上重建)。云边协同场景下,边缘业务有不一样的需求。一些业务期待云边网络断连造成心跳无法上报时(此时节点本身正常),业务 Pod 可以保持(不发生驱逐),仅节点故障时才对 Pod 进行迁移重建。


OpenYurt 1.2 版本首创了基于 Pool-Coordinator+YurtHub 的中心式心跳代理机制,如下图:

image.png

  • 节点的云边网络正常时,Kubelet 通过 YurtHub 组件同时上报心跳到云端和 Pool-Coordinator 两处。
  • 节点的云边网络断连时,Kubelet 通过 YurtHub 组件上报心跳到云端失败,此时上报到 Pool-Coordinator 的心跳带上特定标签。
  • Leader YurtHub 会实时 list/watch pool-coordinator 中的心跳数据,当获得的心跳数据中带有特定标签时将帮助转发该心跳到云端。


通过 Pool-Coordinator 和 YurtHub 协同实现的心跳代理机制,保障了节点在云边网络断连状态下,心跳仍可继续上报到云端,从而保证节点上业务 Pod 不被驱逐(问题2)。同时心跳被代理上报的节点,也会被实时加上特殊的 taints,用于限制管控调度新 Pod 到该节点。


节点绑定

一些边缘业务要求在节点故障时也不对 Pod 进行驱逐,将业务绑定到节点上。OpenYurt 提供了两个角度来解决这个问题。


第一个角度从节点的角度出发,比如希望这个机器上的所有 Pod 都绑定到这台机器上。那么我们可以给这个节点打上标签 node.beta.openyurt.io/autonomy=true。


第二个角度是从业务出发,比如之前提到的智慧交通的业务希望它的生命周期和它运行的节点的生命周期保持一致。OpenYurt 1.2 版本新增了 apps.openyurt.io/binding 标签,如果 Pod 上带有这个标签,意味着这个 Pod 需要节点绑定的能力。


这两种方式实际上最终都是通过给对应 Pod 添加 toleration 实现绑定能力的。


总结


在边缘场景下,由于云边网络连接不稳定,需要边缘侧在缺少云端支持时有一定的自治能力。OpenYurt 基于原生 Kuberbetes 的架构,提出了一套非侵入式的解决方案,解决了边缘自治的几个痛点问题(节点断网重启,节点断网驱逐,节点业务绑定)。


OpenYurt 1.2 版本基于 Pool-Coordinator+YurtHub 的架构增强了边缘自治方面的能力。实际上边缘自治这个领域还有很大的想象空间,比如除了在断网状态下维持基本的 Pod 运行外,在后续版本中 OpenYurt 还会提供节点池的运维能力。欢迎有兴趣的同学来参与共建,共同探索一个稳定、可靠的无侵入云原生边缘计算平台的事实标准。


如果您对于 OpenYurt 有任何疑问,欢迎使用钉钉扫描二维码或者搜索群号加入钉钉交流群。(钉钉群号:12640034121)

image.png

相关链接🔗

[1] 一系列的动作来处理这个事件

https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/589-efficient-node-heartbeats/README.md

[2] 许多其他重要的 OpenYurt 能力

https://openyurt.io/zh/docs/core-concepts/yurthub/


点击此处,立即了解 OpenYurt 项目

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
消息中间件 存储 Cloud Native
云原生架构下的数据一致性挑战与应对策略####
本文探讨了在云原生环境中,面对微服务架构的广泛应用,数据一致性问题成为系统设计的核心挑战之一。通过分析云原生环境的特点,阐述了数据不一致性的常见场景及其对业务的影响,并深入讨论了解决这些问题的策略,包括采用分布式事务、事件驱动架构、补偿机制以及利用云平台提供的托管服务等。文章旨在为开发者提供一套系统性的解决方案框架,以应对在动态、分布式的云原生应用中保持数据一致性的复杂性。 ####
|
6月前
|
数据库 SQL 存储
使用合理的架构保障服务的韧性
【6月更文挑战第14天】 该文介绍了软件韧性的概念和目标,强调了主从模式在确保业务连续性中的作用。主从模式通过全同步、半同步和异步技术保证数据一致性和系统可用性。这种模式常用于读写分离,缓解数据库负载,是保障业务韧性的常见策略。
119 0
使用合理的架构保障服务的韧性
|
7月前
|
存储 架构师 安全
构建高效可靠的后端系统:挑战与应对
在当今数字化时代,后端系统作为支撑着各种网络服务和应用的核心组成部分,承担着巨大的压力和责任。本文探讨了构建高效可靠的后端系统所面临的挑战,并提出了应对这些挑战的策略和方法,旨在帮助开发人员和系统架构师更好地应对日益复杂的技术环境。
|
7月前
|
监控 安全 网络安全
云端防御:构建弹性云计算环境以应对网络安全挑战
【5月更文挑战第20天】 随着企业加速数字化转型,云计算服务成为支撑业务发展的关键基础设施。然而,云环境的开放性和共享性也带来了前所未有的安全威胁。本文旨在探讨如何通过实施综合的网络安全策略和技术措施,在确保数据和资源完整性、保密性的同时,增强云计算环境的安全性和抵御能力。我们将分析云计算中存在的安全风险,并提出相应的解决方案,包括身份验证、数据加密、入侵检测和响应等关键技术的应用。此外,文章还将讨论如何利用人工智能技术来提升安全防护效率,并展望云计算与网络安全融合发展的未来趋势。
|
运维
《云上业务稳定性保障实践白皮书》——二. 理论概念——2.2 故障
《云上业务稳定性保障实践白皮书》——二. 理论概念——2.2 故障
195 0
|
弹性计算 数据安全/隐私保护
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1游戏业务稳定性保障
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1游戏业务稳定性保障
151 0
|
弹性计算 运维 Kubernetes
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(3)
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(3)
239 0
|
调度 容器 Perl
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(4)
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(4)
184 0
|
监控 Kubernetes 负载均衡
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(5)
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(5)
147 0
|
存储 弹性计算 Cloud Native
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(2)
《云上业务稳定性保障实践白皮书》——五.行业客户稳定性保障实践——5.1 游戏业务稳定性保障——5.1.2 游戏容器化部署最佳实践(2)
264 0