云原生平台Cloud Foundry解析

65
我一直在研究Cloud Foundry,但我仍然不太清楚它是什么。我的理解是,传统的PaaS提供商(如Microsoft Azure或Google AppEngine)提供一个完整的平台来开发、测试、托管和管理Web应用程序。但你必须使用他们的API,并且受限于他们提供的服务以及支持的语言/框架。
看起来,Cloud Foundry是某种“中间人”,它允许你的应用程序从许多公共云中使用服务。它是如何实现这一点的呢?是否有一个单一的API可以使用,类似于LibCloud或JCloud?例如,你可以使用一个提供商的服务,以及另一个提供商的服务吗?Cloud Foundry本身提供任何服务,还是仅仅是一个中间人,允许你轻松地迁移到另一个平台,并在单个应用程序中使用来自不同提供商的不同服务组合?
4个回答

88

我是Cloud Foundry的开发者——是的,Cloud Foundry确实有点模糊(无意冒犯)。希望我能帮助澄清一些事情。

Cloud Foundry是一个平台即服务,但它需要在其下面拥有一个基础设施即服务。通过BOSH工具,Cloud Foundry支持vSpherevCloudOpenStackAmazon AWS作为基础架构。大多数Web应用程序开发人员不关心这些,但对于那些必须担心大型IT基础设施的人来说,这真的很酷。

您是AcmeCorp的IT负责人。您有50000名员工,他们都使用内部Web服务Fizzbuzz来帮助完成工作。为了支持所有员工,您需要在几台配备强大处理器和大量内存的机器上运行数十个Fizzbuzz应用程序实例,并且还需要大量磁盘空间来存储内部使用的Foo、Bar和Baz应用程序所生成的信息。您已经远远超出了自己管理刀片服务器的能力范围,因此您决定租用数据中心。
不幸的是,AcmeCorp非常混乱。财务部门对您使用哪个数据中心有很大的发言权,每隔几年他们就会让您从一个数据中心切换到另一个数据中心。每隔几年,您都会经历数周的停机时间,而您的工程师们则试图修复Fizzbuzz在vSphere、vCloud、OpenStack或其他平台之间切换时暴露出的漏洞。
如果你的工程师使用Cloud Foundry编写Fizzbuzz、Foo、Bar和Baz,而不是直接针对基础架构进行编写,那么你的停机时间将会最小化。你不必太担心被锁定在特定数据中心,因为Cloud Foundry已经将这一层托管抽象化了。Cloud Foundry还支持一定数量的服务,包括PostgreSQL、MySQL、Mongo、Redis和RabbitMQ等。如果Foo、Bar和Baz使用Cloud Foundry提供的这些服务,当你在基础设施之间迁移时,就有一件少要担心的事情了。
后来,你意识到可以向其他大型企业出售Fizzbuzz作为服务,从而赚取财富。这对你来说非常有利:因为你的工程师重新设计了Fizzbuzz让它能够在Cloud Foundry上运行,所以只需将Cloud Foundry部署到AWS上,就能够为客户提供服务了。客户尝试了六个月并决定不续订服务?没问题,你不需要担心任何数据中心租约 - 只需终止所有EC2实例并继续前进。你可以为每个Fizzbuzz服务实例轻松地拥有一个Cloud Foundry部署,以使你的客户数据完全隔离。
“锦上添花”的是,Cloud Foundry是开源的。如果你发现它不太适合你的需求,你不必只是发送电子邮件给支持团队并等待Cloud Foundry工程师实现你的理想功能 - 你也可以获取源代码,以便进行任何必要的更改。而且它是根据Apache 2.0许可证提供的,所以欢迎接受拉取请求,但并非必须。我希望这能描述Cloud Foundry解决的问题类型。如有需要,请在评论中索取更多详细信息,或者您可以查看Cloud Foundry邮件列表以获取未来问题的更多信息。

还有什么不清楚的是定价吗?CF Stack是免费的,你需要支付什么费用?有什么陷阱吗? :) - Tomo
马克,非常有用的信息。如果AcmeCorp不断在本地部署新的Fizzbuzz实例,并且每个实例都有稍微不同的缓存、消息传递、日志记录、数据库连接、环境变量等配置,那么这些配置是否可以被参数化并在CloudFoundry的自助式控制台中公开,以便开发团队根据需要进行实例的预配和部署? - raffian

24

我是Cloud Foundry的开发者倡导者,想要在Mark的回答基础上添加一些内容,关注你原始问题中提到的其他细节。

首先,你提到了GAE和Azure。这两个平台都有一定的限制 - 例如,GAE限制了特定语言和API的使用。两者都不是开源的。CF是可扩展的(新版本支持构建包,例如,使您能够选择“任何”语言运行时),并且您可以选择在所需的位置运行它。

Mark提到了4个我们今天可以在IaaS上运行CF,但是假设涉及的IaaS(让我们将Azure、CloudStack、Google Compute Engine等作为未来目标)能够支持少量我们称之为云服务提供程序接口(CPIs),那么您也可以在这些基础架构上部署Cloud Foundry。

