Linux里面什么是边缘节点?

本文将介绍边缘计算场景如何构建安全运行时技术基座,以及安全容器在架构、网络、监控、日志、存储、以及 K8s API 兼容等方面的遇到的困难挑战和最佳实践。
本文来自于阿里云,由火龙果软件Anna编辑推荐。

本文主要分为四个部分,首先前两个部分会分别介绍一下ACK安全沙箱容器和边缘容器(Edge Kubernetes),这两个方向内容目前大部分人接触并不是很多。第三部着重分享安全沙箱容器在边缘这边的解决方案与实践经验,最后会介绍一下我们在安全容器方向新的探索和实践-可信/机密计算。

据 Gartner 预测,2019 年一半以上的企业会在其开发和生产环境中使用容器部署应用,容器技术日趋成熟稳定,然而在未容器化的企业或用户中,42% 以上的受访者表示容器安全成为其容器化的最大障碍之一,主要包括容器运行时安全、镜像安全和数据安全加密等。

端到端的云原生安全架构

在讲安全沙箱容器之前简单介绍下端到端云原生安全架构,主要分为三部分:

基础架构安全依赖于云厂商或者是专有云一些基础设施安全能力,也包括 RAM认证,细粒度RAM授权,支持审计能力等等。

这部分包括镜像签名,镜像扫描,安全合规等等,甚至包括有一些静态加密BYOK,DevSecOps,安全分发等。

这部分包括安全沙箱隔离,还包括了容器运行时其它方面一些安全机制,如KMS(秘钥管理服务)集成、多租户的管理和隔离等等。

接下来分享下业界在安全容器运行时的一些方案对比,业界安全容器运行时分为四大类:

的模式之下,其实这些都是通过辅助的工具手段来增强OS容器的安全性,但依然没有解决容器与Host共享内核利用内核漏洞逃逸带来的安全隐患问题;而且这些安全访问控制工具对管理员认知和技能要求比较高,安全性也相对最差。

此类典型代表是 Google 的 gVisor,通过实现独立的用户态内核去补获和代理应用的所有系统调用,隔离非安全的系统调用,间接性达到安全目的,它是一种进程虚拟化增强。但系统调用的代理和过滤的这种机制,导致它的应用兼容性以及系统调用方面性能相对传统OS容器较差。由于并不支持 virt-io 等虚拟框架,扩展性较差,不支持设备热插拔。

基于 LibOS 技术的这种安全容器运行时,比较有代表 UniKernel、Nabla-Containers,LibOS技术本质是针对应用对内核的一个深度裁剪和定制,需要把 LibOS 与应用编译打包在一起。因为需要打包拼在一起,本身兼容性比较差,应用和 LibOS 的捆绑编译和部署为传统的 DevOPS 带来挑战。

我们知道业界虚拟化(机)本身已经非常的成熟,MicroVM轻量虚拟化技术是对传统虚拟化的裁剪和,比较有代表性的就是 Kata-Containers、Firecracker,扩展能力非常优秀。VM GuestOS 包括内核均可自由定制,由于具备完整的OS和内核它的应用兼容性及其优秀;独立内核的好处是即便出现安全漏洞问题也会把安全影响范围限制到一个 VM 里面,当然它也有自己的缺点,Overhead 可能会略大一点,启动速度相对较慢一点。

完全杜绝安全问题的发生-不可能!

总会有漏洞,我们需要去面对这些现实问题,既然无法杜绝那我们需要就给它(应用)加上隔离层(沙箱)。

用户选择安全容器运行时需要考虑三方面:安全隔离、通用性以及资源效率。

主要包括安全隔离和性能隔离。安全隔离主要是安全问题影响的范围,性能隔离主要是降低容器间的相互干扰和影响。

通用性,首先是应用兼容性,应用是否可以在不修改或者小量修改的前提下运行在上面;其次是标准性兼容,包括 OCI 兼容、K8sAPI 兼容等;最后“生态”保证它可持续性和健壮性。

