Service Mesh是下一代SDN吗?从通信的角度看Service Mesh的发展 - 赵化冰

原文链接:https://www.servicemesher.com/blog/201910-what-can-service-mesh-learn-from-sdn/

前言

如果具有通信或者网络行业的知识背景,那么你对SDN(Software Defined Network)一定不会陌生。你也许已经注意到,近来在微服务领域兴起的Service Mesh和SDN(Software Defined Network) 非常相似,这两者都采用了软件对网络进行管理和控制,也都采用了包含控制面和数据面的类似架构。

那么Service Mesh和SDN有什么关系?Service Mesh是下一代的SDN吗? Service Mesh是否可以从SDN的发展历史中借鉴一些经验?本文将就这些问题进行一一探讨。

传统网络面临的挑战

首先我们来回顾一下SDN的起源。传统的IP网络是一个分布式的无中心架构,各个网络设备包含完整的控制面和数据面,单个设备通过网络协议探测网络中其他设备的状态,自主决定如何对流量进行路由。该架构的好处是容错性强,即使网络局部出现故障,整个网络也可以自主恢复,不会影响整个网络的运行。 在传统的网络架构下,控制面和数据面位于同一设备中

这种去中心的架构在基于文本和图片的web浏览器应用时代运作良好,但随着互联网业务的爆炸式增长,各种各样的业务纷纷承载在了IP网络上,包括各种实时业务如语音视频通话,对网络提出了新的挑战。

  • 缺少网络质量保证: 绝大多数IP网络都是基于无连接的,只有基于大带宽的粗放带宽保障措施,缺乏质量保证和监控,业务体验较差。
  • 低效的业务部署: 网络配置是通过命令行或者网管、由管理员手工配置到网络设备上,并且各种网络设备之间的控制命令互不兼容,导致业务的部署非常低效。
  • 缓慢的业务适应: 业务由硬件实现,导致新业务的开发周期过长。需要持续数年的特性和架构调整、引入新设备,才能推出新的业务,无法快速适应市场,满足用户的需求。

SDN如何解决传统网络的问题

为了应对这些问题,提出了SDN的解决方案,SDN的架构如下图所示:

SDN架构

从图中可以看到,SDN从下至上划分为三层体系结构:

  • 基础设施层(Infrastructure Layer): 是网络的数据平面,由各种网络设备构成,根据控制层下发的路由规则对网络数据进行处理和转发。
  • 控制层(Control Layer): 是一个逻辑上集中的控制平面,维护了整个网络的信息,如网络拓扑和状态信息等,控制层根据业务逻辑生成配置信息下发给基础设施层,以管理整个网络的运行。
  • 应用层(Application Layer):通过控制层提供的编程接口,可以编写各种应用利用控制层的能力对网络进行灵活的配置。

SDN的不同层次之间采用标准接口进行通信:

  • 南向接口(Southbound API):数据面和控制面的接口,控制面通过该接口将路由和配置下发到数据面,该接口一般使用OpenFlow、NetConf等网络协议。标准的南向接口解耦了控制层和基础设施层,只要支持标准南向接口的交换机都可以接入到SDN网络中,这样基础设施层可以大量采用支持OpenFlow协议的白盒交换机,解除了厂商锁定,降低了网络成本。
  • 北向接口(Northbound API):控制面向应用层提供的可编程接口,例如RestConf接口。利用控制面提供的编程接口,新的网络业务可以通过存软件的方式实现,大大加快了推出新业务的周期。

微服务面临的问题

在一个微服务系统中,各个独立的微服务之间采用远程调用进行通信。服务发现,请求路由等服务通信相关的功能以代码库的形式存在于各个微服务之中。

微服务之间的通信

该架构也存在和通信网络类似的问题:

  • 不同语言/框架的代码库版本中关于服务通信相关的配置完全不同,需要对不同的微服务单独进行配置,导致微服务的运维非常困难。
  • 应用和服务通信之间的代码耦合导致修改或者增加新的服务通信功能需要修改并升级所有的微服务,如果需要引入新的运维功能,例如支持灰度发布等,则需要修改并升级所有微服务,代价非常大。

Service Mesh是下一代SDN吗?

从上面的分析可以看出,SDN和Service Mesh面临的是类似的问题,既然都是解决类似的问题,那么Service Mesh是否可以看作下一代的SDN呢?

我认为答案是否定的,因为两者之间还是有显著的不同。SDN主要面对L1到L4层,即网络层的基本转发和控制功能;Service Mesh则主要面对L7层及以上,用于处理应用层的服务发现,服务路由等功能,但两者采用了相似的理念,我们可以把Service Mesh看作SDN的理念在应用层的扩展和实践。

SDN和Service Mesh出于网络协议中的不同层次

Service Mesh可以借鉴SDN的架构来解决微服务系统的服务通信的相关问题,如下图所示: Service Mesh架构

我们可以看到,基本上所有的Service Mesh实现都采用了类似上图的的架构,包括IstioLinkerdKuma等。

在该架构中,数据面承担的是一个白盒交换机的角色,不管何种实现,其功能都是类似的,不存在太多争议,目前envoy已经成为数据面的标准实现,因此数据面和控制面之间也采用了Envoy的xDS v2作为标准的数据面协议。

各个Service Mesh项目的创新和争夺的战场主要在控制面上,Microsoft等公司提出了采用SMI(Service Mesh Interface)作为控制面的标准接口,虽然SMI得到了Linkerd,HashiCorp, Solo.io等一干公司的支持,但目前影响最大的Service Mesh项目Istio还未对此进行表态。缺乏统一的控制面标准,控制面之上的应用层生态目前还没有发展起来,基本没有看到有项目对应用层进行宣传。

统一管理硬件设备和Envoy

SDN给Service Mesh带来的一个重要启发是控制面对数据面各种网络设备的统一控制,那么是否可以采用Service Mesh控制面对硬件设备和软件代理进行统一控制呢?

