谷歌云平台-好的、坏的和丑陋的(它大多是好的)

2020-07-10 03:57:23

在使用Google Cloud时,是否正在寻找云托管的Maven存储库?注册Dep Private Maven存储库的14天免费试用版。

DEPS是一个私有的、托管的Maven存储库。在建造它的时候,我有一个关键的决定要做-在哪里托管它?我评估了许多不同的托管服务,但最终还是选择了Google Cloud Platform(GCP)。我已经在前期生产和生产中使用它超过一年半了。我没有看到太多关于Google Cloud的体验报告,所以我想分享一下我是如何发现它的,哪些运行得很好,哪些还需要改进。我把我的想法分成了好的、嗯、坏的、难看的和改进的机会。我已经将其与亚马逊网络服务(Amazon Web Services,AWS)进行了比较和对比,后者是我经验最丰富的另一个托管提供商,也是GCP最大的竞争对手。

前面要注意的是,这些只是我的经验,很可能是我误解或曲解了这里的事情。如果我犯了什么错误,请让我知道,这样我就可以改正了。我只谈论我有使用经验的服务。有很多非常好看的服务,比如Google Kubernetes Engine、Google App Engine和BigQuery,但是我还没有足够地(或者根本没有)使用它们来对它们进行评论。

Google Cloud的权限模型是其最强大的功能之一。AWS IAM权限相当复杂;在实践中,人们通常将权限设置为S3:*或等效权限以使其正常工作。由于这个原因(以及其他原因),为开发、试运行和生产,甚至更多环境运行多个AWS帐户已成为一种“最佳实践”。AWS似乎可以接受这种情况,并正在向它倾斜,为AWS落地区和组织提供帮助协调多个客户的服务。这是可行的,但似乎增加了很多复杂性。

相比之下,GCP提供了一个简单得多的起点:项目。您创建的每个资源(我认为?)。生活在一个项目中,而项目生活在您的(单个)组织中。默认情况下,项目内的资源可供该项目中的其他资源访问(只要其API已启用),而项目外的任何资源都不能访问。例如,如果您创建了云SQL数据库和云存储存储桶,则默认情况下,项目内的VM可以访问这两种资源,但项目外的VM不能访问这两种资源。这对于设置安全的权限结构有很大帮助。如果需要,您可以设置项目间资源访问,但您可能不会太需要它。根据我的经验,我需要它来访问磁盘映像和DNS记录,但是Dep的生产服务的其他一切都隔离在生产项目中。

Google的组织管理提供了具有级联权限的分层文件夹。我不需要使用它们,但看起来这将很好地扩展到非常大的组织。我想知道这是不是模仿了谷歌内部许可系统的运作方式?

GCP的产品理念与AWS截然不同。当新的GCP功能和资源发布到正式可用时,它们通常是非常高质量的。这与AWS形成了鲜明对比,在AWS中,有时会觉得您是第一个使用某项功能的人。我看到的一句话听起来很真实,那就是“Google的Beta就像AWS的GA”。

GCP在将他们的不同服务集成到一起方面也做得很好。GCP提供了一组较小的核心原语,这些原语是全局的,可以很好地用于许多用例。Pub/Sub可能是我拥有的最好的例子。在AWS中,当您阅读本文时,您已经拥有SQS、SNS、Amazon MQ、Kinesis数据流、Kinesis Data Firehose、DynamoDB Streams,可能还有另一项排队服务。2019年更新:亚马逊现在又发布了一项流媒体服务:亚马逊托管流媒体Kafka。GCP有PUB/SUB。Pub/Sub似乎足够灵活,可以取代大多数(全部?)。在AWS的各种队列中。(免责声明,我还没有使用Pub/Sub,只是看了它的文档)。

默认情况下,谷歌选择了强一致性。Google云存储具有一致的列表和获取,云密钥管理服务具有强大的(全球)一致密钥支持,而Cloud Spanner是其全球一致的数据库。许多AWS服务最终是一致的,这给开发人员带来了复杂性。

尽管Google的原语集比AWS少,但它们通常更简单。它们没有提供几十种计算实例类型,而是只提供了四种类型:微型、标准、Highmem和Highcpu。实际上,这些都是设计空间中的预配置,您可以调整和配置实例的大小并将其配置为内存和CPU的任意组合。