资源效率讲究更低 Overhead,更快的启动速度,更好的应用性能。

其实目前没有任何一种容器运行时技术可以同时满足以上三点,而我们需要做的就是根据具体的场景和业务需求合理选择适合自己的容器运行时。

在「资源效率」和「通用性」做的比较好的是传统的OS容器、runC等,但安全性最差;在「资源效率」和「安全隔离」做的比较好的是 UniKernel、gVisor 等,但应用兼容和通用性较差;在「安全隔离」和「通用性」方面做的比较的是 Kata-containers、Firecracker等,但 overhead 开销稍大启动速度稍慢,应用性能也相对传统OS容器较差。

月份推出了安全沙箱容器运行时的支持,它是在原有Docker容器之外提供的一种全新的容器运行时选项,它可以让应用运行在一个轻量虚拟机沙箱环境中,拥有独立的内核,具备更好的安全隔离能力,特别适合于多租户间负载隔离、对不可信应用隔离等场景。它在提升安全性的同时,对性能影响非常小,并且具备与Docker容器一样的用户体验,如日志、监控、弹性等。

对于我们场景来说,「安全性」和「通用性」是无疑最重要的,当然性能和效率我们也做了大量的优化:

独立 kernel,强隔离,安全故障域影响最小;

500ms 极速启动,拥有原生传统OS容器约 90% 的优秀性能;

适合多租负载隔离、不可信三方应用隔离、多方计算、Serverless 等场景。

随着万物互联时代的到来,智慧城市、智能制造、智能交通、智能家居,5G时代、宽带提速、IPv6的不断普及,导致数百亿的设备接入网络,在网络边缘产生ZB级数据,传统云计算难以满足物联网时代大带宽、低时延、大连接的诉求,边缘云计算便应运而生。

边缘计算设施服务越来越难以满足边端日益膨胀的诉求,因而云上服务下沉,边缘 Serverless、边缘侧隔离不可信负载等日趋强烈...

所以,为了满足我们边缘云计算场景需求,我们 ACK 推出了 Kubernetes 边缘版。

先来看下典型的边缘云模型,它由云(侧)、边(侧)、端(侧)三部分共同组成,三者相互协同,并提供统一的交付、运维和管控标准。云侧统一管控,是整个模型的中枢大脑;边侧由一定计算/存储能力的节点组成,是距离设备和用户最近的计算/存储资源;亿万端侧设备就近计入“边缘节点”。

“边”又分为两大类;一个是工业级的边,这类比较典型代表是云厂商提供的 CDN 节点计算资源、服务或者 Serverless 等,工业级的边也可提供 AI 预测、实时计算、转码等服务能力,把云上的服务下沉到边侧。第二类是用户或者工厂、园区、楼宇、机场等自己提供计算资源服务器或者网关服务器,如一个家庭网关可以作为边缘节点接入到集群中从而可以纳管控制家庭中的智能电器设备。

那边缘 Serverless 如何解决多租户负载隔离?工程如何在自己的内网环境安全运行三方提供的应用服务和负载?这也就是我们在边缘侧引入安全沙箱容器的根本原因。

先看下整体解决方案,上面架构完全契合了“云-边-端”模型,我们整个架构是基于 Kubernetes 来开发的。

metrics-server、log-controller 等非核心功能组件;当然,“云侧”也会适配云上的各类服务为自己附能,如监控服务、日志服务、存储服务等等。

“边侧”,既边缘Node节点,我们知道“云侧”到“边侧”的弱网会导致边缘Node失联,失联时间过长会导致 Master 对节点上的 Pod 发出驱逐指令,还有断网期间“边缘节点”主机重启后应用如何恢复和自治,这些都是 Edge Kubernetes 面临的最大挑战之一;当在 K8s 引入安全沙箱容器运行时,会发现 K8s Api 不兼容、部分监控异常、日志无法正常采集、存储性能极差等诸多问题,都给我们带来了极大的挑战。