F5网站上提供了一个F5 Big IP和Istio集成的案例。在该案例中, Service Mesh中的微服务需要和一个外部数据库系统进行通信,为了对数据库进行保护,在数据库前放置了一个F5 Big IP设备作为反向代理,并进行下述配置:

  • Service Mesh中的微服务通过F5 Big IP作为代理和后端的数据库通信
  • F5 Big IP和微服务之间采用mTLS,F5 Big IP和数据库之间采用Plain TCP
  • F5 Big IP采用spiffe对微服务进行身份认证,只允许需要访问该数据库的微服务的请求通过

F5的该案例证明了Service Mesh和F5设备之间集成的可能性,但是需要在F5 Big IP设备上进行一系列复杂的配置操作,包括开通服务端口,配置TLS证书,设置认证和访问策略等等。如果Service Mesh控制面可以将F5设备也纳入统一控制,通过控制面统一下发规则,则可以极大简化网络的配置工作,加快业务下发的敏捷性。

采用Service Mesh配置F5 Big IP

利用控制面接口开发应用

SDN的另一个优势是可以通过控制器提供的北向接口快速开发各种SDN应用,而不需要对硬件进行升级,这种模式加快了新业务上线的周期,鼓励各种创新业务蓬勃发展。目前Service Mesh在应用方面尚未有太多实践,但从SDN的发展历程来看,Service Mesh应用层有极大的发展空间。

下图是一个利用控制面接口开发的用户业务订阅及SLA管理的APP示例:

  1. 用户通过APP管理界面订阅服务,并设置SLA(服务水平协议),包括服务的请求次数,服务的响应时间等等
  2. APP将用户订阅及SLA约定转换为运维策略,调用控制面提供的编程接口下发给控制面
  3. 控制面将运维策略转换为数据面标准协议下发给数据面的代理,在代理上,运维策略被转换为代理的配置和转发策略
  4. 代理在收到用户请求时,根据用户标识对用户进行认证,并根据配置和路由策略对用户请求进行处理,例如根据SLA处理用户请求的限流策略,系统忙时优先转发高SLA等级的用户请求,等等。

Service Mesh应用:用户业务订阅及SLA管理

上面只是一个非常简单的应用示例。通过对Service Mesh控制面提供的流量控制,安全策略,拓扑信息、性能指标等基本能力进行组合,并加以创新,可以创建大量端到端的高附加值业务,例如支持业务平滑升级的灰度发布,测试微服务系统健壮性的混沌测试,微服务的监控系统等等。

总结:他山之石,可以攻玉

SDN和Service Mesh的出现都是为了解决类似的网络通信问题,两者都采用了“数据面+控制面”这种类似的架构,但位于网络协议的不同层次。Service Mesh并不是下一代的SDN,但通过借鉴SDN的发展经验,Service Mesh也许可以向下面这些方向发展:

  • 北向接口:北向接口面向业务和运维,具有较高的抽象层次,比较容易提取统一的控制面标准。目前已经有多个公司支持采用SMI作为统一的控制面标准。但SMI的发展也存在一些挑战,例如如何避免SMI成为不同Service Mesh实现之间的最小公共子集,如何扩展支持除HTTP之外的其它应用层协议?
  • 南向接口:Envoy的xDS v2已经成为了南向接口的事实标准,但xDS接口包含有较多实现相关内容,例如Listener, Filter等,这些限制是否会妨碍Envoy之外的其它兼容数据面实现?
  • 对硬件的控制能力:Service Mesh控制面可以提供对数据面软硬件的统一控制能力,以减少软硬件混合环境下的运维复杂度。
  • 应用层的发展:通过北向接口(控制面编程接口)提供出来的能力,可以开发各端到端的创新应用,这也许会成为Service Mesh的下一个热点。

数据中心AI加速芯片的选择 - 老石谈芯

这篇的原文链接:https://zhuanlan.zhihu.com/p/56062418

推动人工智能爆发的最主要原因之一,就是硬件算力的提升。而英伟达的股价当年之所以能够三年涨10倍,就是因为GPU非常适用于深度神经网络的训练。与传统的CPU相比, GPU拥有数千个计算内核,能够在性能上取得上百倍的提升。因此AI就成为了GPU最主要的应用领域之一,也成就了英伟达的高速增长。

随着AI的不断发展,诸如微软和谷歌这样的巨头公司开始考虑在数据中心里采用GPU作为AI加速芯片,这时问题就出现了。在大量部署时,芯片的性能并不是唯一需要考虑的因素。事实上,很多情况下它也并不是最重要的因素。

对于某种AI加速芯片,老石将常见的评价因素总结为五点:性能、灵活性、同构性、成本和功耗。其中:

  • 灵活性:指这种芯片对不同应用场景的适应程度。
  • 同构性:指的是AI加速芯片能否重复利用数据中心现有的架构和资源。
  • 成本:既包括对该硬件加速器的研发投入,也包含了它的采购、部署和运维开支。
  • 功耗:就是指引入该方案后,对数据中心带来的额外功耗负担。

接下来,老石就对几种常见的AI加速芯片,比如GPU、FPGA以及ASIC,采用上述评价因素做一个简单的定性对比。

*GPU*

img

GPU最大的问题是,它基本上是个“功耗黑洞”:中等性能的GPU功耗都普遍超过200W,而高性能GPU的功耗会超过300W。相比于FPGA或ASIC的几十瓦甚至几瓦的功耗而言,这个数字显得过于惊人。

高功耗对于GPU在数据中心里的大规模部署是致命的,因为这不仅代表着高昂的电费开支,还表示数据中心现有的供电、散热等硬件架构需要进行重新修改,这对于同构性和低成本这两项要求而言基本上是不可能的任务。

在灵活性方面,GPU通常只适用于计算密集型运算,对于通信密集型的应用,GPU需要与CPU和网卡组成一个完整的通信系统,因此对于这类应用,GPU的灵活性会受到较大限制。

*ASIC*

img

专用的AI加速芯片以谷歌的张量处理器TPU(Tensor Processing Unit)最为典型。TPU专为谷歌的深度学习框架TensorFlow设计,现在已有第二代,被用来加速神经网络的和决策。ASIC最主要的优势是它的超高性能和超低功耗。与GPU相比,TPU在某些AI应用的性能可以提高一个量级,而功耗会下降一到两个量级。

