从 Gmail 到 YouTube 和 Google 搜索,Google 的所有产品都是在容器中运行。 容器化让我们的开发团队可以快速行动、高效部署软件,并以前所未有的规模运营。每个星期我们都要启动数十亿个容器。 这十年来,我们不但积累了有关如何在生产环境中运行容器化工作负载的丰富知识,而且一直与社区积极分享这些知识:从早期为 Linux 内核贡献 cgroups,到开放我们内部工具所采用的设计源代码作为 Kubernetes 项目,均是如此。我们将这些专业知识融入 Google Cloud Platform,使开发者和任何规模的企业都能轻松利用最新的容器技术创新成果。

容器提供了一种逻辑打包机制,以这种机制打包的应用可以脱离其实际运行的环境。利用这种脱离,不管目标环境是私有数据中心、公有云,还是开发者的个人笔记本电脑,您都可以轻松、一致地部署基于容器的应用。容器化使开发者和 IT 运营团队的关注点泾渭分明 - 开发者专注于应用逻辑和依赖项,而 IT 运营团队可以专注于部署和管理,不必为具体的软件版本和应用特有的配置等应用细节分心。
之前使用虚拟化环境的用户经常会将容器与虚拟机 (VM) 进行比较。您可能已经熟悉虚拟机的定义:在主机操作系统上运行且以虚拟化途径访问底层硬件的客机操作系统(如 Linux 或 Windows)。与虚拟机相似,容器也让您可以将应用与库和其他依赖项打包,提供独立环境来运行您的软件服务。但是,我们从下方可以看到,两者的相似性仅此而已,因为容器为开发者和 IT 运营团队提供了更加轻型、具有众多优势的运营单元。

与虚拟机的硬件栈虚拟化不同,容器在操作系统级别进行虚拟化,且可以直接在操作系统内核上运行多个容器。也就是说,容器更轻巧:它们共享操作系统内核,启动速度更快,且与启动整个操作系统相比其占用的内存微乎其微。
可用的容器格式有许多。Docker 是一种广受欢迎的开源容器格式,Google Cloud Platform 和 Google Kubernetes Engine 均支持这种格式。
容器会将应用相互隔离,除非您明确将它们连接起来。这意味着,您不必担心依赖项冲突或资源争用,因为您可以为每项服务设置明确的资源限制。重要的是,因为您的应用不是直接在主机操作系统上运行,您可以获得额外的安全保障。

容器让开发者可以创建与其他应用相隔离的可预测环境。容器还可以包含应用所需的软件依赖项,比如具体的编程语言运行时版本和其他软件库。从开发者的角度看,无论应用最终部署在什么地方,都可以保证这些条件一致。这一切将转化为生产力的提升:开发者和 IT 运营团队可以减少调试和诊断环境差异所需的时间,将更多的时间用于为用户提供新的功能。而且这也意味着 bug 更少,因为开发者现可在开发和测试环境中做出在生产环境中也适用的假设。

容器几乎能在任何地方运行,极大减轻了开发和部署工作量:在 Linux、Windows 和 Mac 操作系统中;在虚拟机或裸机上;在开发者的机器或本地数据中心的机器上;当然还有在公有云上。而 Docker 容器映像格式广受欢迎,则进一步增强了可移植性。无论您希望在什么地方运行软件,都可以使用容器。

