云原生技术,如容器或无服务器计算,对于在云中构建高度可移植的应用程序至关重要。通过利用这些技术,你可以设计出更有弹性、可扩展和可适应不断变化的环境的应用程序。我们可以用一个词来解释这三个好处:便携。
与变得繁琐且几乎无法管理的单体模型不同,云原生微服务架构是模块化的。这种方法让你可以自由地选择合适的工具来完成工作,这种服务可以完成一个特定的功能,并且做得很好。这正是云原生方法的闪光点,因为它为更新和替换单个组件提供了一个有效的过程,而不会影响整个工作负载。以云原生的思维方式进行开发,会带来一种声明式的部署方法:应用程序、支持性软件堆栈和系统配置。
为什么是容器?
把容器看作是为一个特定任务设计的超轻量级虚拟机。容器也是短暂的,前一分钟在这里,后一分钟就消失了,没有持久性。相反,持久性与主机文件系统中的块存储或其他挂载联系在一起,而不是在容器本身。
容器化的应用程序使它们具有可移植性!我可以给你一个容器镜像,而你可以在不同的操作系统和CPU架构上部署和运行它。由于容器化的应用程序是独立的单元,被打包了所有必要的依赖、库和配置文件,代码不需要在不同的云环境中改变。因此,这里是容器如何导致云原生设计的可移植性。
- 轻量级虚拟化:容器为运行应用程序提供一个隔离的环境,共享主机操作系统内核,但隔离进程、文件系统和网络资源。
- 可移植性和一致性:容器将应用程序和它们的依赖关系打包在一起,确保它们在不同的环境中运行一致,从开发到生产。
- 资源效率高: 容器比虚拟机消耗更少的资源,因为它们隔离进程并共享主机操作系统内核;它们不需要在主机操作系统之上运行一个单独的 "客户 "操作系统的开销。
- 快速启动和部署:容器启动迅速,因为它们不需要启动一个完整的操作系统,使它们成为快速部署、扩展和恢复场景的理想选择。
- 不变的基础设施:容器的设计是不可变的,这意味着它们一旦建成就不会改变,这简化了部署、版本和回滚过程,并有助于确保不同环境下的行为一致。
什么时候应该考虑使用集装箱?
容器允许你保持一致性。开发的某些方面将在暂存和生产中被省略;例如,冗长的调试输出。但在整个测试和部署周期中,开发中的代码将保持完整。
容器非常节省资源,而且超级轻巧。虽然我们提到容器类似于虚拟机,但它们可能是几十兆字节,而不是我们习惯的巨型(甚至更小但被浪费的)虚拟机上的几十兆字节。它们越轻,启动的速度就越快,这对于在动态云计算环境中实现弹性和高性能的横向扩展非常重要。容器也被设计成不可改变的。如果有什么变化,你不会在容器中嵌入新的变化;你只需拆掉它并创建一个新的容器。考虑到这一点,在决定容器是否应该成为你的云原生模型的一部分时,这里还有其他考虑因素。
- 改进部署的一致性:容器将应用程序及其依赖关系打包在一起,确保不同环境下的行为一致,简化部署,并减少配置相关问题的风险。
- 增强可扩展性:容器通过快速启动新的实例来处理增加的需求,优化资源使用,并提高整体系统性能,从而实现应用程序的快速扩展。
- 具有成本效益的资源利用:与传统的虚拟机相比,容器消耗的资源更少,允许企业在相同的硬件上运行更多的实例,从而节省云基础设施的成本。
- 更快的开发和测试周期:容器促进了开发、测试和生产环境之间的无缝过渡,简化了开发过程,加快了新功能和错误修复的发布。
- 简化应用管理:容器编排平台管理容器化应用程序的部署、扩展和维护,使许多操作任务自动化,并减少IT团队的负担。
容器最佳实践
有很多方法可以运行你的容器,而且它们都是可以互操作的。例如,当从AWS 迁移时,你只需将你的容器镜像重新部署到新的环境中,然后你和你的工作负载就可以了。你可以使用不同的工具和引擎来运行容器。所有这些都有不同的资源利用率和价格点。如果您使用Linode(Akamai的云计算服务)托管,您可以使用我们的Linode Kubernetes引擎(LKE)运行容器。您还可以在虚拟机上启动Podman、HashiCorp Nomad或Docker Swarm或Compose。
这些开放标准的工具可以让你快速完成开发和测试,在使用LKE这样的服务时,可以获得简化管理的附加价值。Kubernetes成为你的控制平面。把它看成是一个控制平面,有所有的旋钮和拨盘,用建立在开放标准上的工具来协调你的容器。此外,如果你决定使用一个平台原生的产品,如AWS Elastic Container Service(ECS),你将为不同的利用方式付费。
容器的另一个重要部分是了解你用什么来存储和访问你的容器镜像,即所谓的注册表。我们经常推荐使用Harbor。作为一个CNCF项目,Harbor允许你运行你的私人容器注册表,允许你控制它的安全性。
始终进行测试,并有一个非常深入的回归测试套件,以确保你的代码在性能和安全方面具有最高质量。容器也应该有一个失败的计划。如果一个容器失败了,那重试机制是什么样子的?它是如何被重新启动的?这将会产生什么样的影响?我的应用程序将如何恢复?有状态的数据会在映射的卷上或绑定的挂载上持续存在吗?
以下是使用容器作为云原生开发模式的一部分的一些其他最佳实践。
- 使用轻量级的基础镜像:从一个轻量级的基础镜像开始,如Alpine Linux或BusyBox,以减少容器的整体尺寸,并最大限度地减少攻击面。
- 使用容器编排:使用容器协调工具,如Kubernetes、HashiCorp Nomad、Docker Swarm或Apache Mesos,在多个主机上管理和扩展容器。
- 使用容器注册表:使用容器注册处,如Docker Hub、GitHub Packages注册处、GitLab Container注册处、Harbor等,来存储和访问容器镜像。这使得在多个主机和计算环境中共享和部署容器镜像更加容易。
- 限制集装箱的特权:将容器的权限限制在仅为其预期目的所需的权限。在可能的情况下部署无根容器,以减少容器被破坏时的利用风险。
- 实施资源约束:设置资源约束,如CPU和内存限制,以防止容器使用过多的资源,影响系统的整体性能。
- 保持容器的最新状态:用最新的安全补丁和更新保持容器镜像的最新状态,以尽量减少漏洞的风险。
- 彻底测试容器:在将它们部署到生产中之前,确保它们按预期工作,没有漏洞。在每个阶段用CI管道进行自动化测试,以减少人为错误。
- 实施容器备份和恢复:为容器交互的持久性数据实施备份和恢复策略,以确保工作负载在发生故障或灾难时能够快速恢复。
注释