不过,得到这样高性能和低功耗需要付出的代价就是巨大的研发成本。放眼全球,有资金实力和技术储备进行这类研发的公司,大概用一个手就能数的出来。ASIC的另外一个缺点是它的低灵活性,它通常针对某种特定的应用和算法框架而设计,因此很难直接用于其他的应用。

*FPGA*

img

相比GPU和ASIC,FPGA在各项评价指标中能够达到比较理想的平衡。在绝对性能方面,虽然不如GPU或ASIC,但由于FPGA可以定制化硬件流水线,并且可以进行大规模并行运算,因此相比传统的基于CPU的计算性能还是有着至少一到两个量级的提升。由于FPGA具有硬件可编程的特点,使得它可以应对包括计算密集型和通信密集型在内的各类应用。此外,FPGA独有的动态可编程、部分可编程的特点,使其可以跨空间和时间两个维度,同时处理多个应用,或在不同时刻处理不同应用,因此有很强的灵活性。

功耗和成本方面,FPGA的功耗通常为几十瓦,采购与运维成本远低于GPU。FPGA的开发成本主要涉及购买特定的FPGA设计和调试工具、采购FPGA芯片或加速卡,以及组建团队进行或外包FPGA开发项目等投入。虽不及CPU或GPU等基于软件的开发方式,但由于省去了FPGA芯片制造的相关环节,因此相比研发一款专用芯片而言还是低很多。

此外,FPGA目前通常以加速卡的形式配合现有的通用处理器进行大规模部署,对额外的供电和冷却等环节没有特殊要求,因此可以兼容数据中心的现有硬件体系结构。

AI芯片的最大风险

对于AI芯片的设计者而言,当前最大的风险就是AI本身。在这个群雄争霸的时代,各种新算法、新模型层出不穷,因此在某种方法一统天下之前,很难将其中的任何一种方法固化在芯片上,否则就很可能再次重演以前的小甜甜变成今天的牛夫人这样的悲剧。

比如,为了进一步提升性能功耗比,目前比较流行的方法是使用近似(approximation)算法,例如将双精度浮点数换成低精度的定点数,或者对不同权重的网络分支做剪枝、结构优化和压缩的操作

这些不断涌现的全新AI方法只有通过FPGA才能快速实现,这对于GPU或者ASIC都是不可能完成的任务。

结语

正如老石在之前的文章里提到的,数据中心与AI已经成为各家芯片公司的必争之地。只不过,近期资本市场的表现在某种程度上展示了人们对不同方案的认可度。这也是老石在本文中尝试分析的。

然而,老石并不想立flag断言这些公司的未来,老石只是相信,技术会不断给出自己的答案。


一流企业做标准:英特尔收购Barefoot背后的逻辑 - 老石谈芯

这篇的原文链接:https://zhuanlan.zhihu.com/p/84367537

今年6月,英特尔宣布收购一家名为“Barefoot”的公司,旨在帮助英特尔的数据中心部门“更好的应对云数据中心客户的不断变化的各类需求”。伴随着收购,Barefoot的CEO兼总裁,Craig Barratt博士(下图右)被任命为英特尔数据中心部门旗下“互联事业部(connectivity group)”的总经理,负责英特尔以太网控制器、网卡、交换芯片等一系列网络互联产品。

img

很多读者也许并没有听说过Barefoot这个公司。事实上,它的飞速发展已经对诸如博通和英特尔等传统网络交换芯片厂商形成了逼宫之势,大有一种“光脚的不怕穿鞋的”之感。

在这篇文章中,老石将详细解读这家“赤脚”公司的四大核心竞争科技:

  1. 一种编程语言:P4
  2. 一种可编程芯片架构:PISA
  3. 一种编译器与工具链:P4 Studio
  4. 一种可编程网络芯片:Tofino

文章最后,老石将分析Barefoot的这些“黑科技”对FPGA在网络应用的影响。

一种编程语言:P4

早在2014年,Barefoot与英特尔、谷歌、微软,以及斯坦福大学和普林斯顿大学联合发表了一篇名为《P4:Programming Protocol-Independent Packet Processors》的论文,这也代表着P4编程语言的正式诞生。

img

P4本质上是一门针对网络数据包处理的领域专用语言(Domain Specific Language)。从它的全称可以看出,P4最主要的特点就是与具体的网络协议无关,这与当前正在蓬勃兴起的SDN(软件定义网络)概念不谋而合。

在一个SDN网络中,通常可以将其划分成控制平面和数据平面两部分,这也是它有别于普通网络的最本质特点。其中,控制平面负责对数据平面的各种网络设备进行集中管理和配置,二者通过标准化的接口进行互联。控制平面往往基于标准CPU实现,因此有着很强的可编程性。而数据平面的传统实现,则是基于各家网络设备厂商、针对不同网络功能提供的各种设备。这样的实现方式,说好听一点是“百花齐放”,说现实一点就是“杂乱无章”、“各自为战”。由于各种设备和网络协议之间的兼容性和通用性不足,极大的限制了SDN数据平面在规模和功能上的扩展能力。

在现有的SDN网络中,控制和数据两个平面之间的标准化接口通常使用OpenFlow,很多网络设备供应商也相继推出了很多支持OpenFlow编程的网络硬件。然而,OpenFlow标准与网络协议紧密相关,它的多次版本更迭都是为了增加对更多协议的支持,见下图。

img

随着网络流量的爆炸性增长,各种新的网络协议层出不穷,比如在云数据中心里,各类隧道和封装协议(如VXLAN等)已经被普遍采用。除此之外,很多网络设计者也希望使用自定义或非公开的网络协议,以更好的满足自己和客户的定制化需求。这些新型的应用场景,一方面需要OpenFlow不断更新标准,另一方面需要硬件厂商不断更新硬件,以支持这些新兴协议。而这不管从成本还是时间上看,显然不能满足网络的发展需要。

