2019年4月

Big News

Let’s Encrpt 正过渡到 ISRG Root

非盈利加密组织 Let’s Encrypt 开始逐渐过渡为 ISRG Root, 这标志着它也逐渐成为顶级 CA (实际上还不是,但 Let’s Encrypt 已经被各家所认可)。【Scotthelme.co.uk】

Let’s Encrypt 推动了 HTTPS 的落地和推广,让过去成本极高的证书签发和部署成本不断降低。Let’s Encrypt 推动了 HTTPS 的落地和推广,让过去成本极高的证书签发和部署成本不断降低。对于整个行业来说,无疑是大功一件。 随着 Let’s Encrypt 的不断推广,终有一天, HTTPS 将成为标准。

Quick News

Ubuntu 19.04 将使用 Linux 5.0 内核

Ubuntu 将在新的桌面版本 19.04 中使用新的 Linux Kernel 5.0。相比前代,提供了 USB 3.2 、Type-C、AMD Radeon RX Vega M GPU 的支持。【ZDNet】

Google 将延长来自新开发者的应用核查

Google 表示,将加强对从未见过的开发者的核查,以避免“恶意”开发者。【BBC】

Pinterest 即将进行首次公开募股

知名设计网站 Pinterest 将于本周进行首次公开募股。Pinterest 是一个能够让设计师分享作品、获得灵感的地方。【CNET】

你问我相信什么样的事情?我们相信云计算是长远的。

去年,作为《穿山甲专访》系列采访之一,我们曾经给大家分享过 UCloud 技术副总裁杨镭先生的访谈。那是我和杨镭先生的第一次见面,虽然采访时间不长,但是他务实严谨的风格,也给我留下了深刻的印象。因此,这次又特意预约了他的时间,专程去上海和他深入地聊了一些过去七年 UCloud 的技术价值观理念,并与这位从一线运维跌打滚爬出身的技术领袖的所思所想产生了深切的共鸣。

作为采访者,我也是一位做了二十多年互联网技术工作的老兵,虽然在私交上我和杨镭并不算熟悉,但是随着在互联网、技术和开源方面话题的展开,我们很快就聊得十分投机。

【图:现场采访图】

第一章 一位技术人员的成长史

话题是先从杨镭先生的技术背景和从业经历展开的。

老王:是否可以请先介绍一下你之前的技术背景和你的从业方面的情况?

杨镭:我结合 UCloud 整个技术发展的情况和我自己的情况跟你讲一下。

我的背景是这样的,我 2006 年加入盛大在线,刚入职时我是从最一线的运维人员开始做的,大概两年多以后逐渐地开始参加一些研发的工作,做一些运维的平台系统开发工作。

我跟老季(UCloud CEO 季昕华)是大概 2008 年认识的,他当时在管盛大在线。盛大在线提供运维平台来支撑各个游戏部门的业务,包括像盛大创新院的服务器,其实背后都是由盛大在线提供运维的。在之后做盛大云时,我们承接了非常多的业务部门的运维工作,而当时我就是在做平台技术方面的工作。

那时包括 OpenStack 才刚刚出现,AWS在国内刚被知晓,而我们那时候自己最早做虚拟化都是通过 VMWare 来做的。我们一直在关注云计算的发展。在 2011 年底,老季出来创业时,问我有没有兴趣出来,我就出来了。

我们当时认为,运维应该走到一线去产生业务价值,而云计算正好是可以让做运维、做技术的人能做产品的一个技术。云计算说白了是把以前运维的东西放在台前了,可以去赚钱了。

?从一封未发出的邮件说起…

杨镭:当时我离开盛大的时候,写了一封邮件,但邮件我没发出去,一直存在我的草稿箱里,现在还在。其实我对盛大也是挺有感情的,整个平台都是我们一手搭建的,做了很多很多的事情,还是很辛苦的。

那封信大概的意思是说,云计算真的能解决很多问题,它能让服务器弹性地、不用关机去升级内存和 CPU……还有很多充满想象力的事情,其实这也是 UCloud 的初衷,是我们出来创业的初心,包括老季在内,其实也是这样的,在那个时候我们每次出问题,他都知道,可能是哪个机房的网线插反了,或者哪个服务器配置不小心没搞对,就像蝴蝶效应一样引发了严重的后果。

那时候出来,我们就是想把云这个事情做好。

践行新技术,到处吃螃蟹

杨镭:因为我不是从研发出身的,当时 UCloud 创业的时候也不容易,我们当时除了三个创始人之外,还有五个研发技术人员。当时所有的运维、开发、底层的一些工作,这些我都参与过。

一开始我是做网络方面的研发,当时懂网络的人比较少,而我是做运维出身的。那时还没有 SDN 的概念,我们开始做云计算的时候,当时主流的虚拟化技术是 Xen,KVM 刚进入视野。我那时候很关心 Linux 内核方面的技术,我认为 KVM 一定是有发展的,所以就建议围绕KVM而不是Xen做底层虚拟化,我们一开始采用的 KVM 就是这样来的,结果在后面就少走了很多的弯路。

我主要的一个工作是虚拟机创建流程,这跟我自己之前的一些运维知识也比较匹配,在这方面我做的很多工作主要是优化。这里面其实有一个云计算产品的精髓,云计算产品如果要做好有两方面:

一方面技术要做好,它的可拓展性、稳定性要好,这是从研发的架构层面来看;另一个方面,你要真正地懂这个产品

比如说云主机,你现在来看很多云计算产品的功能都已经习以为常了,但是 UCloud 一开始做了很多可能现在看起来不同寻常的事情。为什么会做这些事情呢?根本原因在于我们对于运维的理解比较深刻,所以我们敢先做这些功能。比如说当时有一个叫“重装系统”的功能,当时很多云服务商是没有这个功能的——那时候还很早,大约是 2012年的时候——这是我现在回过头来看一开始 UCloud 在那个阶段能冲出来的一个蛮重要的原因。

当时 SDN 也是这样的。在那个时候,很多技术和框架还没有标准的、可以参考的开源实现。比如说做虚拟化,你可以用 KVM 或 Xen 都能做 。因为那个时候我对网络方面一直很感兴趣,我以前主要是做运维,对 IPtables 很熟悉,排查过非常多复杂的现网故障,所以对于IPtables在生产环境中的使用有一定的把握。当时我们就是这样,去 AWS 的 EC2 虚拟机中抓包结合网络上的材料来分析背后的实现方案,然后用最有把握的工具链来实现。我们很快就做了一套自己的 SDN——当时还没有 Open vSwitch,它是 2013 年出来的——而我们当时就很大胆地采用了一个这样的东西。现在你看 UCloud 发布的技术文章、我们把技术实现方式都讲了出去,但是那个时候你只能自己猜和试验。

