无论是要构建一个应用或开发一个更庞大的解决方案,在技术选型时,技术的开放性和可移植性已经成为很多企业优先考虑的问题之一。毕竟没人希望自己未来的发展方向和成长速度被自己若干年前选择使用的某项技术所限制或拖累。
那么当你的业务已经上云,当你在云中通过开放、自由的开源技术和产品来运营时,是否就意味着不再需要担心开放与否的问题?并不是!你选择的云平台本身,它开放吗?自由吗?存在技术锁定的隐患吗?
市面上的云服务平台丰富各异,如何选择最适合自己的?更重要的是,你考虑过云的可移植性问题吗?我们在今年根据具体需求选择的云平台,能否满足以后的需求?如果不能,是否可以在必要时方便快捷地将应用移植到其他平台?
云的中立性,该考虑了!
在云时代,诸如容器和无服务器计算这样的云原生技术是构建高可移植性应用程序时不可或缺的。与日渐繁琐并且几乎无法管理的单体(Monolithic)模型不同,云原生微服务架构是模块化(Modular)的。这种方法使得我们可以自由地为工作选择适合的工具,用一个服务来执行一种特定功能,通过“专精”获得更好的效果。
云原生方法在这种情况下开始大放异彩,它提供了一种有效流程,方便我们更新和替换应用程序中的单个组件,而不会对整个工作负载产生影响。使用云原生思维进行开发,还催生出一种声明性(Declarative)的部署方法:分别部署应用程序、为其提供支撑的软件栈,以及配套的系统配置。
为何使用容器?
我们可以把容器想像成一种专为执行某一特定任务而设计的超轻量级虚拟机。容器的寿命往往很短暂,前一分钟可能还在运行,下一分钟就消失了,缺乏持久性。实际上,持久性是通过绑定主机文件系统中的块存储或挂载其他存储服务来实现的,并不需要与容器本身进行绑定。
通过对应用程序进行容器化改造,可使其具备可移植性!只需准备好一个容器镜像,就能将其部署到不同架构CPU上运行的不同操作系统中。由于容器化应用程序是一种自包含(Self-contained)的独立单元,其中包括了所有必须的依赖项、库以及配置文件,因此在不同云环境中运行完全无需更改代码。
简单来说,在云原生设计中,容器可通过下列方式实现可移植性:
- 轻量级虚拟化:容器为应用程序的运行提供了一种隔离环境,虽然共享主机操作系统内核,但会对进程、文件系统以及网络资源进行隔离。
- 可移植且一致:容器将应用程序及其依赖项打包在一起,确保无论在开发还是生产环境中,应用程序都可以一致地运行。
- 资源效率:容器比虚拟机消耗的资源更少,因为容器会隔离进程并共享主机操作系统的内核;同时容器不需要在主机操作系统之上运行一个单独的“来宾”操作系统,这进一步降低了开销。
- 快速启动和部署:容器启动速度飞快,因为并不需要引导完整的操作系统,因此容器成了快速部署、扩展和恢复等场景中的理想选择。
- 不可变的基础架构:容器在设计上是不可变(Immutable)的,这意味着容器在构建完成之后就不会再产生任何变化,这种特性简化了部署、版本控制和回滚流程,还有助于确保在不同环境中实现一致的行为。
何时应当考虑使用容器?
容器可以帮助我们维持一致性,同时有助于省略开发过程中的某些暂存和投产环节。开发过程中所发布的代码将在整个测试和部署周期中保持完整。
容器在资源的使用方面非常高效,并且本身非常轻巧。虽然类似于虚拟机,但容器一般只有数十MB大小,不像虚拟机那么庞大(往往有数GB大小,虽然也有更小的,但资源浪费情况更严重)。容器越轻巧,启动速度就越快,从而越容易在动态的云环境中实现弹性和高性能横向扩展。容器在设计上还是不可变的。如果有什么东西需要变更,并不需要将变更嵌入容器,只要销毁旧容器创建新容器就行了。
除此之外,在决定是否将容器作为云原生模型的一部分时,还需要注意下列因素:
- 提高部署的一致性:容器会将应用程序及其依赖项打包在一起,确保在不同环境中运行时产生一致的行为,这还有助于简化部署过程,降低配置问题造成的风险。
- 增强可扩展性:容器可通过快速启动新实例来应对激增的需求,帮助应用程序实现快速扩展,同时还可优化资源使用,改善系统整体性能。
- 经济高效的资源利用率:容器的资源用量远少于传统虚拟机,企业可在相同硬件上运行更多实例,从而节约云基础设施的成本。
- 为开发和测试周期提速:容器促进了开发、测试和生产环境间的无缝过渡,简化了开发过程,加快了新功能和Bug修复的发布速度。
- 简化应用程序管理:容器编排平台负责管理容器化应用程序的部署、扩展和维护,可自动实现大部分运维任务,降低IT团队的负担。
有关容器的最佳实践
运行容器的方法有很多,这些方法都是可以互操作的。例如,在从其他公有云平台迁移时,只需将自己的容器镜像重新部署到新环境,即可快速迁移工作负载。此外,我们还可以使用不同的工具和引擎来运行容器。这些方式有着不同的资源利用率和价格点。
以Akamai的云平台为例,如果通过Linode进行托管,用户将可以使用Linode Kubernetes Engine(LKE)运行自己的容器,或者也可以通过虚拟机来运行Podman、HashiCorp Nomad、Docker Swarm以及Compose。
这些符合开放标准的工具可以帮助大家快速完成开发和测试工作,并且在使用LKE这样的服务时,还可以通过简化管理获得更多附加值。Kubernetes会成为用户的控制平面。用户可将其视作一个控制台,通过上面的各种按钮和旋钮控制自己的容器,并使用各种基于开放标准的工具。
容器的另一个重点在于需要理解该用什么来存储和访问自己的容器镜像(这个东西也被称为容器注册表)。通常建议使用Harbor。作为一个CNCF项目,Harbor可以帮助我们运行专用的容器注册表,从而控制相关的安全设置。
请始终记得进行测试,并准备好足够深入的回归测试套件,以确保自己的代码符合最高的性能和安全性要求。容器还应该具备失败计划。如果一个容器失败,此时的重试机制应该是怎样的?该如何重新启动?这会产生怎样的影响?应用程序又该如何恢复?有状态数据是否持久保留在映射卷或已绑定的挂载卷上?
在云原生环境中使用容器时,还需要注意下列最佳实践:
- 使用轻量级基础镜像:从轻量级基础镜像(例如Alpine Linux或BusyBox)着手,这有助于减小容器的整体大小并最大限度减小攻击面。
- 使用容器编排工具:使用容器编排工具(例如Kubernetes、HashiCorp Nomad、Docker Swarm或Apache Mesos)来跨越多台主机管理和扩展容器。
- 使用容器注册表:使用容器注册表(例如Docker Hub、GitHub Packages registry、GitLab Container registry、Harbor等)来存储和访问容器镜像。这有助于跨越多台主机和计算环境共享和部署容器镜像。
- 限制容器特权:限制容器所获的的特权,只为容器提供完成预期目的所必须的特权。尽可能部署无Root容器,从而降低容器遭到破坏被滥用后造成的风险。
- 实施资源约束:针对CPU和内存等资源设置限制约束,防止容器使用太多资源并影响到系统整体性能。
- 确保容器处于最新状态:通过最新安全补丁和更新让容器镜像始终处于最新状态,最大限度降低漏洞所造成的风险。
- 充分测试容器:在部署到生产环境前,确保容器能够按照预期工作且不包含漏洞。使用CI管道在每个阶段进行自动化测试,从而减少人为错误。
- 为容器实施备份和恢复机制:为容器访问的持久数据实施备份和恢复策略,以确保在出现故障或灾难后,工作负载依然可以快速恢复。
越来越多的企业和业务开始上云,云计算的概念也变得愈加重要。云平台的中立性对于维护公平竞争环境、保护数据安全和隐私、确保服务质量和可靠性以及提升业务灵活性和可扩展性都至关重要。在选择云服务商时,企业有必要考虑服务商是否能保持中立性,并采取相应的监管和管理措施,以确保云服务的公正性和安全性。
在选择了要使用的云平台,并开始构建、部署自己的应用和业务时,也需要充分利用上文提到的云原生思路和容器等技术,为应用的可移植性奠定基础,确保在需要时能够以最小的代价,顺利在不同平台之间进行迁移。
Akamai旗下的Linode云计算平台始终坚持开放的心态,不仅努力打造开放且自由的平台,允许用户自由选择和管理自己的服务,而且始终致力于保护用户数据的安全和隐私,遵循严格的隐私政策和数据处理规范。此外,Linode也大力参与到开源社区,提供了对许多开源项目和工具的支持。
无论你是开发者、创业者还是企业家,Linode都能为你提供高性能、安全可靠的云服务,助你轻松构建、扩展和管理项目和业务。欢迎关注Akamai机构号,立即体验Linode,拥抱自由选择与灵活自主的云平台,释放创新无限可能!