事实上,P4诞生的最主要目的就是为SDN的数据平面提供协议无关的可编程能力。如下图所示,网络设计者可以通过P4定义数据平面的转发和处理规则,例如报头解析、匹配、表项配置等,然后通过编译器在目标交换机上进行实现。

img

P4作为一个开源的领域专用语言,发展至今天已有相当的规模,拥有包括英特尔、赛灵思、微软、谷歌、思科、阿里、腾讯等几十家科技公司和大学的代码贡献和支持。

值得注意的是,OpenFlow和P4均出自一个大师的手笔,那就是斯坦福大学教授Nick McKeown。作为SDN的提出者和先驱,他先后发起成立了开放网络基金会(ONF),以及负责制定P4标准的http://P4.org。此外,他也是多个初创企业的创始人,其中就包括这篇文章中介绍的Barefoot:McKeown教授在Barefoot公司担任联合创始人和首席科学家。

img

业界有“一流的企业做标准”的说法。Barefoot公司作为P4语言的主要发起者,又由SDN领域最有权威的大牛创办,因此在业界的影响力不言而喻。

一种可编程芯片架构:PISA

Barefoot的核心竞争力之一,就是提出了一种通用的、协议无关的、可编程的交换机芯片架构:PISA(Protocol Independent Switch Architecture)。

PISA的架构示意图如下所示。它的主要数据通路是由大量“匹配-动作”单元以流水线的方式组合而成。在流水线入口,有一个可编程的包头解析器,负责对数据包进行预处理和解析。此外,流水线还有一条回流路径,适用于数据包需要进行多次解析和反馈处理的情况。

img

对于每个“匹配-动作”单元,它的微架构如下图所示。可以看到,它里包含多个并行的由SRAM和TCAM组成的查找表单元,可以同时进行大量的精确匹配和三元匹配。查找后的表项再通过ALU进行计算和修改,组合成新的包头传递到下一级流水线。

img

PISA这种架构由通用的逻辑单元和流水线组成,因此与具体协议无关,并且可以通过编程实现各种标准或自定义的网络包处理规则,而无需进行架构修改,如下图。

img

一种编译器和工具链:P4 Studio

有了编程语言P4和底层架构PISA,自然需要编译器将二者进行映射。为此,Barefoot有着名为P4 Studio的编译器和开发套件。它的功能就是将P4语言描述的数据包处理规则,完整、正确的映射到PISA架构上。其功能架构如下图所示。

img

P4 Studio主要包含以下几个主要部件:

  • P4编译器、调试器和IDE。
  • P4语言的仿真环境和测试框架。
  • 底层硬件的通用接口和驱动。
  • 对开源网络操作系统的支持,如HPE的OpenSwitch、微软Azuere的SONiC和Facebook的FBOSS等。

有了全新的编程语言、编译器和系统架构,一款全新的可编程网络芯片就诞生了。

一种可编程网络芯片:Tofino

Tofino是Barefoot推出的首款可编程交换芯片,它基于台积电16nm FinFET+工艺制造。在推出之时,Barefoot称这款芯片是世界上最快的交换芯片,性能可以达到6.5Tb/s,与博通等公司的旗舰产品性能不相上下。同时,Tofino基于PISA架构,能通过P4语言进行现场编程,又有着ASIC基本的功耗和成本数据,这也是它有别于其他“传统”网络交换芯片的最大特点和优势。

img

Tofino的芯片架构示意图如下所示。可以看到,Tofino有着4条PISA架构的流水线,并通过同一个TM负责四条流水线之间的流量调度和管理,最多可以支持130万条IPv4路由。在每条流水线里,包含16个100G MAC,也可以配置成10G/25G/40G/50G等多种模式

img

目前,Barefoot又推出了第二代Tofino芯片,它基于7纳米工艺制造,性能提升了一倍,最高支持12.8Tb/s的数据包处理速率

img

基于P4的可编程网络芯片对FPGA的影响

网络数据处理和加速一直是FPGA最主要的应用领域,在之前文章中曾介绍过,英特尔近期刚刚进行了组织架构调整,将FPGA和网络平台部门合二为一,足可见对FPGA在网络领域的重视。在SDN和NFV的应用中,也有很多实用FPGA进行网络功能卸载和加速的案例,在老石之前的文章中也详细介绍过的智能网卡等等。

不过,FPGA的开发难度一直是制约其广泛使用的最大障碍之一。因此,使用诸如OpenCL等高层次语言对FPGA进行编程开发就成了业界和学术界研究的热点之一。

近年来,这类研究的重点开始转向对领域专用语言的探索,正如网络领域的P4语言。前文提到,英特尔和赛灵思都是http://P4.org的成员和代码贡献者之一,两家公司都在进行使用P4语言编程FPGA的相关研究。

在2019年的FPGA大会上,赛灵思和Nick McKeown教授以及剑桥大学联合发表了一篇讨论P4编程FPGA的论文,它使用了赛灵思的P4-SDNet编译器生成底层Verilog代码模块,然后映射到名为“NetFPGA”的参考设计上,见下图。

img

对于英特尔,在收购Barefoot之前,它就也已经开始了P4编程FPGA的研究,在最近发表的一篇白皮书中(下图),英特尔和Netcope公司合作开发了一款使用P4编程FPGA智能网卡,并得到100G吞吐量的应用实例。此外,P4语言的最初作者之一Dan Daly,一直在英特尔担任主任工程师。在收购Barefoot之后,相信对无论是FPGA还是ASIC在内的各种英特尔芯片采用P4编程会是极大的促进。

img

结语

Barefoot作为一个“出身名门”的初创公司,很好的把握了现在网络体系架构发展的最大痛点,提出了已经成为业界标准的P4语言,开发了对应的PISA芯片架构和编译器,并做出了两款可以完全编程的高性能网络交换芯片,可以说构建了完整的技术闭环。如今被英特尔收购,对双方都有极大的好处。Barefoot的整个创业过程和理念,值得各家芯片创业公司借鉴。


Kubernetes 学习路径 - caicloud

这篇的原文链接:https://github.com/caicloud/kube-ladder