容器会在操作系统级别虚拟化 CPU、内存、存储和网络资源,为开发者提供在逻辑上与其他应用相隔离的沙盒化操作系统接口。
容器的优势 | 虚拟机的优势 | |
---|---|---|
一致的运行时环境 | check | check |
应用沙盒化 | check | check |
占用的存储空间少 | check | |
开销低 | check |
借助容器,您可以将应用及其依赖项封装为一个可进行版本控制的简洁清单文件,不但能让您团队中的开发者轻松复制您的应用,还可在集群中的机器之间复制。
软件库将零碎的代码打包在一起,让开发者脱离用户身份验证和会话管理等逻辑;与此类似,容器让您可以将应用整个打包,脱离操作系统、机器,甚至是代码本身。结合基于服务的架构,要求开发者考虑的整体单元就会小许多,因而敏捷性和生产力更高。所有这些都能简化应用的开发、测试、部署和整体管理。
容器最适合基于服务的架构。在单体架构中,应用的每个部分(从 IO、数据处理到呈现)都交织在一起;与此不同的是,基于服务的架构会将这些部分分为独立的组件。工作的分离和分割让您的服务在其他服务发生故障时也能继续运行,使您的应用在整体上更加可靠。
组件化还让您能更快、更可靠地进行开发;小代码库更易于维护,而且由于服务是独立的,您可以轻松地测试特定的输入会造成怎样的输出。
基于服务的应用最适合使用容器,因为您可以对每个容器进行运行状况检查,限制每项服务只能使用特定的资源,以及独立启动和停止每项服务,不会相互干扰。
同时,由于容器脱离了代码,您可以将单独的服务视为黑箱,从而进一步缩小开发者需关注的空间。当开发者开发相互依赖的服务时,可以轻松地为具体的服务启动一个容器,而不必浪费时间事先设置正确的环境和排查问题。
我们在 Google 的内部集群管理系统 Borg 上取得了许多成果,并将积累的这些经验融入到了开源项目 Kubernetes 中。现在,您和其他公司可以分享我们数十年的宝贵经验。Kubernetes 也称为“k8s”,可提供自动化的容器编排功能(为您管理机器和服务),提升可靠性,减少您需要在 DevOps 上投入的时间和资源,更为您减轻与这些工作相关的压力。
Kubernetes 使与部署和管理应用相关的所有工作都得以简化。Kubernetes 会自动执行发布和回滚操作,并监控服务的运行状况以在出现不良影响之前阻止那些存在问题的发布。它还会对您的服务不间断地执行运行状况检查,重新启动有故障或停滞的容器,且只会在确认已成功启动服务时向客户提供服务。此外,Kubernetes 还会自动根据利用率上下调节您的服务容量,确保您在需要的时刻只运行需要的服务容器。与容器一样,Kubernetes 可让您对集群进行声明式管理,以便对您的设置进行版本控制,使其易于复制。
- check 自动发布和回滚
- check 服务运行状况监控
- check 自动调节服务容量
- check 声明式管理
- check 随处部署,包括混合部署
或许最重要的是,Kubernetes 可在任何地方使用,让您可以在本地部署、公有云部署以及混合部署之间进行协调。这让您的基础架构可以覆盖位于任何位置的用户,让您的应用可以实现更高的可用性,让您的公司可以在安全与费用上取得平衡,一切都可根据您的具体需求定制。

当然,Kubernetes 在 Google Cloud Platform 上的运行性能最佳。Google Kubernetes Engine 是优秀的代管式 Kubernetes 解决方案,可让您迅速完成设置并做好正式投入使用的准备。
Kubernetes Engine 由最了解容器的 Google 可靠性工程师全面管理,确保您的集群不但随时可用,而且保持最新状态。它可与所有 GCP 服务(如 Stackdriver Monitoring、Diagnostics 和 Logging,Identity and Access Management,以及 Google 一流的网络基础架构)无缝集成。
- check 代管式开源 Kubernetes 服务
- check 服务等级协议 (SLA) 承诺 99.5% 的正常运行时间,集成的多可用区部署功能让您实现高可用性
- check 与其他 GCP 服务无缝集成
- check 业界领先的性价比
- check 灵活,并且可与本地集群或其他云服务商实现互操作性
- check Google 级代管式基础架构
但是,我们非常愿意为您提供选择的余地。Google Cloud Platform 为您提供多种运行容器的方案。从 Google Cloud Run 提供的完全代管式环境,到 Kubernetes Engine 提供的集群管理功能,再到具有世界一流性价比的 Google Compute Engine 上提供的自主开发型基础架构,您总是可以在 Google Cloud Platform 上找到运行容器所需的理想解决方案。

不仅如此,Google Cloud Platform 还为您提供了使用容器所需的工具,满足您从开发环境到生产环境的各种需求。在 Google 的严格安全标准和世界级网络的支持下,Cloud Build 和 Container Registry 可提供 Docker 映像存储和管理服务。Google 的 Container-Optimized OS 提供预装了 Docker 和 Kubernetes 运行时的高安全性轻量级操作系统。您的所有容器管理工作都可以在 GCP 上搞定。

“十年的容器管理系统打造经验让我们受益良多,我们将所学到的许多宝贵经验心得融入了 Kubernetes 这个 Google 最新的容器管理系统。该系统的目标是利用容器的功能大幅提升编程人员的生产力,简化人工和自动系统管理工作。”
- 《Borg、Omega 和 Kubernetes:十年来从这三个容器管理系统中获得的经验教训》,Google LLC,2016 年