云计算的问题在于什么呢?它的产品是技术型的,客户用你的产品和服务的时候,你跟客户接触的人员是要懂技术的,尽管我们传统上认为这个事情很多还是商务上、销售上的事情。但是最终你要成就一个优质的客户,因为只有优质的客户,它的业务好,才会更多的买云服务。而优质的客户不光看客户关系的,看的还是你的技术、你的产品和你的人员是不是专业。因为这个原因,所以我后来在整个 UCloud 工作的过程里,不断地在往前走,去做技术支持。那时候我们很重视客户,我去做解决方案架构师,甚至有段时间在事业部参与销售工作,其实是因为被这个问题推着往前走的,包括我现在其实主要的精力也在负责产品以及整体的技术管理这块。

差不多我的技术历程就是这样的,这也是 UCloud 技术这几年发展的一个缩影。

第二章 技术观与价值观

老王:你作为 UCloud 的技术负责人,之前在 TIC 大会上我也听你讲到过 UCloud 的技术价值观的观点,我想了解一下在宏观上、较高层面上你是如何看待云计算技术的发展的,以及这里传达了什么样的价值观?

「能力」——用工程能力解决技术问题

杨镭:接着前面的话题说。尽管在方向上是对的,但是我们还是走了很多小的弯路。我们有一个核心的能力,也是 UCloud 的核心技术能力,就是出现 BUG 或者架构缺陷的时候可以很快地在现网透明地升级解决掉——这实际上是对我们后端的无缝升级能力特别大的挑战。我自己的感受是,一开始讲要这样做时我其实不太相信能做到,但是在第一年,我们就做到了很多这样的事情。

我举个例子,当时我们产品上线以后,做弹性 IP 的实现,一开始很简单,我们搞几台设备,用IPtables实现了弹性IP和内网云主机的映射,放在两台机器上,有故障时候服务自动切换,一切都很美好。但是上线以后就开始发现问题,这两台机器不停地宕机,其实就是出现了 “Kernel Panic”。因为我们一开始只有两台核心网络接入设备,宕机一台就是 50% 的服务不可用,然后客户自然就炸了。但是那时候我们是解决不了这个 “Kernel Panic” 问题的,尽管懂一点内核知识,但是对内核代码层面的问题并不了解,我不知道为什么会发生,虽然我知道肯定是那个方向的问题。

我们搞不定怎么办呢?当时老季和我们 COO 经常在外面和客户解释网络故障的原因,例如中午和客户吃饭,边吃边告诉客户我们出了什么问题,会采取什么样的措施确保不再出现。而在后面,我们做了一件什么事儿呢?我们大概花了 2-3 天的时间,我们把两台集中式的服务器变成分布式的了,因为在物理机上崩溃了之后、服务器就挂了嘛,所以我们把这个服务放到虚拟机里去,每一台物理机上我们放两台。这样比如说到时候这里宕机了,这两台就可以及时切换,而且因为是虚拟机,切换速度很快。我们写了一个自动化地拉起所有服务的脚本。两三天就完成了,就把这个问题救活了。如果当时不解决,可能 UCloud 就挂了。

我们靠这个机制顶了大半年,直到我们的内核负责人来了。最后,发现是什么问题呢?确实是流量带宽控制那里有一个隐藏的 BUG,这个 BUG 其实连 CentOS 都没修复——因为我们用的是 CentOS——它没修复,而我们也搞不定。当时去查找 CentOS 的补丁列表,并没发现有这方面的补丁。到最后是怎么发现的呢?是上游后来发一个修复,但是这个修复 CentOS 一直都没放进来。

你看,这本身是一个非常深入的技术问题,但在创业的时候你不一定能解决,而我们通过架构的优化把它解决掉了,这实际上是 UCloud 从成立第一年开始到现在的一个核心能力。我自己经历过这个事情以后,再遇到什么事情都不怕了。

用架构、用工程能力去解决了一个隐藏很深的技术问题,以成本最小的方法解决问题。

杨镭:这是一种变换的能力。这是整个 UCloud 技术文化所贯穿的一点,先提供一个方案把它解决掉,让我们的服务品质不会降低。而要做到这一点,我觉得最难的是你需要对工程这个事情有深刻的理解。大家都会说工程师很重要、工程能力很重要,但是说实话,就像我开始来到 UCloud 的时候,我也会讲我是工程师,我很自信这一点,但是在我第一年遇到并解决了很多问题以后,我发现自己其实还不太懂。比如说,你看现在最近很火一些知识付费类课程,当我走到那个高度后我跟你说这个事情应该这样,应该那样。但如果你是才进入行业两三年的人,你是听不懂的,你并不知道怎么做,只能知道这句话应该是对的。这句话可能确实是对的,但是在日常工作中,你第一时间是反应不过来的,因为你不会深刻理解这句话。

一开始我们的工程能力就是很强的,因为这个基因来自于创始团队是当时最顶尖的工程团队。云计算天生对稳定的要求特别高,这是非常偏工程化,而这个能力对整个行业的影响是很深远的。

「尝试」——当时胆子真的太大了,走得很前面

杨镭:当时我们遇到的挑战很多,我们一开始第一代用 SDN 白盒交换机的,当时没多想就上了,然后我们遇到了非常多的问题,最早还用过 Open Switch。其实 UCloud 前几年在技术上走的比较靠前,因为我们规模较小,决策更快,而且我们的技术团队胆子也很大,因为对技术团队很自信,对自己的工程能力很自信,所以敢尝试新的技术。比如说在网络层,我们有一套是用的 OVS,还有一套是用白盒交换机,而我们在两套之间还做了无缝地升级。我们的胆子大,所以那时候我们玩的都是新的技术。我还记得我在 2013 年出去做过 SDN 相关的演讲,现在看来当时胆子真的太大了,走得很前面。

那时候大家都知道是趋势,但是到底会怎么发展还没有人敢下定论,就像 Service Mesh 一样,现在绝大多数公司在做研究,在做概念验证,而我们已经在产品环境上跑了,我们走在很前面,有点孤独。

从我自己的角度看,我们那时候技术还是走得很快的。我举一个例子,比如现在有的云服务商要在两个地域之间打通,比如说从北京到香港,一般会告诉你要找第三方的网络供应商帮你打通。而 UCloud 是怎么做的呢?我们在底层有物理专线,用户只要在控制台点一下两边就通了。大概在相当早的时候,我们就提供了两个地域连接打通的功能。现在有的云服务商还需要几天才能为客户打通,而我们只要控制台上点一下,计费之后就通了,两个地域间的虚拟机就全部都互通了。

