引言

在 SuperEdge 0.2.0版本中,lite-apiserver 进行了重大的架构升级和功能增强。本文将从 lite-apiserver 实现及其与其它 SuperEdge 组件协同的角度,分析 SuperEdge 的边缘自治能力,给大家的研究和选型提供参考。

边缘节点自治

在云边协同的边缘计算场景中,边缘节点通过公网与云端连接。边缘节点众多,网络环境复杂,网络质量参差不齐。边缘节点需要与云端弱网或断网情况下,继续正常工作,已运行的业务不受影响,达到边缘节点自治的目的。

为了实现边缘节点自治,需要处理以下场景:

  1. 边缘节点与云端断连,但是它本身正常,上面运行的业务容器应该不被驱逐,也没有新的业务容器调度到该节点上
  2. 边缘节点与云端断连时,边缘节点上的 Kubernetes 组件和业务容器可继续运行
  3. 边缘节点与云端断连时,边缘节点重启后,节点上的 Kubernetes 组件和业务容器可运行
  4. 边缘节点与云端恢复后,边缘节点上的数据与云端保持一致

SuperEdge 使用分布式节点健康检查组件 edge-health 来处理场景1,使用 lite-apiserver 来应对场景2、3、4。

lite-apiserver 是运行在边缘节点上的轻量级 apiserver,它代理节点上所有组件和业务容器访问云端 kube-apiserver 的请求,并对请求结果做高效缓存。在云边断连的情况下,利用这些缓存提供服务,实现边缘自治的能力。

lite-apiserver 设计特性

lite-apiserver除了满足边缘节点自治的功能需求外,还需要满足以下设计特性:

支持所有 Client 类型

作为边缘节点上访问云端 kube-apiserver 的唯一“出口”,lite-apiserver 需要支持所有类型的 Client ,包括以 bin (如 kubelet 等)或 pod (如 flannel\kube-proxy 等)形式运行的 Kubernetes 组件,以及以 InCluster 方式访问 kube-apiserver 的业务容器。

更进一步,如果边缘节点网络环境特殊,需要以代理等方式才能访问云端 kube-apiserver时,只用给 lite-apiserver 设置代理,所有组件即可正常访问云端 kube-apiserver,不需要每个组件做单独的配置。

支持缓存所有类型资源

支持缓存所有类型资源,Kubernetes 内置资源和 Custom Resources。

边缘节点上运行的 Kubernetes 组件和业务容器的请求 kube-apiserver 的资源多样,如果只缓存部分资源类型或仅支持 Kubernetes 内置资源类型,在云边断连时,可能因为读取不到对应的缓存导致组件或业务失败,达不到边缘节点自治的效果。当然,支持所有类型资源的缓存(尤其是 Custom Resources ),也给数据的解析和处理带来了不小挑战。

安全

边缘节点分布广泛,环境复杂,更容易造成安全风险。安全问题也在边缘计算和 Kubernetes 管理中越来越受重视。

给 lite-apiserver赋予一个访问权限,其代理的所有请求扔掉自身的权限方式,都使用 lite-apiserver 的权限访问云端的 kube-apiserver,是一种常见的访问控制方案。由于 lite-apiserver 需要访问和处理所有类型的资源,则该权限必然是一个“超级”权限。在这种情形下,某一个边缘节点上的恶意程序就可以通过 lite-apiserver 对集群的所有资源进行操作,可能对整个集群进行恶意破坏。

因此,从安全角度,lite-apiserver 从设计上不应拥有一个“超级”权限,可以使用 Kubernetes 组件和业务容器原有的认证和鉴权方式,访问云端 kube-apiserver。

支持多种缓存存储

根据 IDC 对边缘计算分层的定义,边缘分为 Heavy Edge(边缘数据中心)和 Light Edge(低功耗计算平台)。针对不同的场景,lite-apiserver 可以采用不同的缓存存储策略来达到更优的效果。在 Light Edge 中,lite-apiserver 使用文件存储缓存以降低其本身的系统开销,提升通用性。在 Heavy Edge 中,lite-apiserver 可采用 KV 存储等提升读写性能。

下面我们将从 lite-apiserver 的架构和关键技术方面,介绍其如何实现以上的功能需求和设计特性。

lite-apiserver 架构与关键技术

架构

lite-apiserver架构如图