背景

本文由 才云科技(Caicloud) 于 2019 年内部推出,现以开源的形式进行维护

目前云计算行业对于 Kubernetes 学习的需求日益增加,但市面上关于 Kubernetes 的资源良莠不齐,存在几个问题:

  • 官方文档缺少明确的”梯度”,信息错综复杂
  • 资料较为分散,查找信息费时费力
  • Kubernetes 发展很快,书籍或者网上教程容易过时

本文档旨在为广大从业者提供一个 Kubernetes 学习路径,为大家提供一定的指引。我们最终的目标是让所有人剥茧抽丝般地了解 Kubernetes,不仅仅知道怎么用 Kubernetes,还知道 Kubernetes 各个功能是如何设计的。在学习路径后期,我们还可以很”自然”的联想到正确的设计思路。

学习路径

注意

第一阶段 炼气期(2-4 周,每周 3-5 小时)

目标

  • Kubernetes 的背景
  • 安装 Kubernetes 环境
  • Kubernetes 基本概念和使用方法

路径

学习任何系统的之前,了解其出现的背景和意义都是必不可少的,为什么会出现 Kubernetes?它解决了什么问题?有没有其他类似的系统?这里推荐阅读才云科技 CEO 张鑫在 2017 年文章《从风口浪尖到十字路口,写在 Kubernetes 两周年之际》。

接下来,在了解 Kubernetes 系统本质之前,我们需要对 Kubernetes 有一个较为”感性”的认识,打消对 Kubernetes 的畏难情绪。这里,我们推荐使用 minikubekind 部署一个本地环境,然后开始部署一个”真实”的应用(minikube 安装需要使用科学上网,或使用“国内版” minikube)。如果想一开始就挑战更高难度的安装方式(不推荐),可以使用 kubeadm 或者手动部署所有组件。关于安装,可以参考文档 lab1-installation

在安装好环境之后,可以开始动手实践最基本的 Kubernetes 概念。在第一阶段,我们推荐熟练使用以下常用资源和概念:Pod、Node、Label、Event、Service、Configmap & Secret、Deployment、Namespace。相关学习可以参考文档 lab2-application-and-service

(可选)仅完成上述内容可能还不足以让我们非常熟悉 Kubernetes 的基本概念,下面列出其他可以参考的资料,大家也可以按照自己的方式去搜索相关的资料:

心法🤨

  • 请反复加深对上面资源的操作熟练度。如果你是第一次接触 Kubernetes,或者仅了解过一点 Kubernetes 的知识,那么基(ken)本(ding)是不明白 Kubernetes 底层到底发生了什么。请不要心急,姑且把它当成一个黑盒工具即可 🛠。
  • 你可能会在网上看到更多的概念,如 PVC、Ingress、Priority 等。炼气阶段,请不要尝试学习过多的资源类型。Kubernetes 有非常多的概念和类似的资源,我们这里熟悉最核心的概念即可,否则易走火入魔 👻,切记。当我们打通任督二脉之时,所有的新概念都不过尔尔。

第二阶段 筑基期(4-6 周,每周 8-10 小时)

目标

  • Kubernetes 的基本架构
  • Kubernetes 容器调度的基本流程

路径

短暂接触 Kubernetes 概念之后,我们需要知其然并且知其所以然,因此在第二阶段我们开始学习 Kubernetes 基本架构。学习 Kubernetes 基本架构至少需要了解以下内容:

  • Master & Node
    • 知道什么是 Kubernetes Master,什么是 Node
    • 知道两者的关系,知道它们是如何通信的
  • Master 组件
    • API Server。Kubernetes 如何接收请求,又是如何将结果返回至客户端。
    • Etcd。了解 Etcd 主要功能机制。
    • Controller Manager。Kubernetes 控制器是其架构中最为核心的一环,我们需要了解控制器的原理,List-Watch 的基本原理,知道 Kubernetes 默认情况下大致包含哪些类型的控制器。
    • Scheduler。熟悉 Kubernetes 的调度流程是怎样的,调度器在整个调度流程中的角色。
  • Node 组件
    • Kubelet。知道 Kubelet 是如何接受调度请求并启动容器的。
    • Kube-proxy。了解 Kube-proxy 的作用,提供的能力是什么。
    • Container Runtime。了解都有哪些 Container Runtime,主要了解 Docker 一些基本操作与实现原理。
  • 核心 Addons & Plugins
    • DNS。DNS 为集群的服务发现提供的支持,Kubernetes 1.13 开始默认使用 CoreDNS
    • Network Plugin。Kubernetes 多节点环境需要部署网络插件才可以使用,默认情况下使用 flannel 即可。

首先可以阅读书籍或网上博客,推荐阅读:

接下来,推荐从 0 开始部署一个 Kubernetes 集群(不使用任何工具),来加深对各个组件的理解:解决部署中出现的各种问题,查看组件启动日志等等。如果时间有限,也可以尝试使用 kubeadm 等工具来部署集群。目前 Kubernetes 集群部署自动化已经做得比较完善,但出于学习目的,再次墙裂推荐手动安装。关于手动安装集群,可以参考文档 lab3-manual-installtion

在本阶段修炼结束后,我们至少应该对以下问题了如指掌:Kubernetes 组件是如何交互,来启动容器,并对外提供服务的?

心法💪

  • 请不要死记硬背 Kubernetes 架构,要开动大脑 🧠去理解其背后设计的原因。
  • 筑基期是比较困难的一个阶段,如果感觉一头雾水,请不要气馁,你不是一个人。当你感觉进入了瓶颈时,可以尝试寻找身边的战友,总结一些你的问题并寻求答案 🍻。

第三阶段 金丹期(2-4 周,每周 3-5 小时)

目标

  • Kubernetes API 结构
  • 熟悉 Kubernetes 各个子系统
  • 熟悉 Kubernetes 排错相关内容

路径

当我们可以熟练使用 Kubernetes 的基本资源,并且对 Kubernetes 的基本架构有了充足了认识,接下来需要对 Kubernetes 的 API 结构和子系统要有一个比较全面的认识,同时也要开始更加系统的了解排查问题相关的内容。