我记得那时候在这个功能的发布前夕,我们为此做了一整个通宵。在早上 7 点钟的时候,公司有人来上班了,我就在群里发了一条消息,说我们这个搞完了,大家都很激动,虽然现在两个地域之间的云计算服务器连起来是很正常的,但是在那个时候是没有人做的,那时候就感觉很有成就感。

其实好几个 UCloud 早期的研发同事,他们都有类似于跟我一样的事情,只是我当时的领域全部在网络上,而他们的领域在其它的方面。

整个云计算这个事情,它的核心其实是一个技术问题,最终想在这个地方走长远,本质上是要比技术能力的,一不小心就会落后。

我再举一个例子,我们在 2014 年下半年的时候招了第一个做 DPDK 研发的人,那时候我们知道 DPDK 技术发展前景还不错,所以我们招了这个岗位;而到了 2018 年的下半年,如果哪家有云产品而没有 DPDK 技术,你的产品是完全不具备商业竞争力的,你会卖得很贵,性能非常差,而友商会卖得很便宜,性能又很好,这个就是技术的红利。DPDK 的红利,但是如果你当时不投入的话,到现在可能会来不及。这是看三年的,所以我们现在在做 Serverless 方面的工作,投入是比较大的,但是如果我们不投入,可能三年以后或者四五年以后就出局了。

杨镭:我们还做了很多很有意思的事情。比如,很多用户买了云计算的虚拟机以后由于密码不严格被黑掉了,然后就变成肉鸡对外发大量数据包。这个事情很多云服务商的处理是很简单粗暴的,就是把你机器关掉,但客户其实是很受伤的。而我们当时不是这样做的。我们看,它不是对外发包吗?我们在宿主机上打开 TCP 来抓包,比如说 10 秒钟的包——因为不能长抓,长抓的量太大了——把它放到数据库里,然后我们去分析这个 TCP 包的特征、出入的比例,如果只是出站没有入站的话,那就肯定是被利用攻击了嘛。后来我们发现,所有被反射攻击利用的特征都是这样的。我们发现如果符合这个特征,就把这个虚拟机的网络给处理掉——我们会把它的网络给漂走,叫做隔离区,并没有把机器关掉,不会影响其他人,但是他的虚拟机自己还是可以登进去的。我们把这叫做最优选择,但是这个技术上很复杂。

实际上这不是纯技术的问题,这是一个理念,你要懂技术,还要懂业务,还要懂数据分析,还要设计一套东西把它串起来。

我们觉得自豪的一点不是说这个技术很厉害,而是我们的友商没人这样去做。我们做了好几件类似的事情,我们最终带动了行业的发展,客户在 UCloud 里体会到好处以后,他跑到别的云服务商说,你看 UCloud 这样做的,别的云服务商没办法,就被我们反逼提供这样的功能。而且这种功能不是说我们为了超越谁,而是我们自己想出来的。我们自己的研发人员自己关起门来说,对这种事情还是挺自豪,某种意义上我觉得这其实是种创新。

「价值观」——我们相信云计算是长远的

老王:你刚才介绍了 UCloud 的情况,作为技术人员我也觉得很有心向往之的感觉。你觉得目前而言,你们这个四五百人的技术团队的优势主要是在工程能力上还是在你们团队上的技术文化上?

杨镭:从我这个角度,首先这是我们的精髓、文化或者说是技术文化。在这个问题上我们是不允许所谓的不纯粹的。所以在管理上,其实我们对刚才说的这几件事情,我们是要求很高的,如果你新来一个人你在文化上不认同,这个可能不适合你。

还有一方面,我们对整个技术的价值观就像上次我跟你聊的一样,我们会要求很高。我们除了自己不收集,还会帮用户把隐私保护好,告诉用户不要给我们任何的信息,而多数的公司是反过来的。我们大概会在 1 年多后完成大部分云上数据的加密,包括存量的数据。就像我们在去年的 TIC 大会上说的,这里会坚决投入,而且不是一个小的研发投入。因为说白了用户未必自己诉求那么强,很多时候没这个意识。而我们做这个事情因为有很多存量的云主机,几十万台的规模,我们要透明的、不影响性能、安全地放上去,而且密钥还要定期轮换,不能老是一把密钥,但是要轮换的时候又不能影响性能,所以在工程上是有挑战的和有技术深度的。我们做那么多的事情,说白了这就是价值观问题,我们真的对用户的数据安全非常重视。

树立了一个自己的独特价值观,而且为了这个价值观付出了代价、成本。

杨镭:尽管我们现在人不少了,但是我们产品线也很长,我们这点人也是不够的,我们现在做这个事情都在加班做,说白了时间不够,只能花时间解决这种问题。这种事情说白了是在价值观上,你做不做可能没有区别,但是我们认为真正长远地看这个事情是有意义的。眼前不会有太大的得益和收益,但是从长远的趋势看,从我们的信念看,保护隐私、保护数据安全其实是一个所有人都会走向的共同的目标,只是现在还看不到。

所有的这些事情其实都是归纳到一点,你相信什么样的事情?我们相信云计算是长远的。我们跟客户的合作不是做一锤子买卖,我们甚至于对客户都有要求,我们都要做得很优秀,我们要长远看这件事情值不值得做?当然值得做。为什么要看长远?因为我们对自己还是有信心的。其实你的现在是被过去决定的,你现在是为未来做的,所以我们现在在这个层面上想的事情都是三年、五年以后的。现在这些从大势来看,我们做的这些其实都是因为我们前三年做了一些事情,我们坚持了一些事情,因为做了那些事情,我们活了下来了。现在数据隐私这个事情也好,数据安全这个事情也好,或者是很多 Serverless 产品也好,我们相信在那个时代会更重要,所以我们坚持做这个。

第三章 尾声

老王:做这个专访,一方面我们希望看到真正的技术人现在具体做哪些事情。另外一方面我们希望让大家看到有这样的公司在做具体的事情,这些事情会不会对他们产生触动、启发甚至吸引他们去关注或者参与,这是我们希望能进一步做到的东西。

我觉得今天你婉拒了很多采访的邀约而接受我们的专访,我觉得也很荣幸。一方面我们可以持续性地关注你们这边的技术进展,我们把有些可能在你们看来不值得一提,但是在我们看起来可能非常重要或者更有传播和示范意义事件传播给大家。我觉得今天的采访让我确实地了解到了很多我原来没有想到或者没有观察到的地方。

杨镭:我从一个运维人员走到现在,现在做这个事情我才能发现原来是这样的。我觉得我能理解你,因为大家专业不同,我们正好每天在这里做事情,所以就往这个方面想。我希望这篇采访能让大家知道有些事情怎么做更好,只是我们走在了前面一点,我们是这个行业里的人,我们有经验,我们传播出去,这个我很开心,就 OK 了。

“穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访,将为大家介绍中国开源领域中一些积极推动开源,谙熟开源思想的技术人,并辨析其思考、挖掘其动因,揭示其背后所发生的事情,为关注开源、有志于开源的企业和技术人标出一条路径。

取名为“穿山甲”寓意有二:取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用;穿山甲是珍稀保护动物,宣传公益。

近日,有安全研究人员连续在 Plugin Vulnerabilities 平台上,对外公布了 3 个 WordPress 插件的 0day 漏洞,将 10 万个 WordPress 网站于陷于安全风险中。

相关研究人员在公布这些漏洞时,提到他们只是为了抗议 WordPress 支持论坛版(WordPress Support Forum)的版主行为。只要版主停止不当行为,他们会立即终止对外揭露 0day 漏洞。

被揭露漏洞的 3 个 WordPress 插件分别是 Social Warfare、Yuzo Related Posts 和 Yellow Pencil Visual Theme Customizer。其中,Warfare 是个社交网站分享插件,有超过 6 万个 WordPress 网站安装了该插件。研究人员在 3 周前公布了 Social Warfare 的安全漏洞,插件开发人员即时将它修补了。

另外两个插件就没这么幸运了。可用来自动找出相关文章的 Yuzo Related Posts 原本拥有 6 万个安装数量,可自定义主题的 Yellow Pencil Visual Theme Customizer 则有 3 万个安装数量,这两个插件都都惹来了攻击,目前已在 WordPress 插件商店下架,插件开发人员还建议用户应尽快将所安装的版本移除。

据了解,原本安全人员在公开漏洞前,会给开发者一定的缓冲时间。而这次漏洞曝光,研究人员故意不遵循责任揭露,直接对外公开这些 WordPress 插件漏洞。他们声称目的是为了抗议 WordPress 支持论坛版主的不当行为。这些版主明知有些热门插件含有漏洞,却未通知相关的开发人员。版主们甚至会联手隐瞒插件的安全问题,为了推广特定安全服务而阻拦用户得到其它帮助。

这次漏洞接连曝光事件,看起来很像是 Plugin Vulnerabilities 平台与 WordPress 支持论坛之间的恩怨而引发的。前者不仅是为 WordPress 打造,定位更是专门对抗 WordPress 插件漏洞的服务。但不论如何,原本应该是维护 WordPress 安全的事件,目前却已危及到了众多 WordPress 网站的安全。

来源:开源中国

更多资讯

阿桑奇被捕后 厄瓜多尔政府和机构网站遭到 4000 万次攻击

由于厄瓜多尔现任总统莫雷诺撤回了外交庇护,维基解密创始人 朱利安·阿桑奇 Julian Assange 藏身厄瓜多尔驻英大使馆将近7年之后被抓。在接受法新社采访的时候, 厄瓜多资讯与通讯科技部副部长 Patricio Real 表示在阿桑奇遭到逮捕之后,已经受到了大规模针对该国的网络攻击。

来源: cnBeta.COM

详情: http://t.cn/EXYhKm8

本月补丁星期二活动已修复卡巴斯基发现的严重零日漏洞

在 4 月 9 日发布的补丁星期二活动日中,微软修复了卡巴斯基发现的一个零日漏洞,如果被黑客控制可以获得控制系统的完整权限。该漏洞编号为 CVE-2019-0859,是已经被黑客利用的 Win32k 提权漏洞,微软已经确认新旧 Windows 系统均受到影响。Windows 10十月更新(Version 1809)同样受到影响。

来源: cnBeta.COM

详情: http://t.cn/EXYhOFM

监控拍下欧洲犯罪分子用挖掘机盗取 ATM 机

原来为了现金,人们真的可以不顾一切、铤而走险。4 月 15 日晚,北爱尔兰再次发生一起开挖掘机砸抢 ATM 取款机的事件,从 3 月至今,这已经是第 9 起。凿出 ATM 机后,犯罪分子用反铲将其放到实现准备好的卡车上,然后逃离,将挖掘机丢弃在现场。当然,实际上,挖掘机也是偷来的。

来源: 快科技

详情: http://t.cn/EXYhQDE

俄罗斯:9 个月内 FB 和 Twitter 必须遵守数据保护法

据路透社报道,俄罗斯通信监管机构“联邦通信、信息技术与大众传媒监督局”局长 亚历山大·扎罗夫 Alexander Zharov 今日称,Twitter 和 Facebook 还有 9 个月的时间来遵守俄罗斯的数据保护法。

来源: 新浪科技

详情: http://t.cn/EXYhBoV

(信息来源于网络,安华金和搜集整理)

Dask 库可以将 Python 计算扩展到多个核心甚至是多台机器。

关于 Python 性能的一个常见抱怨是全局解释器锁(GIL)。由于 GIL,同一时刻只能有一个线程执行 Python 字节码。因此,即使在现代的多核机器上,使用线程也不会加速计算。

但当你需要并行化到多核时,你不需要放弃使用 Python:Dask 库可以将计算扩展到多个内核甚至多个机器。某些设置可以在数千台机器上配置 Dask,每台机器都有多个内核。虽然存在扩展规模的限制,但一般达不到。

虽然 Dask 有许多内置的数组操作,但举一个非内置的例子,我们可以计算偏度

import numpy
import dask
from dask import array as darray

arr = dask.from_array(numpy.array(my_data), chunks=(1000,))
mean = darray.mean()
stddev = darray.std(arr)
unnormalized_moment = darry.mean(arr * arr * arr)
## See formula in wikipedia:
skewness = ((unnormalized_moment - (3 * mean * stddev ** 2) - mean ** 3) /
            stddev ** 3)

请注意,每个操作将根据需要使用尽可能多的内核。这将在所有核心上并行化执行,即使在计算数十亿个元素时也是如此。

当然,并不是我们所有的操作都可由这个库并行化,有时我们需要自己实现并行性。

为此,Dask 有一个“延迟”功能:

import dask

def is_palindrome(s):
    return s == s[::-1]

palindromes = [dask.delayed(is_palindrome)(s) for s in string_list]
total = dask.delayed(sum)(palindromes)
result = total.compute()

这将计算字符串是否是回文并返回回文的数量。

虽然 Dask 是为数据科学家创建的,但它绝不仅限于数据科学。每当我们需要在 Python 中并行化任务时,我们可以使用 Dask —— 无论有没有 GIL。


via: https://opensource.com/article/19/4/parallel-computation-python-dask

作者:Moshe Zadka (Community Moderator) 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过简单的设置使用你家中的音响收听你最爱的网络电台。

 title=