在分享解决以上问题前,我们先看下云侧安全沙箱容器方案。

上图橙色虚框内是节点运行时的组件分层结构,上面是 kubelet,CRI-Runtime 有 Docker 和 Containerd 两类,其中安全沙箱容器运行时方案(深蓝色背景部分)中我们选择了 Containerd 作为 CRI-Runtime,主要考虑到 Containerd 的结构简洁,调用链更短,资源开销更小,而且它具有及其灵活的多 Runtimes 支持,扩展能力也更优。

我们在一个“安全沙箱节点”上同时提供了 RunC 和 RunV 两种运行时的支持,同时在 K8s 集群中对应的注入了两个 RuntimeClass( runc 和 runv )以便轻松轻易按需调度和选择,“同时提供 RunC 支持” 也是考虑到诸如 kube-proxy 等 Addon 组件没必要运行在安全沙箱中。

OS 我们选择了阿里云的发行版 OS:Aliyun Linux,4.19+ 的 Kernel 对容器的兼容性更优、稳定性更好,同时我们对其进行了极少的定制,以便支持硬件虚拟化。

最下面运行就是我们的裸金属服务器,在云上我们提供了神龙,在边缘侧任何支持硬件虚拟化的裸金属服务器均可。

K8s 管控端与边缘节点断网维护,如工厂封网内部设备维护等,超过 Pod 容忍时间(默认300s)后会导致管控端发出“驱逐失联节点上所有 Pods”指令,在维护结束网络恢复后,边缘节点收到驱逐指令删除所有应用 Pod,这对于一个工厂来说是灾难性的。

在封(断)网期间边缘节点硬件重启,就会导致节点上依赖管控端(如 kube-apiserver)的部分组件或数据无法正常启动或载入。

主要原理是基于 kubelet checkpoint 机制把一些资源对象缓冲到本地文件,但 kubelet checkpoint 能力较弱,仅可以魂村 pod 等个别类型对象到本地文件,像常用的 ConfigMap/Secret/PV/PVC 等暂不支持。当然也可以定制修改 kubelet,但后期会带来的大量的升级和维护成本。

利用集群联邦,把整个 K8s 集群下沉到边缘侧,如每个 EdgeUnit 存在一个或多个 K8s 集群,通过云侧的 K8s Federation 进行多集群/负载管理。但因为 EdgeUnit 分散性且规模较大庞大,会导致集群规模数倍增加,产生大量的 Overhead 成本,很多 EdgeUnit 内通常仅有几台机器。而且这种架构也比较复杂,难以运维,同时,边缘K8s集群也很难复用云上成熟服务,如监控、日志等。

如上图,在我们的边缘治理方案中,我们增加了两个非常重要的组件:

通过 Annotation 配置开关,表示节点是否开启自治模式;

对于自治模式的节点,当节点失联(NotReady等)时忽略对节点上容忍超时的 Pod 驱逐。

在节点断网的情况下,EdgeHub 利用本地缓存充当 apiserver,但 EdgeHub并未真正的 apiserver,所以须忽略所有过来的写操作请求。

上图为整个监控的原理图,流程是:

我们 runC shim 用的是 containerd-shim,这个版本虽然比较老,但稳定性非常好,经过大量的生产验证。

metrics-server 把监控数据除了 Sink 到云监控上外,自己内存中还存放了最近一段时间的监控数据,用于提供给 K8s Metrics API,这些数据可用于 HPA 等。

那如何补齐监控API?由于我们有着庞大的存量集群,我们的改动既不能影响已有的用户监控,也不能对整个监控设施方案做大的改动,所以改动尽量在靠近底层的地方做适配和修改,我们最终决定定制 kubelet,这样整个监控基础设施不需要做任何变更。

下面是 kubelet 具体修改的原理图:

kubelet 的监控接口分为三大类:

2.default 类,较老的接口,无Pod语义,社区会逐渐废弃此类接口。

为了更好的兼容,我们对三类接口均进行了适配。上图红色部分为新增,黄色虚框部分为修改。

上图是我们的日志方案,我们需要通过阿里云日志采集 Agent Logtail 采集容器日志,主要有三种使用方式:

采集节点上所有容器的标准输出。

通过容器环境变量配置的容器内的采集日志路径,在宿主机上拼接容器的 rootfs 路径,可在宿主机上直采容器内日志文件。

只采集同 Pod 内的其他应用容器日志文件。

我们在containerd/安全沙箱容器遇到的问题:

Logtail 需要连接容器引擎获取主机上的所有容器信息,但只支持docker,不支持 containerd。

所有 runC 和 runV 容器标准输出无法采集。

通过 Container Spec 获取容器标准输出日志路径,由于如论 runC 还是 runV 容器的标准输出文件均在 Host 上,所以只要找到这个路径可以直接采集。

在 runC 的日志文件路径查找上,我们做了个优化:优先尝试查找 Upper Dir,否则查找 devicemapper 最佳匹配路径,由于 runV 有独立 kernel 无法在 Host 侧直采容器内日志文件。由于 runV 容器和 Host 内核不再共享,导致无法在 Host 上直接采集 runV 容器内的日志文件。

安全沙箱容器存储方案涉及到两方面,分别是 RootFS 和 Volume。

Volume 可以简单的理解为容器的“数据盘”,可以为容器用来作为数据存储扩展。

基于 snapshot 增强开发,实现容器镜像计算和存储的分离。

FlexVolume 和 CSI Plugin 在实现上,默认均会将云盘、NAS 等先挂载到本地目录,然后 mount bind 到容器内,这在 runC 容器上并没有任何问题,但在安全沙箱容器中,由于过 9PFS 所以依然严重影响性能。

针对上面的性能问题,我们做了几方面的优化:

云盘或本地盘会在本地依然格式化,但不会 mount 到本地目录,而是直接把 block device 直通到沙箱中,由沙箱中的 agent 执行挂载动作。

在边缘侧,我们采用了 Virtio-fs 避开 9PFS 的问题,这种方式更通用,维护起来也更轻便,在性能上基本可以满足边缘侧的需求,当然无法和“云上直通”优化的性能好。

在网络方案中,我们同样既需要考虑“云上”和“边缘”,也需要考虑到“通用性”和“性能”,在 K8s 中还需要考虑到网络方案对 “容器网络” 和 “Service 网络” 的兼容性。

如上图,我们的网络方案中虽然有三种方案。

桥接模式属于比较老的也比较成熟的一种网络方案,它的优点就是通用性比较好,架构非常稳定和成熟,缺点是性能较差,特点是每个 Pod 都需要分配 Veth Pair,其中一端在 Host 测,一端在容器内,这样所有容器内的进出流量都会通过 Veth Pair 回到 Host,无需修改即可同时完美兼容 K8s 的容器网络和 Service 网络。目前这种方案主要应用于云上的节点。

顾名思义,就是直接把网卡设备直通到容器内。在云上和边缘由于基础网络设施方案不通,在直通方面略有不同,但原理是相同的。

云上,主要用来直通 ENI 弹性网卡到每个 Pod 内。

边缘,边缘网络方案基于 SR-IOV,所以主要用来直通 VF 设备。

直通方案的优点是,最优的网络性能,但受限于节点 ENI 网卡 或 VF 设备数量的限制,一般一台裸金属服务商只能直通 二三十个 Pod,Pod密度较低导致节点资源浪费。

IPVlan 是我们下一代网络方案,整体性能高于 Bridge 桥接模式,建议内核版本 4.9+,缺点是对 K8s Service 网络支持较差,所以我们在内核、runtime 以及网络插件上做了大量的优化和修复。目前 IPVlan 网络模式已在灰度中,即将全域开放公测。