你问如何使用不同供应商的服务。像Heroku一样,即将发布的Cloud Foundry(.com)版本将支持一个“市场”,您可以从额外的供应商插件功能,如果您正在运行自己的Cloud Foundry实例,则可以选择哪些服务部署并连接到您的应用程序。

非常酷!如果您想了解更多,请在邮件列表中与我们交流!


感谢您填补我的答案空白,Andy! - Mark Rushakoff
感谢你们两位,马克和安迪!然而,我仍有一个关于API的问题。Cloud Foundry是否提供某种通用API,使我的应用程序本身具有通用性,也就是说,我的代码将与我选择的任何IaaS提供商一起运行?哦,顺便问一下,有没有代码教程可以向我展示如何入门? - Amoeba
无需担心“Cloud Foundry API”。如果您编写了一个标准的node.js、Grails、Ruby等应用程序,那么您应该可以直接将其推送到CF而不需要进行任何特殊的代码更改。您可以在tutorials上查看docs.cloudfoundry.com。 - Andy Piper
很棒的答案和深刻见解@MarkRushakoff和andy-piper。感谢你们写下这篇文章! - Vishal Biyani

6

我希望能添加一些关于API的评论到Andy的回答里,但是不幸的是我的声望还不够。据我所知,Cloud Foundry 确实没有特定的API,但它提供了许多有用的信息通过环境变量(例如VCAP_SERVICES,VCAP_APPLICATION,VCAP_CONSOLE_IP,VCAP_APP_PORT),这些信息可以从任何语言或框架中访问。虽然许多来自这些变量的信息是 Cloud Foundry 内部的,但其中一些可能非常有用。 主要的一个是VCAP_SERVICES,它提供关于绑定到您的应用程序的服务的信息。

例如,如果我想收集有关 Azure 云服务实例(比如它的 ID)的信息,我的应用程序当前正在运行,我将使用 Azure Management Library 中的类。

反过来,Cloud Foundry 提供 VCAP_APPLICATION 环境变量,其中包含以下字段:

{"application_users": [],
"instance_id":"97467a9cf508cb75273284b948b6319b",
"instance_index":1,
"application_version":"330b7caf-50e5-48f4-8792-1c80a90b06f1",
"application_name":"helloworld",
"application_uris":["helloworld.vcap.me"],
"started_at":"2013-07-22 10:58:16 +0300",
"started_at_timestamp":1374479896,
"host":"0.0.0.0",
"port":61014,
"limits":{"mem":256,"disk":1024,"fds":16384},
"version":"330b7caf-50e5-48f4-8792-1c80a90b06f1",
"name":"helloworld",
"uris":["helloworld.vcap.me"],
"users":[],
"start":"2013-07-22 10:58:16 +0300",
"state_timestamp":1374479896}

最后,谈一下日志、监控和诊断。目前在CF PaaS平台上还没有实现此功能,但我希望这个功能能够被实现(因为它是非常有用的)并且可能会向我们的应用程序公开一些新的环境变量(比如VCAP_LOGS, VCAP_PERFORMANCE_COUNTERS)。


1
如果您无法发表评论,就不应该将答案作为另一种选择。然而,我认为这是合理的,因为您正在改进答案。我建议在未来,不要新建一个答案,而是建议对现有答案进行编辑。 - Philip Gullick
据我所知,Cloud Foundry实际上没有特定的API - 实际上它有,即Cloud Controller API(在此处记录http://docs.cloudfoundry.com/docs/reference/cc-api.html)。关于日志,监视和诊断的几句话。目前在CF PaaS级别上尚未实现 - 这些功能正在通过正在开发的Loggregator添加。 - Andy Piper
1
据我理解,问题中提到的API并不是PaaS管理API(当然,这个API已经在CF中实现,并在Andy提供的链接中进行了描述),而是从部署应用程序的角度来看的API(可以由部署的应用程序调用的API)。没有这样的应用程序API(基本上,据我所知,这是因为支持大量框架)。如果我理解有误,请纠正我。 - Pavel K

5
当然,CF是您的IaaS(服务器、存储和网络)与应用程序之间的抽象层,使您的应用程序具有在公共云和私有云之间移动的可移植性,但它也远不止于此:
1. 一个高度横向可扩展的基于容器的平台
应用程序在容器中运行,相比将应用程序分配给主机(虚拟机),容器可以更好地管理资源。Warden/Garden是CF本地容器技术,尽管Docker也在最近的版本中支持。
2. 自我修复平台为您的应用程序提供多层HA
健康管理系统可以无需停机重启失败的应用程序实例、容器主机、平台进程和虚拟机。可用性区域支持在基础架构层面上实现HA。滚动更新和金丝雀部署可在部署或平台升级期间实现零停机时间。
3. 一个有见解的、多语言应用程序运行时
使用heroku的“构建包”结构,应用程序语言会被自动检测,适当的运行时堆栈会在原始操作系统映像之上构建,使开发人员专注于编写代码。
4. 开发人员按需提供有状态数据服务
开发人员可以自我配置MySQL、RabbitMQ、Redis等集群的一部分,并将uri/凭据自动注入其应用程序环境。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接