最近网络媒体对 Google 的 Chromecast 音频设备的下架发出叹息。该设备在音频媒体界备受好评,因此我已经在考虑入手一个。基于 Chromecast 退场的消息,我决定在它们全部被打包扔进垃圾堆之前以一个合理价位买一个。

我在 MobileFun 上找到一个放进我的订单中。这个设备最终到货了。它被包在一个普普通通、简简单单的 Google 包装袋中,外面打印着非常简短的使用指南。

 title=

我通过我的数模转换器的光纤 S/PDIF 连接接入到家庭音响,希望以此能提供最佳的音质。

安装过程并无纰漏,在五分钟后我就可以播放一些音乐了。我知道一些安卓应用支持 Chromecast,因此我决定用 Google Play Music 测试它。意料之中,它工作得不错,音乐效果听上去也相当好。然而作为一个具有开源精神的人,我决定看看我能找到什么开源播放器能兼容 Chromecast。

RadioDroid 的救赎

RadioDroid 安卓应用 满足条件。它是开源的,并且可从 GitHub、Google Play 以及 F-Droid 上获取。根据帮助文档,RadioDroid 从 Community Radio Browser 网页寻找播放流。因此我决定在我的手机上安装尝试一下。

 title=

安装过程快速顺利,RadioDroid 打开展示当地电台十分迅速。你可以在这个屏幕截图的右上方附近看到 Chromecast 按钮(看上去像一个有着波阵面的长方形图标)。

我尝试了几个当地电台。这个应用可靠地在我手机喇叭上播放了音乐。但是我不得不摆弄 Chromecast 按钮来通过 Chromecast 把音乐传到流上。但是它确实可以做到流传输。

我决定找一下我喜爱的网络广播电台:法国马赛的 格雷诺耶广播电台。在 RadioDroid 上有许多找到电台的方法。其中一种是使用标签——“当地”、“最流行”等——就在电台列表上方。其中一个标签是国家,我找到法国,在其 1500 个电台中划来划去寻找格雷诺耶广播电台。另一种办法是使用屏幕上方的查询按钮;查询迅速找到了那家美妙的电台。我尝试了其它几次查询它们都返回了合理的信息。

回到“当地”标签,我在列表中翻来覆去,发现“当地”的定义似乎是“在同一个国家”。因此尽管西雅图、波特兰、旧金山、洛杉矶和朱诺比多伦多更靠近我的家,我并没有在“当地”标签中看到它们。然而通过使用查询功能,我可以发现所有名字中带有西雅图的电台。

“语言”标签使我找到所有用葡语(及葡语方言)播报的电台。我很快发现了另一个最爱的电台 91 Rock Curitiba

接着灵感来了,虽然现在是春天了,但又如何呢?让我们听一些圣诞音乐。意料之中,搜寻圣诞把我引到了 181.FM – Christmas Blender。不错,一两分钟的欣赏对我就够了。

因此总的来说,我推荐把 RadioDroid 和 Chromecast 的组合作为一种用家庭音响以合理价位播放网络电台的良好方式。

对于音乐方面……

最近我从 Blue Coast Music 商店里选了一个 Qua Continuum 创作的叫作 Continuum One 的有趣的氛围(甚至无节拍)音乐专辑。

Blue Coast 有许多可提供给开源音乐爱好者的。音乐可以无需通过那些奇怪的平台专用下载管理器下载(有时以物理形式)。它通常提供几种形式,包括 WAV、FLAC 和 DSD;WAV 和 FLAC 还提供不同的字长和比特率,包括 16/44.1、24/96 和 24/192,针对 DSD 则有 2.8、5.6 和 11.2 MHz。音乐是用优秀的仪器精心录制的。不幸的是,我并没有找到许多符合我口味的音乐,尽管我喜欢 Blue Coast 上能获取的几个艺术家,包括 Qua Continuum,Art Lande 以及 Alex De Grassi

Bandcamp 上,我挑选了 Emancipator’s BaralkuFramework’s Tides,两个都是我喜欢的。两位艺术家创作的音乐符合我的口味——电音但又(总体来说)不是舞蹈,它们的音乐旋律优美,副歌也很好听。有许多可以让开源音乐发烧友爱上 Bandcamp 的东西,比如买前试听整首歌的服务;没有垃圾软件下载器;与大量音乐家的合作;以及对 Creative Commons music 的支持。


via: https://opensource.com/article/19/4/radiodroid-internet-radio-player

作者:Chris Hermansen (Community Moderator) 选题:lujun9972 译者:tomjlw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我在 $work 建立了一个基于 Kubernetes 的平台已经快一年了,而且有点像 Kubernetes 的布道者了。真的,我认为这项技术太棒了。然而我并没有对它的运营和维护的困难程度抱过什么幻想。今年早些时候我读了这样的一篇文章,并对其中某些观点深以为然。如果我在一家规模较小的、有 10 到 15 个工程师的公司,假如有人建议管理和维护一批 Kubernetes 集群,那我会感到害怕的,因为它的运维开销太高了!

尽管我现在对 Kubernetes 的一切都很感兴趣,但我仍然对“ 无服务器 Serverless ”计算会消灭运维工程师的说法抱有好奇。这种好奇心主要来源于我希望在未来仍然能有一份有报酬的工作 —— 如果我们前景光明的未来不需要运维工程师,那我得明白到底是怎么回事。我已经在 Lamdba 和Google Cloud Functions 上做了一些实验,结果让我印象十分深刻,但我仍然坚信无服务器解决方案只是解决了一部分问题。

我关注 AWS Fargate 已经有一段时间了,这就是 $work 的开发人员所推崇为“无服务器计算”的东西 —— 主要是因为 Fargate,用它你就可以无需管理底层节点而运行你的 Docker 容器。我想看看它到底意味着什么,所以我开始尝试从头开始在 Fargate 上运行一个应用,看看是否可以成功。这里我对成功的定义是一个与“生产级”应用程序相近的东西,我想应该包含以下内容:

  • 一个在 Fargate 上运行的容器
  • 配置信息以环境变量的形式下推
  • “秘密信息” 不能是明文的
  • 位于负载均衡器之后
  • 有效的 SSL 证书的 TLS 通道

我以“基础设施即代码”的角度来开始整个任务,不遵循默认的 AWS 控制台向导,而是使用 terraform 来定义基础架构。这很可能让整个事情变得复杂,但我想确保任何部署都是可重现的,任何想要遵循此步骤的人都可发现我的结论。

上述所有标准通常都可以通过基于 Kubernetes 的平台使用一些外部的附加组件和插件来实现,所以我确实是以一种比较的心态来处理整个任务的,因为我要将它与我的常用工作流程进行比较。我的主要目标是看看Fargate 有多容易,特别是与 Kubernetes 相比时。结果让我感到非常惊讶。