另一件小事,但我很欣赏的一件事是,GCP的资源名称通常更美观。您可以自己命名资源(我正在查看jfkjfkfjlkjfjfkak.cloudfront t.net),或者生成的名称很短,例如<;instance-prefix>;-cjgh。

GCP最好的一点是,大多数资源要么是全球性的,要么是地区性的。这包括控制面板(您可以在一个屏幕上看到您项目的所有虚拟机)、磁盘镜像、存储桶(一个大陆内的多个区域)、网络配置、全局负载均衡、发布/订阅、vPC网络,以及我可能忘记的更多内容。这与AWS形成了鲜明对比,在AWS中,包括控制面板在内的大多数资源要么是地区性的,要么是地区性的。

谷歌计算引擎对我来说非常可靠。我只在少数虚拟机上使用它,但我没有注意到它有任何问题。实例组管理器工作良好,自动伸缩实现了预期的效果。运行状况检查可用于销毁不健康的实例并创建新实例,而无需手动干预(这有利弊,因为您可能会丢失调试信息)。滚动更新可以很好地进行部署。滚动更新管理器在关闭旧实例之前等待新实例正常运行。这有助于在投产之前捕捉到一些问题。如果您的实例不健康,GCP会提供实时实例迁移。很好,好像一周发生一次/两次,我从来没有注意到有任何问题。在AWS上,维护事件将需要重新启动。

谷歌的定价模式要简单得多。如上所述,您可以将您的机器预先配置为几乎任何对您的应用程序有意义的内存和CPU组合。如果您需要某些CPU功能,或者只想略微提升性能,您也可以选择您的英特尔CPU实例系列。

对于标准虚拟机,谷歌提供持续使用折扣。如果您运行标准虚拟机的时间超过一个月的25%,计算引擎会自动为您的账单打折。如果您运行一个实例整整一个月,最终会有30%的折扣。如果您不想预购容量,但仍有稳定的工作负载,这是一个很好的好处。他们甚至对“推断实例”做了一些巧妙的处理,将部分实例使用打包在一起。这意味着如果您在一个月内更换实例,您不会失去您的折扣,并且最终会给您最大可能的折扣。我不能在这里公正地说,看看那些文件,真的很酷。

谷歌对AWS现货定价的回答是抢占实例。他们不是竞标实例并计算出你愿意支付的最高价格,而是提供单一的、固定的80%折扣。可抢占实例更棘手的一点是,在实例被抢占之前,您只会得到30秒的警告。在AWS上,你有两分钟的时间。权衡的是,可抢占实例和标准实例的启动时间都更快,因为Google可以更快地驱逐可抢占实例。在AWS上,提交Spot请求后,您可能需要等待一小段时间才能满足您的Spot请求。

最后,谷歌对亚马逊的预留实例做出了回应,而且它们再次变得简单得多。要使用承诺使用折扣,请分别购买vCPU和内存容量。您的购买绑定到一个地区,但在其他方面几乎可以转换为任何实例配置(有关一些小限制,请参阅文档)。承诺使用折扣将自动应用于您在工作负载中运行的实例,然后持续使用折扣将应用于在此基础上的任何资源使用。

挑选Terraform对Dep来说是个很大的胜利。它使我们能够快速、安全地启动完整的试运行或开发环境,以测试有风险的基础设施更改。它还确保对生产的更改作为一个整体进行跟踪、评论和连贯。TerraForm需要一点学习,但是Google Cloud Provider文档真的很不错,而且致力于该提供商的团队正在不断地使用GCP中的新功能和资源对其进行更新。如果你想成为每个GCP特性的前沿,那么Terraform可能不太适合你,因为它们通常不支持测试版资源。但是,您可以通过Console/CLI/Deployment Manager管理这些测试版资源,直到添加了对Terraform的支持,然后将它们导入到您的Terraform配置中。

我认为Terraform有一个需要改进的地方,那就是从单一配置运行多个环境,例如dev、staging、prod。工作区很好,但对基于工作区切换变量的支持有限。

网络和防火墙配置简单方便。默认的网络决定对我来说似乎很好。但是,我在这里运行的实例还不够多,不会遇到任何问题。默认情况下,谷歌的网络是全球性的,无需额外设置或费用即可实现地区间通信。在AWS上,您需要运行NAT实例或NAT网关来实现跨地域的私有网络通信。