下图是各个方案网络性能对比:

从 Ping 时延、不同带宽、TCP_RR 和 UDP_RR 多个方面同时对比了这几种网络方案,Host作为基准。可以看出,直通网卡的性能可以做到接近host的性能,ipvlan和bridge与直通网卡方式有一定差距,但前两者通用性更好;总体来说 ipvlan 比 bridge 性能普遍更好。

另外,表中 Ping 时延的相对百分比较大,但实际上从数值差距来说只有零点零几毫秒差距。

注:以上为内部数据测试结果,仅供参考。

调度支持不同,主要分为两大阶段。

新探索-可信/机密计算

很多用户考虑到成本、运维、稳定性等因素去上云,但往往因为对公有云平台安全技术担忧以及信任,很多隐私数据、敏感数据对云“望而却步”;往往现有的安全技术可以帮我们解决存储加密、传输过程中的加密,但无法做到应用运行过程的加密,这些数据在内存中是明文的,入侵者或者云厂商有能力从内存窥探数据。就是在这种背景下,可信/机密计算应运而生,它是基于软硬件技术,为敏感应用/数据在内存中创建一块 Encalve(飞地),它是一块硬件加密的内存,任何其他的应用程序、OS、BIOS、其他硬件甚至云厂商均无法解密这部分内存数据。

在此背景下,我们联合了多个团队,在 ACK 上研发了基于 Intel SGX 硬件加密的 TEE 运行时,可让用户的应用的跑在一个更加安全、可信的运行时环境中,帮助更多的用户破除上云的安全障碍,我们也将在 2020年Q1进行公测。

}

阿里云边缘计算关键组件:

作为一个边缘计算平台,除了提供底层服务管理能力外,还提供一些基础功能模块,分为云端管理平台(云)、本地运行包(边)两部分,具体如下:
模块epnc-core是边缘节点与云中心的唯一入口,主要负责接收边缘节点信息上报和对应计算任务的下发;

阿里云边缘计算服务开通地址 
阿里云边缘计算官方帮助文档 

模块epnc-stats负责收集边缘节点和计算任务的用量信息,并将其存储到时序数据库和云监控中;

模块epnc-scheduler负责将用户提交的编排任务调度到合适的边缘节点;

模块epnc-config负责存储用户提交的编排任务信息;

本地运行包主程序epnc-edge负责接受云端指令、服务阿里云服务器的管理,如启动、退出、守护等,在边缘侧管理用户的计算任务。目前支持两种运行模式:Native进程模式和Docker容器模式。

阿里云边缘计算是阿里云为用户提供的分布式边缘计算,其充分利用阿里云在边缘网络的资源储备和调度管理的能力,在边缘侧以节点的方式融合网络、计算、存储、应用等资源能力的开放平台。可满足用户在业务实时响应、应用快速部署、数据就近处理、远程管控及内容分发等方面的关键需求;可灵活配置管理大规模边缘计算应用,加速边缘智能落地,将计算能力拓展至用户现场,为用户就近提供超低时延且低成本的边缘智能服务。

阿里云边缘计算基本概念:
边缘计算:阿里云自研的边缘计算平台,通过收集闲置算力形成资源池,为客户提供丰富的智能边缘计算;

边缘节点:云计算中心之外的任意地点,根据不同的场景需要和延迟容忍程度,选择包括但不限于本地设备侧、本地局域网络节点(网关、控制器、控制系统服务器)、广域网络节点(基站、CDN);

节点资源:包含CPU、内存、系统盘、数据盘、网络带宽等。

阿里云边缘计算有什么优势

全面覆盖:大量靠近用户边缘的节点资源,覆盖全国主流地区和运营商,从基础设施层面保障终端用户低延时

弹性售卖:边缘算力按需使用、按量付费,资源动态扩缩容