AWS 是有开销的

我有一个干净的 AWS 账户,并决定从零到部署一个 webapp。与 AWS 中的其它基础设施一样,我必须首先使基本的基础设施正常工作起来,因此我需要先定义一个 VPC。

遵循最佳实践,因此我将这个 VPC 划分为跨可用区(AZ)的子网,一个公共子网和私有子网。这时我想到,只要这种设置基础设施的需求存在,我就能找到一份这种工作。AWS 是免运维的这一概念一直让我感到愤怒。开发者社区中的许多人理所当然地认为在设置和定义一个设计良好的 AWS 账户和基础设施是不需要付出多少工作和努力的。而这种想当然甚至发生在开始谈论多帐户架构之前就有了——现在我仍然使用单一帐户,我已经必须定义好基础设施和传统的网络设备。

这里也值得记住,我已经做了很多次,所以我很清楚该做什么。我可以在我的帐户中使用默认的 VPC 以及预先提供的子网,我觉得很多刚开始的人也可以使用它。这大概花了我半个小时才运行起来,但我不禁想到,即使我想运行 lambda 函数,我仍然需要某种连接和网络。定义 NAT 网关和在 VPC 中路由根本不会让你觉得很“Serverless”,但要往下进行这就是必须要做的。

运行简单的容器

在我启动运行了基本的基础设施之后,现在我想让我的 Docker 容器运行起来。我开始翻阅 Fargate 文档并浏览 入门 文档,这些就马上就展现在了我面前:

等等,只是让我的容器运行就至少要有三个步骤?这完全不像我所想的,不过还是让我们开始吧。

任务定义

任务定义 Task Definition ”用来定义要运行的实际容器。我在这里遇到的问题是,任务定义这件事非常复杂。这里有很多选项都很简单,比如指定 Docker 镜像和内存限制,但我还必须定义一个网络模型以及我并不熟悉的其它各种选项。真需要这样吗?如果我完全没有 AWS 方面的知识就进入到这个过程里,那么在这个阶段我会感觉非常的不知所措。可以在 AWS 页面上找到这些 参数 的完整列表,这个列表很长。我知道我的容器需要一些环境变量,它需要暴露一个端口。所以我首先在一个神奇的 terraform 模块 的帮助下定义了这一点,这真的让这件事更容易了。如果没有这个模块,我就得手写 JSON 来定义我的容器定义。

首先我定义了一些环境变量:

container_environment_variables = [
    {
      name  = "USER"
      value = "${var.user}"
    },
    {
      name  = "PASSWORD"
      value = "${var.password}"
    }
]

然后我使用上面提及的模块组成了任务定义:

module "container_definition_app" {
  source  = "cloudposse/ecs-container-definition/aws"
  version = "v0.7.0"

  container_name  = "${var.name}"
  container_image = "${var.image}"

  container_cpu                = "${var.ecs_task_cpu}"
  container_memory             = "${var.ecs_task_memory}"
  container_memory_reservation = "${var.container_memory_reservation}"

  port_mappings = [
    {
      containerPort = "${var.app_port}"
      hostPort      = "${var.app_port}"
      protocol      = "tcp"
    },
  ]

  environment = "${local.container_environment_variables}"

}

在这一点上我非常困惑,我需要在这里定义很多配置才能运行,而这时什么都没有开始呢,但这是必要的 —— 运行 Docker 容器肯定需要了解一些容器配置的知识。我 之前写过 关于 Kubernetes 和配置管理的问题的文章,在这里似乎遇到了同样的问题。

接下来,我在上面的模块中定义了任务定义(幸好从我这里抽象出了所需的 JSON —— 如果我不得不手写JSON,我可能已经放弃了)。

当我定义模块参数时,我突然意识到我漏掉了一些东西。我需要一个 IAM 角色!好吧,让我来定义:

resource "aws_iam_role" "ecs_task_execution" {
  name = "${var.name}-ecs_task_execution"

  assume_role_policy = <<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Effect": "Allow"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "ecs_task_execution" {
  count = "${length(var.policies_arn)}"

  role       = "${aws_iam_role.ecs_task_execution.id}"
  policy_arn = "${element(var.policies_arn, count.index)}"
}

这样做是有意义的,我需要在 Kubernetes 中定义一个 RBAC 策略,所以在这里我还未完全错失或获得任何东西。这时我开始觉得从 Kubernetes 的角度来看,这种感觉非常熟悉。

resource "aws_ecs_task_definition" "app" {
  family                   = "${var.name}"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "${var.ecs_task_cpu}"
  memory                   = "${var.ecs_task_memory}"
  execution_role_arn       = "${aws_iam_role.ecs_task_execution.arn}"
  task_role_arn            = "${aws_iam_role.ecs_task_execution.arn}"

  container_definitions    = "${module.container_definition_app.json}"

}

现在,为了运行起来我已经写了很多行代码,我阅读了很多 ECS 文档,我所做的就是定义一个任务定义。我还没有让这个东西运行起来。在这一点上,我真的很困惑这个基于 Kubernetes 的平台到底增值了什么,但我继续前行。

服务

服务,一定程度上是将容器如何暴露给外部,另外是如何定义它拥有的副本数量。我的第一个想法是“啊!这就像一个 Kubernetes 服务!”我开始着手映射端口等。这是我第一次在 terraform 上跑:

resource "aws_ecs_service" "app" {
  name                               = "${var.name}"
  cluster                            = "${module.ecs.this_ecs_cluster_id}"
  task_definition                    = "${data.aws_ecs_task_definition.app.family}:${max(aws_ecs_task_definition.app.revision, data.aws_ecs_task_definition.app.revision)}"
  desired_count                      = "${var.ecs_service_desired_count}"
  launch_type                        = "FARGATE"
  deployment_maximum_percent         = "${var.ecs_service_deployment_maximum_percent}"
  deployment_minimum_healthy_percent = "${var.ecs_service_deployment_minimum_healthy_percent}"

  network_configuration {
    subnets          = ["${values(local.private_subnets)}"]
    security_groups  = ["${module.app.this_security_group_id}"]
  }

}

当我必须定义允许访问所需端口的安全组时,我再次感到沮丧,当我这样做了并将其插入到网络配置中后,我就像被扇了一巴掌。

我还需要定义自己的负载均衡器?

什么?

当然不是吗?

负载均衡器从未远离

