热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【周周有奖】云原生编程挑战赛“边缘容器”赛道邀你来战!

第三届云原生编程挑战赛是由阿里云、Intel主办,云原生应用平台、天池联合承办的云原生顶级赛事。自2015年开始,大赛已经成功举办了七届,共吸引了超过36000支队伍,覆盖10余个

第三届云原生编程挑战赛是由阿里云、Intel 主办,云原生应用平台、天池联合承办的云原生顶级赛事。自 2015 年开始,大赛已经成功举办了七届,共吸引了超过 36000 支队伍,覆盖 10 余个国家和地区,为全球热爱技术的年轻人提供了一个探索云原生技术、挑战难题的舞台。

在云原生实践不断深化的过程中我们发现,随着边缘设备和边缘业务的规模增长,以及业务创新带来的频繁变更,在云边协同的边缘场景架构体系下,“云边协同”正在面临巨大的管理效率和成本挑战。

作为本次大赛三大热门技术领域之一,“边缘容器”赛道的发起就希望在这样的背景下,通过集结关注、热爱云原生的开发者的智慧、技术和能量,探索研究如何在云边协同的边缘场景架构体系下,降低边缘侧组件的资源占用率,实现一个高效的边缘自治方案。

现在,云原生编程挑战赛“边缘容器赛题”已经吹响集结号,全面开放报名,等待有能力、有魄力、有活力的开发者们前来挑战!


参与边缘容器赛道挑战,瓜分 170,000 元现金奖励

本次大赛面向全球开放,大赛分为初赛和决赛,各赛道初赛 TOP6 战队入围决赛答辩。最终排行将根据初赛及决赛答辩成绩综合得出。

1.png


专属赛道奖励,周周送不停

除了云原生编程大赛官方奖励,为了鼓励更多开发者参与边缘容器赛道挑战,即日起,成功提交赛题任务并在每周排行榜中位列 Top 1 的用户,均将获得云原生边缘容器开源平台 OpenYurt 定制随行杯一个!(每人限一次)

2.png


明星导师

3.png

张杰,阿里云云原生技术专家,CNCF OpenYurt 开源社区核心成员


赛题解析


赛题背景

ACK@Edge 是阿里云容器服务针对边缘计算场景推出的云边一体化云原生解决方案,主打“云端托管、边缘自治”的产品理念,为用户提供云边多维度协同,海量异构算力管理,边缘 AI 套件,可观测,轻量化,弹性等能力。现已广泛应用于边缘云、物联网等典型边缘计算场景,覆盖交通、能源、新零售、智慧驾驶、CDN 等多个行业。同时,ACK@Edge 依托 CNCF OpenYurt 强大的社区生态,积极参与并协同社区持续打磨和完善设备孪生、云边协同网络、高可用等领先技术能力。

4.png

为了解决在边缘计算场景下云边网络通信断连时,保证边缘侧节点上业务可以自愈,OpenYurt 在边缘侧组件和 APIServer 之间新增 YurtHub 组件。边缘侧的组件(kubelet,kube-proxy..)对 api server 的请求,会首先经过 YurtHub 组件的然后再转发给 api server,YurtHub 会将 api server 返回的数据缓存到本地。当云边网络断开时,Yurthub 还能将本地缓存的数据返回给边缘侧组件。

但是在实践过程中我们发现,在云边协同的边缘场景架构体系下,有着大量的轻量级的设备,这些设备的配置相对比较低,降低边缘侧组件的资源占用率,为设备上的业务腾出更多的资源,已经成为了必须要解决的问题。

本赛题希望实现一个边缘侧的 edge-proxy 组件,负责转发边缘侧组件例如 kubelet,kube-proxy 的请求,同时能够将云上 api server 返回的数据进行过滤,同时在返回给请求端时可以缓存到本地,并尽可能的降低 cpu,内存等资源占用率。


赛题解析

在 Kubernetes 系统中,list/watch 机制主要解决组件间实时数据的异步同步。其中 List 请求是普通的 HTTP GET 请求,一次 List 请求将返回请求类型资源的全量数据。而 watch 请求是基于 HTTP 协议的 chunked 机制实现的长连接,用于实时通知请求资源的数据变化。相关的介绍可以参考:

https://kubernetes.io/docs/reference/using-api/api-concepts/