要知道 Kubernetes API 是其最引以为傲的设计,掌握 API 的关键是需要了解:

我们可以通过浏览 Kubernetes API 代码仓库来了解 Kubernetes API 组(Group)的信息。所有的资源定义代码都遵循 //types.go 的规范,例如上述 Deployment 资源是定义在 apps group 中。我们可以在 apps/v1/types.go 中查找到关于 Deployment 的定义。

接下来,我们可以通过浏览 Kubernetes/Community 代码仓库来了解各个兴趣小组(SIG),”SIG” 是 Special Interest Group 的简称。Kubernetes 的演进都是通过 SIG 来推动的,因此了解 SIG 的分工对我们理解 Kubernetes 非常重要。一般来讲,一个 SIG 对应着一个 Kubernetes 子系统,例如,sig-apps 负责决定是否引入新的 API,或者现有 API 是否需要升级等等。我们通过查看 Community 中带有 “sig-“ 前缀的目录来了解 SIG 的工作内容、会议纪要等等。这里简单列举 Kubernetes 重要的子系统:

  • 架构 Architecture
  • 应用 Apps
  • 存储 Storage
  • 网络 Network
  • 权限 Auth
  • 节点 Node
  • 调度 Scheduling
  • 命令行 CLI
  • 多集群 MultiCluster
  • 云平台 CloudProvider
  • 扩展性 Scalability
  • 弹性伸缩 Autoscaling
  • 监控日志 Instrumentation

(可选)细心的你可能会发现以 “wg-“ 开头的目录,例如 “wg-resource-management”。”wg” 是 working group 的简称,是针对需要涉及多个 SIG 之间合作而展开的一种工作组,独立于任何 SIG 。例如 resource management 会涉及到 Node、Storage、Scheduling 等 SIGs。

作为一个承上启下的阶段,我们需要总结一些 Kubernetes 排错的能力,推荐阅读:

心法🌱

  • 本阶段的重点是”耳听六路 🙈 眼观八方 🙉”。前两个阶段接触到了很多 Kubernetes 的细节,本阶段需要对 Kubernetes 的全貌有个更加清晰的认识。很多内容可能看不太懂,但请在你的心中埋下一颗种子。

第四阶段 元婴期(4-6 周,每周 8-10 小时)

目标

  • 加深对各个资源的理解
  • 学习更多 Kubernetes 概念和知识

路径

不出意外,你现在对 Kubernetes 基本的资源已经很熟练了,对 Kubernetes 内部组件和它们的交互比较清晰,还对 Kubernetes 的 API 全貌和组织结构也有一定的了解。如果出了意外 🤔,请重新回顾你的学习过程。

本阶段,我们围绕几个关键方向来学习 Kubernetes,加深对其各个技术点的认识(这里只列出本阶段需要学习的核心能力,其他功能请量力而学):

总结一下,1)本阶段我们接触到更多的资源,包括:HPA、Job、CronJob、DaemonSet、StatefulSet、Ingress、Volume、PV/PVC、StorageClass、NetworkPolicy、PSP。2)更加深入了解已学资源的使用,例如 Init-Container、SecurityContext、Affinity 等。这些能力最终都会体现在各个资源的 API 上,例如 Affinity 是 Pod API 结构的一个字段,Scheduler 通过解析这个字段来进行合理的调度。未来如果有更多的能力,我们都可以通过解读不同资源的 API 字段来一探究竟。

本阶段相关学习可以参考文档 lab4

心法🧘‍♂️🧘‍♀️

  • 本阶段难度指数高,请合理调整你的心境。渡劫 🌋 成功后,你对 Kubernetes 的掌握将会进入一个新的台(tian)阶(keng)。
  • 学习相关功能时,可以回顾其所在 SIG,看看能不能发现有用的资源。

第五阶段 化神期(3-5 周,每周 6-8 小时)

目标

  • 学习更多 Kubernetes 集群层面的功能
  • 更加深入学习 Kubernetes 架构和组件能力

路径

当我们了解了 Kubernetes API 的设计理念,学习到了足够多的 API 资源及其使用方法之后,让我们再回顾一下 Kubernetes Master & Node 架构,以及它们运行的组件。事实上,Kubernetes 的每个组件都有很强的可配置性和能力,我们可以围绕 Kubernetes 的每个组件,来学习 Kubernetes 较为“隐晦”的功能。

推荐通过 Kubernetes Command Line Reference 来了解这些组件的配置:

同时,Kubernetes 提供了 FeatureGate 来控制不同的特性开关,我们可以通过 FeatureGate 来了解 Kubernetes 的新特性。此外,为了方便开发者和配置管理,Kubernetes 把所有配置都挪到了相对应的 GitHub 代码仓库中,即:

  • https://github.com/kubernetes/kube-scheduler
  • https://github.com/kubernetes/kube-controller-manager
  • https://github.com/kubernetes/kube-proxy
  • https://github.com/kubernetes/kubelet
  • https://github.com/kubernetes/kubectl

当然,直接裸看配置有点硬核。为方便入手,下面我们简单总结部分功能(笼统的分为 Master 和 Node):

Master

  • Dynamic Admission Control
    • 动态准入控制(在练虚期阶段需要更加深入的了解)
    • 对应 API Server --admission-control-config-file 参数
  • Advanced Auditing
    • 提供可动态配置的审计功能
    • 对应 API Server 带有 --audit- 前缀的参数
  • Etcd Configuration
    • 提供各种与 Etcd 相关的配置,例如 Kubernetes event TTL
    • 对应 API Server 带有 --etcd- 前缀的参数
  • All Admission Controllers
    • 列举所有 Kubernetes 所支持的 Admission Controllers,每个 Admission 都与 Kubernetes 特定的功能相关联
    • 对应 API Server --enable-admission-plugins 参数,该参数注释列举了所有的默认 Admission Controllers
  • Garbage Collection
    • 启用后,Kubernetes 会自动根据 OwnerReferences 来回收 API 资源
    • 对应 Controller-Manager --enable-garbage-collector 参数
  • Concurrent Sync Limiting
    • 避免过多的资源同步导致集群资源的消耗
    • 对应 Controller-Manager 带有 --concurrent 前缀的参数
  • All Controllers
    • 列举所有 Kubernetes 所支持的 Controllers,每个 Controller 都与 Kubernetes 特定的功能相关联
    • 对应 Controller-Manager --controllers,该参数注释列举了所有的默认 Controllers