老实说,我很满意,我甚至不确定为什么。我已经习惯了 Kubernetes 的服务和 Ingress 对象,我一心认为用 Kubernetes 将我的应用程序放到网上是多么容易。当然,我们在 $work 花了几个月的时间建立一个平台,以便更轻松。我是 external-dnscert-manager 的重度用户,它们可以自动填充 Ingress 对象上的 DNS 条目并自动化 TLS 证书,我非常了解进行这些设置所需的工作,但老实说,我认为在 Fargate 上做这件事会更容易。我认识到 Fargate 并没有声称自己是“如何运行应用程序”这件事的全部和最终目的,它只是抽象出节点管理,但我一直被告知这比 Kubernetes 更加容易。我真的很惊讶。定义负载均衡器(即使你不想使用 Ingress 和 Ingress Controller)也是向 Kubernetes 部署服务的重要组成部分,我不得不在这里再次做同样的事情。这一切都让人觉得如此熟悉。

我现在意识到我需要:

  • 一个负载均衡器
  • 一个 TLS 证书
  • 一个 DNS 名字

所以我着手做了这些。我使用了一些流行的 terraform 模块,并做了这个:

# Define a wildcard cert for my app
module "acm" {
  source  = "terraform-aws-modules/acm/aws"
  version = "v1.1.0"

  create_certificate = true

  domain_name = "${var.route53_zone_name}"
  zone_id     = "${data.aws_route53_zone.this.id}"

  subject_alternative_names = [
    "*.${var.route53_zone_name}",
  ]


  tags = "${local.tags}"

}
# Define my loadbalancer
resource "aws_lb" "main" {
  name            = "${var.name}"
  subnets         = [ "${values(local.public_subnets)}" ]
  security_groups = ["${module.alb_https_sg.this_security_group_id}", "${module.alb_http_sg.this_security_group_id}"]
}

resource "aws_lb_target_group" "main" {
  name        = "${var.name}"
  port        = "${var.app_port}"
  protocol    = "HTTP"
  vpc_id      = "${local.vpc_id}"
  target_type = "ip"
  depends_on  = [ "aws_lb.main" ]
}

# Redirect all traffic from the ALB to the target group
resource "aws_lb_listener" "main" {
  load_balancer_arn = "${aws_lb.main.id}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = "${aws_lb_target_group.main.id}"
    type             = "forward"
  }
}

resource "aws_lb_listener" "main-tls" {
  load_balancer_arn = "${aws_lb.main.id}"
  port              = "443"
  protocol          = "HTTPS"
  certificate_arn   = "${module.acm.this_acm_certificate_arn}"

  default_action {
    target_group_arn = "${aws_lb_target_group.main.id}"
    type             = "forward"
  }
}

我必须承认,我在这里搞砸了好几次。我不得不在 AWS 控制台中四处翻弄,以弄清楚我做错了什么。这当然不是一个“轻松”的过程,而且我之前已经做过很多次了。老实说,在这一点上,Kubernetes 看起来对我很有启发性,但我意识到这是因为我对它非常熟悉。幸运的是我能够使用托管的 Kubernetes 平台(预装了 external-dns 和 cert-manager),我真的很想知道我漏掉了 Fargate 什么增值的地方。它真的感觉不那么简单。

经过一番折腾,我现在有一个可以工作的 ECS 服务。包括服务在内的最终定义如下所示:

data "aws_ecs_task_definition" "app" {
  task_definition = "${var.name}"
  depends_on      = ["aws_ecs_task_definition.app"]
}

resource "aws_ecs_service" "app" {
  name                               = "${var.name}"
  cluster                            = "${module.ecs.this_ecs_cluster_id}"
  task_definition                    = "${data.aws_ecs_task_definition.app.family}:${max(aws_ecs_task_definition.app.revision, data.aws_ecs_task_definition.app.revision)}"
  desired_count                      = "${var.ecs_service_desired_count}"
  launch_type                        = "FARGATE"
  deployment_maximum_percent         = "${var.ecs_service_deployment_maximum_percent}"
  deployment_minimum_healthy_percent = "${var.ecs_service_deployment_minimum_healthy_percent}"

  network_configuration {
    subnets          = ["${values(local.private_subnets)}"]
    security_groups  = ["${module.app_sg.this_security_group_id}"]
  }

  load_balancer {
    target_group_arn = "${aws_lb_target_group.main.id}"
    container_name   = "app"
    container_port   = "${var.app_port}"
  }

  depends_on = [
    "aws_lb_listener.main",
  ]

}

我觉得我已经接近完成了,但后来我记起了我只完成了最初的“入门”文档中所需的 3 个步骤中的 2 个,我仍然需要定义 ECS 群集。

集群

感谢 定义模块,定义要所有这些运行的集群实际上非常简单。

module "ecs" {
  source  = "terraform-aws-modules/ecs/aws"
  version = "v1.1.0"

  name = "${var.name}"
}

这里让我感到惊讶的是为什么我必须定义一个集群。作为一个相当熟悉 ECS 的人,你会觉得你需要一个集群,但我试图从一个必须经历这个过程的新人的角度来考虑这一点 —— 对我来说,Fargate 标榜自己“ Serverless”而你仍需要定义集群,这似乎很令人惊讶。当然这是一个小细节,但它确实盘旋在我的脑海里。

告诉我你的 Secret

在这个阶段,我很高兴我成功地运行了一些东西。然而,我的原始的成功标准缺少一些东西。如果我们回到任务定义那里,你会记得我的应用程序有一个存放密码的环境变量:

container_environment_variables = [
    {
      name  = "USER"
      value = "${var.user}"
    },
    {
      name  = "PASSWORD"
      value = "${var.password}"
    }
]

如果我在 AWS 控制台中查看我的任务定义,我的密码就在那里,明晃晃的明文。我希望不要这样,所以我开始尝试将其转化为其他东西,类似于 Kubernetes 的Secrets管理

AWS SSM

Fargate / ECS 执行 secret 管理 secret management 部分的方式是使用 AWS SSM(此服务的全名是 AWS 系统管理器参数存储库 Systems Manager Parameter Store,但我不想使用这个名称,因为坦率地说这个名字太愚蠢了)。

AWS 文档很好的涵盖了这个内容,因此我开始将其转换为 terraform。

指定秘密信息

首先,你必须定义一个参数并为其命名。在 terraform 中,它看起来像这样:

resource "aws_ssm_parameter" "app_password" {
  name  = "${var.app_password_param_name}" # The name of the value in AWS SSM
  type  = "SecureString"
  value = "${var.app_password}" # The actual value of the password, like correct-horse-battery-stable
}

显然,这里的关键部分是 “SecureString” 类型。这会使用默认的 AWS KMS 密钥来加密数据,这对我来说并不是很直观。这比 Kubernetes 的 Secret 管理具有巨大优势,默认情况下,这些 Secret 在 etcd 中是不加密的。