谷歌云平台松弛的价值无可估量。他们的产品渠道中有很多GCP工程师。谷歌的员工和客户都非常乐于助人。你可以收集一些内部八卦、调查邀请函,以及提前访问测试版程序。它还有助于调试问题是特定于您的基础结构,还是影响到其他人的更广泛的问题。稍后会详细介绍这一点。

谷歌的游戏机看起来比AWS好看多了。因为它与我的Google账户绑定,所以我不需要每天使用2FA密钥登录,我可以使用AWS进行登录。控制台设计良好,布局合理。在这种情况下,谷歌没有AWS拥有的相同数量的服务是有帮助的。您可以将您使用的任意数量的服务固定到侧栏菜单。我想随着他们产品的增长,他们可能需要进一步重新设计侧边栏。该控制台是全球性的,而不是地区性的,因此您可以在一个项目的单一“窗格”中看到所有地区的资源(除了被收购的公司,更多信息见下文)。不再想“我有没有留下一个实例在US-EAST-2上运行?”

我几乎忘了把GCS放在这篇文章里,因为它是如此可靠,以至于它淡出了背景。大多数时候我都不会真的去想这件事。多区域存储真的很不错,如果你能穿戴稍有延迟的产品的话。这使得在多个地区运行变得更容易,这是Dep未来提高可用性计划中的一项内容。GCS支持S3API,而无需运行像Azure这样的S3代理。

日志记录速度快,易于查询。我对此有很好的体验,尽管我的需求相当温和。所有GCP服务都会发出结构化日志,便于查询。一个缺点是,导出到GCS的日志没有签名,而且您似乎无法验证日志是否未被篡改。如果有人知道验证日志的方法,我很想知道。

谷歌在https://issuetracker.google.com.上有一个公共问题跟踪器。谷歌员工对问题的回应大多是“感谢您的反馈,我们会加以考虑”,但它的存在是件好事,有时他们会问一些澄清的问题,这表明他们确实关心这个问题。他们还有一个用于反馈的UserVoice和许多邮件列表。如果所有的邮件列表/论坛都能像AWS一样有一个统一的视图,那就太好了。哪些邮件列表可用并不总是很清楚。更新:黑客新闻上的jjjjoe向我推荐了https://cloud.google.com/support/docs/groups,它聚合了所有可用的邮件列表。

安全性是我选择一家主要的云提供商而不是更小众的主机的主要原因之一。谷歌做的每件事都融入了安全性,从保护你的谷歌账户开始。谷歌有一份很好的白皮书,涵盖了他们在传输过程中的加密。跨区域通信是加密的,这很好,因为这是您在AWS上需要设置的一件更少的事情。大多数服务在默认情况下都提供加密,你唯一的选择是使用谷歌的密钥还是你自己的密钥。我最近正在设置一些S3存储桶,我惊讶地发现他们仍然提供使用未加密存储桶的选项。

Google的元数据服务需要添加特定的HTTP标头才能响应。这可以防止服务器端请求被伪造,这是受欢迎的。

这些都是我用过的不错的服务。我不会强烈推荐它们,但它们也不坏。

Container Builder是用于构建容器和运行持续集成(Continous Integration,CI)的工具。因为它首先是一个容器构建工具,所以理解如何使用它来运行CI可能有点棘手。它缺少许多其他CI工具(如Circle CI或Travis CI)的标准功能,例如构建缓存、GitHub状态通知、松弛测试失败通知、为数据库运行SideCar容器。这些都不是太难滚动您自己,但如果它们是内置的,那就更好了。

Cloudbuild有一个共享的、免费的N1标准实例池,这些实例一直在运行,并且可以立即开始运行构建。它们还提供高CPU虚拟机,您可以付费使用,但它们仅在构建开始时启动。我尝试了高CPU实例来运行更快的构建,但是包括实例引导时间在内,测试时间非常简单,所以我仍然使用N1标准1。

在较早的草案中,帐单是在坏的部分,但GCP最近发布了帐单报告。这些服务比AWS提供的服务更有限,但请给我提供我想要的信息。如果您想深入研究,它们还提供与Data Studio的帐单集成。AWS内置仪表板仍然是这里的赢家,它具有更大的灵活性和预置报告。

无法设置估计使用量的计费警报,只能设置实际使用量的计费警报。因此,如果你想跟踪整个月的支出情况,并及早发现是否有什么地方出了问题,你最终需要设置25%、50%、75%的预算警报。当你收到它们时,你会检查你这个月有多远。在过去的几天里,他们发布了账单预测,因此希望账单警报能够基于预测的支出,而不仅仅是实际支出。