其它值得注意的参数包括:

  • API-Server --max-requests-inflight, --min-request-timeout
  • API-Server --watch-cache, --watch-cache-sizes
  • Controller-Manager --node-eviction-rate
  • Controller-Manager --pod-eviction-timeout
  • Controller-Manager --terminated-pod-gc-threshold
  • Controller-Manager --pv-recycler-minimum-timeout-*

Node

  • Kubelet Eviction
    • 当节点资源不足时,Kubernetes 通过驱逐 Pods 的方式确保节点的稳定性
    • 对应 Kubelet 带有 --eviction- 前缀的参数,例如 --eviction-hard
  • Image GC
    • 清理容器镜像占用的磁盘空间
    • 对应 Kubelet 带有 --image-gc- 前缀的参数,以及 --minimum-image-ttl-duration 等参数
  • Resource Reserve
    • 为系统资源预留一定的资源,确保节点的稳定性
    • 对应 Kubelet --kube-reserved--kube-reserved-cgroup 等参数
  • CPU Manager
    • 提供更多的 CPU 管理能力,例如静态 CPU 亲和性
    • 对应 Kubelet --cpu-manager-* 前缀的参数
  • Storage Limit
    • 避免节点过度挂载数据卷
    • 对应 FeatureGate AttachVolumeLimit

其它值得注意的参数包括:

  • Kubelet & Kubeproxy --hostname-override
  • Kubelet --cgroups-per-qos
  • Kubelet --fail-swap-on
  • Kubelet --host-*
  • Kubelet --max-pods, --pods-per-core
  • Kubelet --resolv-conf
  • Kubeproxy --nodeport-addresses

心法😇

  • 通过组件配置学习 Kubernetes 功能是我们需要具备的一个常规能力,或许比较枯燥,但对我们的修炼大有裨益。
  • 如果你对 Kubernetes “无穷无尽”的功能感到有点迷茫,这是一个很正常的现象。除非是深度参与 Kubernetes 的开发,否则一定会有很多遗漏的地方。我们只要保持两个基本点不动摇:1. 懂 Kubernetes 架构和最核心的能力;2. 懂得怎么快速定位我们需要的能力。关于第二点,我们将在大乘期介绍,stay tuned!

第六阶段 练虚期(4-6 周,每周 8-10 小时)

目标

  • 对 Kubernetes 的扩展机制了如指掌
  • 可以编写 Kubernetes 控制器,能够基于扩展机制灵活地二次开发

路径

本阶段我们可以开始了解 Kubernetes 各种扩展机制。如果说 Kubernetes 的 API 和架构设计是其重要的基石,那么扩展机制使得 Kubernetes 在各个生态领域开花结果。下面我们尝试列举出所有的扩展方式,每一种扩展都有其优势和局限性,请自行思考。注意这里提到的扩展机制指的是架构上的扩展,而非功能层面的扩展,例如 Pod 支持各种 Probe 来进行健康检查,包括自定义,这里我们不归为扩展机制的能力。

API 资源扩展能力

学习 API 资源扩展的一个重要方式是创建一个扩展资源,或者编写一个自己的控制器。强烈推荐自行编写一个控制器,这里列出几个常见的工具:

API 访问扩展能力

Kubernetes API 访问扩展主要是通过 Webhook 来实现。注意只有访问控制支持动态增加外部服务,认证鉴权的外部服务在启动 API Server 的时候就注册完毕,无法在后续增加,主要原因是动态增加外部认证鉴权服务,带来的安全风险过大。

调度器扩展能力

针对简单场景,我们可以直接使用 Scheduler Extender 即可,例如按 GPU 型号调度。复杂调度场景可以使用多调度器或调度器框架,例如基于流图的调度器 poseidon,批处理调取器 kube-batch 等。一般而言,使用 Extender 即可满足大多数场景。

网络扩展能力

网络插件 CNI 是容器网络标准,Kubernetes 提供了良好的支持,常用插件包括 flannel、Calico 等等。对于 Ingress、NetworkPolicy、DNS,相信到目前为止大家应该可以理解,其本质上是 Kubernetes 定义的一套 API,底层实现可插拔,用户可以有自己的选择。

存储扩展能力

  • FlexVolume:Kubernetes 提供的一种动态对接存储方案,支持用户自定义存储后端
  • 存储插件 CSI:使用 CSI 插件,可以选择任何我们需要的存储方案

FlexVolume 是 Kubernetes 自带的对接外部存储的方案,用户编写少量的代码即可加入自定义存储后端,适用于简单场景。存储插件 CSI 是容器网络标准,Kubernetes 提供了良好的支持,同时为方便第三方实现,还提供了一整套 SDK 解决方案。所有底层存储相关的能力都与 CSI 密切相关。

运行时扩展能力

运行时接口 CRI 是 Kubernetes 提出,为解决支持多种运行时而提供的方案。任何运行时,只需实现 CRI 相关的接口,即可接入 Kubernetes 中,包括 Docker、Containerd、gVisor、Kata 等。

特殊硬件或资源扩展能力

对于简单场景,例如静态汇报资源数量,可以直接使用 Extended Resource 扩展 Kubernetes 所支持的硬件。Device Plugin 的核心是自动接入各种特殊硬件如 Nvidia、Infiniband、FPGA 等。在资源汇报层面 Device Plugin 目前也使用了 Extended Resource 的能力,但由于 Extended Resource 的局限性,Device Plugin 未来也可以与其他 API 对接。目前使用最多的 Device Plugin 主要是 Nvidia 的 GPU device plugin

监控扩展能力

  • 自定义监控:支持使用自定义监控组件如 Prometheus 提供监控指标