从整体上看,lite-apiserver 启动一个 HTTPS Server 接受所有 Client 的请求(https request),并根据 request tls 证书中的 Common Name 选择对应的 ReverseProxy(如果 request 没有 mtls 证书,则使用 default),将 request 转发到 kube-apiserver。当云边网络正常时,将对应的返回结果(https response)返回给client,并按需将response异步存储到缓存中;当云边断连时,访问kube-apiserver超时,从缓存中获取已缓存的数据返回给client,达到边缘自治的目的。

  • HTTPS Server

    监听 localhost 的端口(SurperEdge 中为51003)接受 Client 的 Https 请求。
  • Cert Mgr && Transport Mgr

    Cert Mgr 负责管理连接 kube-apiserver 的 TLS 客户端证书。它周期性加载配置的TLS证书,如果有更新,通知Transport Mgr创建或更新对应的transport。

    Transport Mgr负责管理transport。它接收Cert Mgr的通知,创建新的transport,或者关闭证书已更新的transport的旧连接。
  • Proxy

    根据 request mtls 证书中的 Common Name 选择对应的 ReverseProxy(如果 request 没有 mtls 证书,则使用 default),将 request 转发到 kube-apiserver。如果请求成功,则将结果直接给 Client 返回,并调用 Cache Mgr 缓存数据;如果请求失败,则从 Cache Mgr 中读取数据给 Client。
  • Cache Mgr

    根据 Client 的类型分别缓存 Get 和 List 的结果数据,并根据 Watch 的返回值,更新对应的 List 数据。

关键技术

1. HTTPS Server

在当前架构下,lite-apiserver 只处理本节点的所有请求,使用 HTTP Server 可以满足性能和安全要求。然而,大部分组件和业务容器采用 client-go 库访问 kube-apiserver,如果使用 HTTP Server,Client 自己的认证和鉴权信息全部丢失,不符合权限管理的要求。因此必须采用 HTTPS Server。lite-apiserver 的 TLS Server 证书,需用 kube-apiserver 的 Server 证书相同的CA签发。

2. 支持 InCluster 方式访问

一般的 Client 通过指定 kube-apiserver 的 URL 访问 kube-apiserver,使用 lite-apiserver 时,只需将原来 kube-apiserver 的 URL 替换为 lite-apiserver 的地址即可。

在 Pod 中访问 kube-apiserver 的推荐方式是通过 kubernetes.default.svc 这个 DNS 名称,该名称将会解析为服务 IP,然后服务 IP 将会路由到 kube-apiserver。在这种场景下使用 lite-apiserver 需要一些小小的"魔法"。

在 SuperEdge 中,application-grid-wrapper 以 DaemonSet 的形式部署在每个边缘节点上,通过给 kube-proxy 只返回本区域内的 endpoints 来达到访问在区域内闭环的目的。利用这个特性,application-grid-wrapper 把 kubernetes 这个 Service 的 endpoint 改为 lite-apiserver 的地址, 返回给本节点 kube-proxy,即可支持 InCluster 方式访问。

3. 支持 Client 的 Bootstrap Token 和证书轮换

lite-apiserver 使用 Client 自己的认证和鉴权方式,访问云端的 kube-apiserver。对于 static token、bootstrap token、service account 等方式,lite-apiserver 只需透传 Http Request 的 Header 中包含的认证鉴权信息即可。对于 TLS 客户端证书的认证方式,lite-apiserver 通过读取配置文件,加载所有 Client 用到的 TLS 客户端证书,使用这些证书构造对应的 HTTPS 请求 kube-apiserver。

为了支持 Client 的 Bootstrap Token 和证书轮换,lite-apiserver 需要周期性的加载和更新这些证书。kube-controller-manager 签发的证书默认时间是1年,lite-apiserver 加载 TLS 客户端证书周期不宜过短。但如果证书加载周期时间过长,kubelet 使用 Bootstrap Token 的场景中会存在证书更新不及时的问题。为了处理这些场景,lite-apiserver 采用一种“优雅”的证书加载策略:当加载证书出现错误或证书过期时,进入快速加载模式,周期是1s; 加载证书均成功时,进入普通加载模式,周期是30min。

当证书更新后,lite-apiserver 使用 client-go 提供的closeAll方法,关闭已存在的连接,以防认证鉴权失败。

4. 缓存解析和更新

lite-apiserver 需要支持缓存所有类型的资源,缓存的解析和更新是 lite-apiserver 实现的关键之一。lite-apiserver 分别缓存每个 Client 的对资源的 Get 和 List 请求,这样虽然造成了一定的存储空间的浪费,但是也避免了复杂的资源版本转换。对于 Watch 类型的请求结果,lite-apiserver 采用unstructured.UnstructuredJSONScheme 解析出资源的 meta 信息,进而更新相应的 List 数据。

展望

SuperEdge 正式开源以来,得到了广泛的关注。SuperEdge 在快速迭代开发中,lite-apiserver 也有不少可扩展点,欢迎大家积极参与,共同打造一个优秀的云原生边缘容器项目。

  • 内存中缓存部分高频更新的资源,提升性能
  • 支持更多种类存储
  • 性能和内存优化,适应更广泛的边缘场景