智能边缘:可以将阿里云的服务能力延伸至边缘,支持人脸识别、图像识别、大数据处理等能力,就近提供实时边缘计算

简化运行:支持容器和Native两种运行方式,满足用户轻量化应用管理的诉求,快速构建边缘运行环境

开放兼容:本地运行包支持X86、ARM、amd64、mips等多种硬件以及Linux和Darwin主流操作系统

安全可靠:连接具有互通性不传递的特点,保证数据安全;通过多租户算力和网络安全隔离、证书加密、自动化运维监控能力等保证通道的安全性

}

KubeSphere 是在 Kubernetes 之上构建的企业级分布式多租户的容器平台,在与 KubeEdge 集成中,扮演者着“云端控制面”的角色。

下图中展示了边缘节点集成后,作为 Node 角色在 KubeSphere Console 上的展示效果,我们可以很方便的查看边缘节点容器日志和 Metrics。

为什么选择 KubeEdge 集成边缘计算能力?

首先 KubeEdge 本身的云边枢纽和架构,具有非常出色的云原生自治能力,支持边缘自治、消息与资源的可靠性同步、边缘节点的管理能力,边缘节点的 KubeFed 是极度轻量的,可按需裁剪定制。

除了 KubeEdge 本身架构带来的特性外,我们集成 KubeEdge 的其他原因主要有:

  • KubeEdge 是最早进入 CNCF 的边缘计算项目,项目成熟度比较高且社区比较活跃;
  • KubeSphere v2.1.0/v3.0.0 起,社区用户陆续提出了边缘节点自动化安装部署、监控、日志、调试等方面的需求;
  • KubeEdge 逐渐对边缘节点监控、日志、调试等有了更好的支持;
  • 补充 KubeEdge 边缘计算框架云端控制面。

在这样的背景下,KubeSphere 社区和 KubeEdge 社区紧密合作,从云端控制层面解决边缘节点纳管易用性和可观测性难题。KubeEdge 集成在 KubeSphere 容器平台后,可以补充 KubeSphere 的边缘计算能力,KubeSphere 则充当计算框架的一个云端控制面。

在集成过程中,我们也遇到了一些挑战:

  • 提供快速容器化部署方案
  • 提供边缘节点辅助验证服务
  • 边缘测部署配置项较多,希望一条脚本解决边缘节点加入云端组件

以上描述低版本的版本的场景,高版本的场景有所变化。

  • 方案:云端组件容器化部署、边缘节点 Binary 部署
  • 给边缘节点部署 keadm 工具添加额外自定义参数、添加国内下载源

KubeSphere 容器平台如何激活云端组件

  • 另外还需要开放一些端口

添加边缘节点主要有两种集成方式:

  • 如果边缘节点与 K8s 集群不在一个局域网,云端相应端口 10000 ~ 10004 允许防火墙通过,映射到NodePort ;
  • 如果边缘节点与 K8s 集群局域网内可达边缘节点,则直接使用 NodePort 方式集成;
  • 此外,需要激活 edgemesh 云边网络工具

集成工作与可观测性 - 边缘容器日志获取

在 UI 上的界面,在我们 KubeSphere 里面的界面大概如上图,这是边缘容器的一个日志,我们可以开启实施 debug 功能。

应用案例:中移物联网边缘计算平台

此案例来自中移物联网何毓川老师,分享了使用 KubeSphere + KubeEdge 来构建中移物联网边缘计算平台,中移物联网计划基于以上的集成和可观测方案,预期在每一个 KubeSphere 容器平台上,边缘节点接入量期望在1k左右。

  1. 目前的可观测数据主要通过 metrics-server 来获取,是实时数据,无法长期保存;
    • Edge Runtime Service,用于辅助边缘场景中健康检查、节点合法性验证、收集重要 events 甚至生命周期监测等的 sidecar ;
}

我要回帖

更多关于 边缘节点是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信