Kubernetes应用程序设计指南
引言
设计和运行考虑到可伸缩性、可移植性和健壮性的应用程序可能具有挑战性,尤其是在系统复杂性增加的情况下。应用程序或系统的体系结构规定了它必须如何运行、它希望从其环境中得到什么,以及它与相关组件的耦合程度。在设计阶段遵循特定的模式并遵循特定的操作实践可以帮助应对应用程序在高度分布式环境中运行时面临的一些最常见的问题。
Docker和Kubernetes等技术帮助团队打包软件,然后在分布式计算机平台上分发、部署和扩展。了解如何最好地利用这些工具的功能可以帮助你以更高的灵活性、控制力和响应性来管理应用程序。
在本指南中,我们将讨论你可能想要采用的一些原则和模式,以帮助你扩展和管理Kubernetes上的工作负载。虽然Kubernetes可以运行许多类型的工作负载,但你的选择可能会影响操作的简易性和系统的可能性。
针对应用程序可伸缩性进行设计
在开发软件时,许多需求会影响你选择采用的模式和体系结构。对于Kubernetes,最重要的因素之一是能够水平扩展,增加并行运行的应用程序的相同副本的数量,以分布负载和提高可用性。这是垂直扩展的替代方案,垂直扩展通常指增加单个应用程序堆栈的容量。
特别是,微服务是一种软件设计模式,可以很好地用于集群上的可伸缩部署。开发人员创建小型、可组合的应用程序,这些应用程序通过定义明确的API在网络上通信,而不是通过内部调用的单体复合程序。通过将单一应用程序重构为离散的单一用途组件,可以独立扩展每个功能。通常存在于应用程序级别的大部分复杂性和开销被转移平台上,在那里可以由Kubernetes等平台进行管理。
除了特定的软件模式之外,设计云原生应用程序时还考虑了一些额外的考虑因素。云本地应用程序通常遵循微服务架构模式,具有内置的弹性、可观察性和管理功能,以最大限度地利用云平台。
例如,使用运行状况报告指标构建云本地应用程序,以便在实例变得不健康时使平台能够管理应用程序生命周期。它们产生强大的监控数据,以提醒操作员注意问题,并使他们能够做出决定。定期重启和故障、后端程序出错以及高负载,应用程序不会无响应或是丢失数据。
遵循12要素应用原则
十二要素应用程序原则是一种流行的方法,可以帮助你专注于创建云原生Web应用程序时最重要的特征。这些原则最初是为了帮助开发人员和运营团队理解为在云上运行而设计的Web服务所共有的核心品质,现在非常适用于将在Kubernetes这样的集群环境中运行的软件。虽然单体应用程序可以从遵循这些建议中受益,但围绕这些原则设计的微服务架构效果更好。
以下是12个因素的简要总结:
- **代码库:**在代码版本管理系统(如 Git 或 Mercurial)中管理所有代码。代码库全面规定了部署的内容。
- **依赖项:**依赖项应该完全由代码库明确地管理,无论是供应商软件(与代码一起存储)还是在包管理器指定固定的版本。
- **配置:**将配置参数从应用程序中分离出来,并在部署环境中定义它们,而不是将它们放置到应用程序本身中。
- **后台服务:**本地和远程服务都被抽象为网络可访问资源,并在配置中设置连接详细信息。
- **构建、发布、运行:**你的应用程序的构建阶段应该与你的应用程序发布和运行过程完全分开。构建阶段从源代码创建部署制品,发布阶段结合制品和配置,运行阶段执行发布。
- **进程:**应用程序被实现为不应依赖本地存储状态的进程。应该将状态落到后台服务,如第四个因素中所述。
- **端口绑定:**应用程序应本机绑定到端口并侦听连接。路由和请求转发应该在外部处理。
- **并发性:**应用程序应该依赖于通过流程模型进行扩展。同时运行应用程序的多个副本,可能跨多个服务器,允许在不调整应用程序代码的情况下进行扩展。
- **可处置性:**进程应该能够快速启动并优雅地停止而不会产生严重的副作用。
- **开发/生产:**您的测试、试运行和生产环境应紧密匹配并保持同步。环境之间的差异可能造成不兼容和未经测试的配置。
- **日志:**应用程序应该将日志流式传输到标准输出,以便外部服务可以决定如何最好地处理它们。
- **管理流程:**一次性管理流程应针对特定版本运行,并与主流程代码一起提供。
管理版本控制系统(如Git或Mercurial)中的所有代码。依赖项:依赖项应该完全显式