虽然GCP服务表现出很强的一致性,但我不能总是对文档说同样的话。有时您会看到两个页面不一致,例如HTTP/2服务器推流既支持又不支持:

负载均衡器充当HTTP/2到HTTP/1.1的转换层,即Web服务器始终看到并响应HTTP/1.1请求,但是来自浏览器的请求可以是HTTP/1.0、HTTP/1.1或HTTP/2,不支持HTTP/2服务器推送。-设置HTTP(S)负载均衡。

http2_server_push_canceled_invalid_response_code负载均衡器取消了http/2服务器推送,因为后端返回无效的响应码。只有在后端使用http2时才会发生。客户端将收到包含INTERNAL_ERROR的RST_STREAM。-HTTP(S)负载平衡日志记录和监控。

文档有时会做出断言或告诉您不要超过某些限制,但没有告诉您原因,也没有告诉您如果超过限制会发生什么。这方面的一个示例是扳手拆分大小:

根据经验,父子表层次结构中每组相关行的大小应该小于几GiB。

GCP文档有时会遗漏有关组件之间交互的信息,例如可抢占实例、自动缩放、滚动更新和HTTP负载均衡器。有时候,医生会给你一句话,让你自己找出所有的含义。AWS文档可能过于冗长,但它们通常非常善于记录与其他功能和服务的集成。

有时,在浏览服务或API的文档时,您会发现旧方法已被弃用,但他们推荐您使用的新方法仍然是beta或alpha(!)。

我报告了针对AWS文档的错误/澄清,并收到了AWS团队成员的及时反馈,甚至要求澄清。在我提交的针对谷歌文档的评论中,这种情况从未发生过。

使用自动缩放和运行状况检查时,可观察性有点困难。据我所知,一些不同类型的健康检查没有记录在任何地方。不过,这种情况似乎正在改善,最近添加了自动缩放日志解释。也没有简单的方法可以将自动缩放日志绑定到Slake通知中。如果您想要这样做,您将需要创建到PubSub的日志导出,这将触发云函数(相当于AWS Lambda)。

据我所知,云SQL的维护在运行之前是不会收到通知的,它只是在运行。如果要运行维护窗口,您可以指定该周的维护窗口运行的时间。

我在处理不同Java客户端库之间的依赖冲突时遇到了一些麻烦。每个人都想要一组公共依赖项的不同版本。我相信一定有很好的原因,但是有几个库附带了对com.google.guava/guava-jdk5的依赖,您会想要将其排除,而使用最新的Guava版本。

API库和工具分布在几个GitHub组织中,包括GoogleCloudPlatform、Google,可能还有其他组织,这有时会使追踪某物的定义变得有点困难。

使用Stackdriver Trace有点麻烦。Java SDK从来没有得到很好的记录,有几个不同的、记录最少的API版本可供选择。最近,似乎推荐的方法是使用OpenCcount来检测您的代码。

Stackdriver提供了两个代理来捕获日志和指标。日志捕获通过Fluentd插件提供,指标通过Collectd提供。当我尝试在G1-Small实例上运行Dep时,有一次我发现收集到的日志和丢失的日志中出现了无法解释的高CPU峰值。自从回到N1标准1实例以来,我没有看到任何这些问题。

Google Cloud SQL提供了多种连接Postgres SQL实例的选项,但您可能并不需要通过您的私有网络访问。相反,您最终可能会在VM上运行云SQL代理,从而打开到SQL实例的隧道。

使用云外壳时,使用临时IP白名单。然而,我发现申请白名单需要很长时间(1-2分钟),所以我通常会放弃,选择另一种方式连接。

与AWS相比,改进的速度感觉非常缓慢。去年发布的公告花了很长时间才公布。例如,2017年宣布了客户可靠性工程和新的支持方法,而他们的新支持服务才刚刚推出。这感觉就像是比AWS小得多的操作。没有时间可以浪费了,AWS正在加速,而且感觉GCP跟不上。

目前,GCP无法与许多AWS服务平起平坐。在今年早些时候起草这篇文章时,我注意到他们缺少缓存、WAF/DDoS保护和低延迟键值存储(起价不是700美元/月)。何维夫。

.