List/Watch 机制是 Kubernetes 中实现集群控制模块最核心的设计之一,它采用统一的异步消息处理机制,保证了消息的实时性、可靠性、顺序性和性能等,为声明式风格的 API 奠定了良好的基础。Informer 模块是 Kubernetes 中的基础组件,负责各组件与 api server 的资源与事件同步。Kubernetes 中的组件,如果要访问 Kubernetes 中的 Object,绝大部分情况下会使用 Informer 中的 Lister()方法,而非直接请求 Kubernetes API。

5.png

client-go:

Reflector:reflector 用来 watch 特定的 K8s API 资源。具体的实现是通过 ListAndWatch 的方法,watch 可以是 K8s 内建的资源或者是自定义的资源。当 reflector 通过 watch API 接收到有关新资源实例存在的通知时,它使用相应的 list API 获取新创建的对象,并将其放入 watchHandler 函数内的 Delta Fifo 队列中。

Informer:informer 从 Delta Fifo 队列中弹出对象。执行此操作的功能是 processLoop。base controller 的作用是保存对象以供以后检索,并调用我们的控制器将对象传递给它。

Indexer:索引器提供对象的索引功能。典型的索引用例是基于对象标签创建索引。Indexer 可以根据多个索引函数维护索引。Indexer 使用线程安全的数据存储来存储对象及其键。


云边挑战

上述 List watch 机制适合在网络通信质量比较好的数据中心内运行, 但是在云边场景,云边网络连接不可靠的情况下带来很大的挑战。以 kubelet 为例,若 kubelet 与云上的 api Server 网络断开, 此时主机发送了重启, 按照 list-watch 的逻辑, kubelet  要首先通过 api Server list 全量属于本主机上的 pod 数据, 然后再通过 CRI 接口对 POD 进行重建,由于云边网络断开,kubelet 无法通过 list 机制获取本主机上的 pod 数据,自然无法对 pod 进行重建,导致业务无法正常运行。


解决方案

因此我们需要在边缘侧新增一个组件 edge-proxy, edge-proxy 组件包含能力主要有边缘组件(如 kubelet 等)的 pods, configmaps 的 list/watch 请求的转发,以及对 kube-api server 返回 response 的过滤和缓存处理。总结一句话就是实现一个带有数据过滤和缓存功能的 7 层反向代理。不过这里的 7 层请求是 Kubernetes 系统中定制的 List/Watch 请求。同时 edge-proxy 在离线状态下还能返回 kubelet ,kube-proxy 这些边缘侧组件 list-watch 的数据,充当离线的 api Server。

7 层请求的代理转发,如果云边网络通信正常时,请求需要转发到云端 kube-apiserver。而当云边网络断连时,list 请求需要返回本地的缓存数据。

kube-apiserver 返回 response 的过滤和缓存处理,首先返回给请求端的数据应该过滤完成的。而缓存和过滤的处理先后顺序并没有要求,选手可以根据自身需求来决定。但是需要注意 List/Watch 请求的 response 数据不太一样,List 请求的 response 中可以一次性读取出全量数据,而 Watch 请求属于云端实时推送,是长连接,当云端有数据变化时,才能从 response 中读取云端推送过来的变化数据。不管是 List,还是 Watch 请求,edge-proxy 都需要返回给请求方过滤好之后的数据。

同时针对大规模 response 数据的过滤,缓存,以及返回等功能,如何高效且实时的处理,将直接影响到处理的效率,以及 edge-proxy 消耗的资源。


解题思路

实现一个带数据过滤和缓存功能的 7 层反向代理:



  • 当接收到 List 请求时,可以考虑直接转发到云端 kube-apiserver。当请求转发失败时(网络断开),则使用本地缓存数据返回到请求方。当然需要保证返回数据是符合过滤需求的。

  • 针对 http.Response 数据的缓存和返回处理,尽可能实现并行处理,这样减少对返回处理的阻塞,从而可能获得更好的处理效率。

  • http.Response 数据的过滤处理建议可以在缓存前执行。当云边网络断连时,从本地缓存返回的数据将不需要进行二次过滤。

  • Watch 请求的 http.Response 数据是 chunked 机制的实时数据推送,可以考虑采用类似流数据的处理方案来解决。


如何拿到好成绩

最终成绩由数据正确性和处理效率来决定,建议在保证正确性的基础上,可以各类优化手段(如乐观锁等)来提升处理效率。期待各位选手都取得自己满意的成绩。

点击此处,立即报名!



推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 开发笔记:Docker 上安装启动 MySQL
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker上安装启动MySQL相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
author-avatar
风尚宣城_588
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有