然后我为 ECS 指定了另一个本地值映射,并将其作为 Secret 参数传递:

container_secrets = [
    {
      name      = "PASSWORD"
      valueFrom = "${var.app_password_param_name}"
    },
]

module "container_definition_app" {
  source  = "cloudposse/ecs-container-definition/aws"
  version = "v0.7.0"

  container_name  = "${var.name}"
  container_image = "${var.image}"

  container_cpu                = "${var.ecs_task_cpu}"
  container_memory             = "${var.ecs_task_memory}"
  container_memory_reservation = "${var.container_memory_reservation}"

  port_mappings = [
    {
      containerPort = "${var.app_port}"
      hostPort      = "${var.app_port}"
      protocol      = "tcp"
    },
  ]

  environment = "${local.container_environment_variables}"
  secrets     = "${local.container_secrets}"
出了个问题

此刻,我重新部署了我的任务定义,并且非常困惑。为什么任务没有正确拉起?当新的任务定义(版本 8)可用时,我一直在控制台中看到正在运行的应用程序仍在使用先前的任务定义(版本 7)。解决这件事花费的时间比我预期的要长,但是在控制台的事件屏幕上,我注意到了 IAM 错误。我错过了一个步骤,容器无法从 AWS SSM 中读取 Secret 信息,因为它没有正确的 IAM 权限。这是我第一次真正对整个这件事情感到沮丧。从用户体验的角度来看,这里的反馈非常糟糕。如果我没有发觉的话,我会认为一切都很好,因为仍然有一个任务正在运行,我的应用程序仍然可以通过正确的 URL 访问 —— 只不过是旧的配置而已。

在 Kubernetes 里,我会清楚地看到 pod 定义中的错误。Fargate 可以确保我的应用不会停止,这绝对是太棒了,但作为一名运维,我需要一些关于发生了什么的实际反馈。这真的不够好。我真的希望 Fargate 团队的人能够读到这篇文章,改善这种体验。

就这样了

到这里就结束了,我的应用程序正在运行,也符合我的所有标准。我确实意识到我做了一些改进,其中包括:

  • 定义一个 cloudwatch 日志组,这样我就可以正确地写日志了
  • 添加了一个 route53 托管区域,使整个事情从 DNS 角度更容易自动化
  • 修复并重新调整了 IAM 权限,这里太宽泛了

但老实说,现在我想反思一下这段经历。我写了一个关于我的经历的 推特会话,然后花了其余时间思考我在这里的真实感受。

代价

经过一夜的反思,我意识到无论你是使用 Fargate 还是 Kubernetes,这个过程都大致相同。最让我感到惊讶的是,尽管我经常听说 Fargate “更容易”,但我真的没有看到任何超过 Kubernetes 平台的好处。现在,如果你正在构建 Kubernetes 集群,我绝对可以看到这里的价值 —— 管理节点和控制面板只是不必要的开销,问题是 —— 基于 Kubernetes 的平台的大多数消费者都没有这样做。如果你很幸运能够使用 GKE,你几乎不需要考虑集群的管理,你可以使用单个 gcloud 命令来运行集群。我经常使用 Digital Ocean 的 Kubernetes 托管服务,我可以肯定地说它就像操作 Fargate 集群一样简单,实际上在某种程度上它更容易。

必须定义一些基础设施来运行你的容器就是此时的代价。谷歌本周可能刚刚使用他们的 Google Cloud Run 产品改变了游戏规则,但他们在这一领域的领先优势远远领先于其他所有人。

从这整个经历中,我可以肯定的说:大规模运行容器仍然很难。它需要思考,需要领域知识,需要运维和开发人员之间的协作。它还需要一个基础来构建 —— 任何基于 AWS 的操作都需要事先定义和运行一些基础架构。我对一些公司似乎渴望的 “NoOps” 概念非常感兴趣。我想如果你正在运行一个无状态应用程序,你可以把它全部放在一个 lambda 函数和一个 API 网关中,这可能不错,但我们是否真的适合在任何一种企业环境中这样做?我真的不这么认为。

公平比较

令我印象深刻的另一个现实是,技术 A 和技术 B 之间的比较通常不太公平,我经常在 AWS 上看到这一点。这种实际情况往往与 Jeff Barr 博客文章截然不同。如果你是一家足够小的公司,你可以使用 AWS 控制台在 AWS 中部署你的应用程序并接受所有默认值,这绝对更容易。但是,我不想使用默认值,因为默认值几乎是不适用于生产环境的。一旦你开始剥离掉云服务商服务的层面,你就会开始意识到最终你仍然是在运行软件 —— 它仍然需要设计良好、部署良好、运行良好。我相信 AWS 和 Kubernetes 以及所有其他云服务商的增值服务使得它更容易运行、设计和操作,但它绝对不是免费的。

Kubernetes 的争议

最后就是:如果你将 Kubernetes 纯粹视为一个容器编排工具,你可能会喜欢 Fargate。然而,随着我对 Kubernetes 越来越熟悉,我开始意识到它作为一种技术的重要性 —— 不仅因为它是一个伟大的容器编排工具,而且因为它的设计模式 —— 它是声明性的、API 驱动的平台。 在整个 Fargate 过程期间发生的一个简单的事情是,如果我删除这里某个东西,Fargate 不一定会为我重新创建它。自动缩放很不错,不需要管理服务器和操作系统的补丁及更新也很棒,但我觉得因为无法使用 Kubernetes 自我修复和 API 驱动模型而失去了很多。当然,Kubernetes 有一个学习曲线,但从这里的体验来看,Fargate 也是如此。

总结

尽管我在这个过程中遭遇了困惑,但我确实很喜欢这种体验。我仍然相信 Fargate 是一项出色的技术,AWS 团队对 ECS/Fargate 所做的工作确实非常出色。然而,我的观点是,这绝对不比 Kubernetes “更容易”,只是……难点不同。

在生产环境中运行容器时出现的问题大致相同。如果你从这篇文章中有所收获,它应该是这样的:不管你选择的哪种方式都有运维开销。不要相信你选择一些东西你的世界就变得更轻松。我个人的意见是:如果你有一个运维团队,而你的公司要为多个应用程序团队部署容器 —— 选择一种技术并围绕它构建流程和工具以使其更容易。

人们说的一点肯定没错,用点技巧可以更容易地使用某种技术。在这个阶段,谈到 Fargate,下面的漫画这总结了我的感受:


via: https://leebriggs.co.uk/blog/2019/04/13/the-fargate-illusion.html

作者:Lee Briggs 选题:lujun9972 译者:Bestony 校对:wxy, 临石(阿里云智能技术专家)

本文由 LCTT 原创编译,Linux中国 荣誉推出