自定义监控包括 Custom Metrics 和 External Metrics,例如 Prometheus adaptor

云供应商扩展能力

云扩展能力的目标是使各个云供应商可以在不改变 Kubernetes 源码的情况下,接入其服务。每个云供应商都有独立的项目

命令行插件

  • Kubectl Plugin:kubectl plugin 支持扩展 kubectl 子命令,与 API 扩展能力结合可以提供近乎原生的使用方法。

心法

  • 推荐实现一个端到端的 Kubernetes 控制器,可以对整个 Kubernetes 的二次开发有更加深入的了解。此外,针对所有的扩展能力,建议先建立一个全面的认识,再根据需要深入某一项能力。
  • 我们除了通过用户手册来学习上面的技术,也可多参考 Kubernetes 的花式设计文档,主要是 Design ProposalsKEPs

第七阶段 大乘期(终身学习)

目标

  • 了解 Kubernetes 生态项目
  • 跟踪 Kubernetes 社区发展
  • 跟踪 CNCF 社区发展

路径

目前为止,我们学习了很多 Kubernetes 的概念,但也只是其最重要的部分。在本阶段,我们需要专注以下几个问题:

  • 如何跟进 Kubernetes 的新功能,以及现有功能的更多细节?
  • 如何了解 Kubernetes 整个生态环境的发展?

首先,让我们一起来学习几个重要的项目。围绕 Kubernetes 的生态环境建设是其成为容器标准的关键。

  • Helm:作为 Kubernetes 生态里的 brew、dnf、dpkg,Helm 为 Kubernetes 提供了包管理能力,方便用户快速部署安装各种服务。
  • Harbor:Harbor 与 Kubernetes 无直接关系,但作为云原生环境下最常用的镜像仓库解决方案,了解 Harbor 十分重要。
  • Prometheus:Prometheus 是云原生环境下最重要的监控组件。
  • Istio:Istio 是服务网格的关键项目,但较为复杂,可以尝试简单了解。

以上,我们仅列出了极少量的重要项目,Kubernetes 周边的项目十分之多,令人咂舌 😱。因此大乘期的你,需要开始持续跟踪 Kubernetes 及其生态的发展,甚至可以推动其发展,接下来我们列举一些靠谱资源:

GitHub 仓库

关注 GitHub 仓库可以让你了解最一手的进展,但是信息量一般较大,讨论很多难度也比较大。不过对于大乘期的你来讲,应该不是问题 😉。另外,这里还包含很多 Kubernetes 系统内部的设计,例如调度器的优化方案、资源垃圾回收方案等,值得了解和学习。

Twitter 账号

下面推荐几个 Kubernetes 项目的核心人员。大牛都喜欢用 Twitter 交(si)流(bi),可以关注一波。感兴趣的话题可以去交流,大牛都十分耐撕(nice。

除此之外,Twitter 上还有不少项目和其他 Weekly 性质的 Twitter,推荐几个账号关注:

Twitter 会根据你的喜好推荐其他相关内容,接下来就自由发挥。

Blog 账号

可以关注的优秀 Blog 很多,这里就不一一列举。

心法🐲

请坚持学习!送上一句黑鸡汤:

“The last thing you want is to look back on your life and wonder… if only.”

参考资料


传统软件工程师的 Machine Learning 学习路径 - caicloud

原文链接:https://github.com/caicloud/mlsys-ladder

从造丹炉到学炼丹的修真之路

目录

Created by gh-md-toc

背景

才云科技是一家基于容器技术和人工智能,打造新一代智能云计算平台和 AI 服务的公司。而随着超参数搜索,模型结构搜索,模型量化与压缩等功能与概念在业界的逐渐落地,机器学习平台的开发工作对机器学习本身的要求越来越高。这要求传统的软件开发工程师不仅需要了解分布式系统等与云计算相关的知识,也需要了解基础的机器学习原理与概念。因此,出于帮助才云内部的机器学习平台开发工程师们更加好地了解机器学习的目的,我们于 2019 年内部推出了这一文档,现以开源的方式进行维护。

文档主要为传统的软件工程师提供一个循序渐进,实践性强的路径,来了解深度学习的基本原理,以及深度学习在计算机视觉和其他领域的应用。由于我们的目标不是让每一位软件工程师转型为算法工程师,而是学习深度学习的知识来指导我们的工作。因此内容更偏向工程化,而非深度学习的数学知识与理论证明

这一文档以计算机视觉领域中的图像识别问题作为切入口,聚焦于一个具体的问题,深入浅出地了解经典的深度网络模型,而不会对各个领域浅尝则止。

深度学习在计算机视觉领域的应用

深度学习在计算机视觉领域有许多应用场景。

Fig. 1 图像识别与对象识别

首先最简单的是图像识别,也就是 Fig. 1 中的上图。图片中只有一个物体,而图像识别算法会识别出图像中唯一的物体是什么物体。这一例子中是狗。图像识别也是我们这一课程面向的应用场景。其代表模型有 MNIST(数字图像识别),ResNet, MobileNet, DenseNet, VGG 等。

接下来,是对象检测,或者说目标检测,也就是 Fig. 1 中的下图。在一张图中,检测出图中所有的对象以及类别(两条狗,一只猫),以及它们的位置(蓝色框和红色框)。这一应用场景下的经典模型有Faster RCNN, SSD, Yolo-v3 等。

Fig. 2 语义分割与实例分割

再接下来,有图像语义分割,也就是 Fig. 2 中的上图。图像语义分割就是机器自动从图像中分割出对象区域,并识别其中的内容。图中例子为识别了狗和猫,并且用不同的颜色区分区域。这一应用场景的经典模型有 FCN, PSP, DeepLab v3 等。

图像实例分割如 Fig. 2 下图所示,是在语义分割的基础上,划分不同实例。狗作为一个对象(可以理解为面向对象中的类),有不同的实例。实例分割不仅需要区分不同对象,还需要区分不同实例。这一场景的经典模型有 Mask RCNN 等。

Fig. 3 姿态估计(credit:知乎李沐)