在 SuperEdge 0.2.0版本中,lite-apiserver 进行了重大的架构升级和功能增强。本文将从 lite-apiserver 实现及其与其它 SuperEdge 组件协同的角度,分析 SuperEdge 的边缘自治能力,给大家的研究和选型提供参考。
边缘节点自治在云边协同的边缘计算场景中,边缘节点通过公网与云端连接。边缘节点众多,网络环境复杂,网络质量参差不齐。边缘节点需要与云端弱网或断网情况下,继续正常工作,已运行的业务不受影响,达到边缘节点自治的目的。
为了实现边缘节点自治,需要处理以下场景:
边缘节点与云端断连,但是它本身正常,上面运行的业务容器应该不被驱逐,也没有新的业务容器调度到该节点上
边缘节点与云端断连时,边缘节点上的 Kubernetes 组件和业务容器可继续运行
边缘节点与云端断连时,边缘节点重启后,节点上的 Kubernetes 组件和业务容器可运行
边缘节点与云端恢复后,边缘节点上的数据与云端保持一致
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 请求。