从 lite-apiserver 看 SuperEdge 边缘节点自治的更多相关文章

  1. SuperEdge 云边隧道新特性:从云端SSH运维边缘节点

    背景 在边缘集群的场景下边缘节点分布在不同的区域,且边缘节点和云端之间是单向网络,边缘节点可以访问云端节点,云端节点无法直接访问边缘节点,给边缘节点的运维带来很大不便,如果可以从云端SSH登录到边缘节 ...

  2. 看KubeEdge携手K8S,如何管理中国高速公路上的10万边缘节点

    摘要:为保证高速公路上门架系统的落地项目的成功落地,选择K8s和KubeEdge来进行整体的应用和边缘节点管理. 一.项目背景 本项目是在高速公路ETC联网和推动取消省界收费站的大前提下,门架系统的落 ...

  3. 一文读懂 SuperEdge 边缘容器架构与原理

    前言 superedge是腾讯推出的Kubernetes-native边缘计算管理框架.相比openyurt以及kubeedge,superedge除了具备Kubernetes零侵入以及边缘自治特性, ...

  4. 腾讯云联合多家生态伙伴,重磅开源 SuperEdge 边缘容器项目

    在2020年12月19-20日腾讯 Techo Park 开发者大会上,腾讯云联合英特尔.VMware 威睿.虎牙.寒武纪.美团.首都在线,共同发布 SuperEdge 边缘容器开源项目. Super ...

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

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

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

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

  7. CDN边缘节点容器调度实践(上)

    又拍云容器云是基于 Docker 的分布式计算资源网,节点分散在全国各地及海外,提供电信.联通.移动和多线网络,融合微服务.DevOps 理念,满足精益开发.运维一体化,大幅降低分布式计算资源构建复杂 ...

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

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

  9. 边缘节点服务ENS重磅升级 阿里云首次定义“边缘云计算”概念层层深入

    随着5G.物联网时代的到来以及云计算应用的逐渐增加,传统集中式的云计算技术已经无法满足终端侧“大连接,低时延,大带宽”的需求.结合边缘计算的概念,云计算将必然发展到下一个技术阶段,也就是将云计算的能力 ...

随机推荐

  1. GitHub Learning Lab

    GitHub Learning Lab https://lab.github.com/ https://github.community/t5/GitHub-Learning-Lab/bd-p/lea ...

  2. how to get svg text tspan x,y position value in js

    how to get svg text tspan x,y position value in js <svg xmlns="http://www.w3.org/2000/svg&qu ...

  3. 人物传记:Mila Fletcher:如何勤于思考抓住关键?

    Mila Fletcher于2007年毕业于耶鲁大学,她是一名真正意义上的法学博士,在校期间获得了马歇尔奖学金,毕业后曾在美国多家知名律师事务所任职,目前就职于星盟全球投资公司,专注于帮助公司和客户提 ...

  4. NGK.IO会是一个投资优质项目吗?

    互联网发展至今,技术已经高度成熟,人们发现了互联网的好处后,互联网逐渐渗入到家家户户.随着时代的变迁,人们对HTTP长期作为主流霸占互联网食物链的顶端感到不满足.当人类开始变得挑剔,HTTP的劣势就逐 ...

  5. 算法图解:Python笔记代码

    二分查找 选择排序 递归 快速排序 广度优先搜索 狄克斯特拉算法 贪婪算法 二分查找 def binary_search(lst,item): low = 0 high = len(lst)-1 wh ...

  6. Asp.Net Core学习笔记:(二)视图、模型、持久化、文件、错误处理、日志

    TagHelper 入门 优点:根据参数自动生成,不需要手写超链接,类似Django模板里面的url命令. 在ViewImport中添加TagHelper @addTagHelper *,Micros ...

  7. HTTP/1.1 有点慢,我想优化下!

    问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我想你第一时间想到的是,使用 KeepAlive 将 HTTP/1.1 从短连接改成长链接. 这个确实是一个优化的手段,它是从底层的传输层这一方 ...

  8. TERSUS无代码开发(笔记07)-简单实例手机端后台逻辑开发

    提交申请逻辑开发 1.添加父级对象引用(从父级对象中获取前端输入框的值) 1.设计数据库表(表名和字段名称不能用中文) 2.设计置数据库主键(可设联合主键) 3.传值形成数据实列处理 4.服务器端处理 ...

  9. 解决java POI导入Excel超时问题

    由于要导入大量数据,后台会耗费很长时间,导致超时. 本项目前端request.js中设定的超时时间为150s. const service = axios.create({ baseURL: base ...

  10. Hive实现自增序列及常见的Hive元数据问题处理

    Hive实现自增序列 在利用数据仓库进行数据处理时,通常有这样一个业务场景,为一个Hive表新增一列自增字段(比如事实表和维度表之间的"代理主键").虽然Hive不像RDBMS如m ...