Kubernetes 了解云原生的原理
云原生是一种软件设计、实施和部署方法,旨在充分利用基于云的服务和交付模型。云原生[1]应用程序通常也使用分布式架构运行。这意味着应用程序功能被分解为多个服务,然后分布在托管环境中,而不是整合到单个服务器上。
有点令人困惑的是,云原生应用程序不一定在云中运行。可以根据云原生原则构建应用程序,并使用Kubernetes[2]等平台将其部署在本地,该平台模仿云环境的分布式、基于服务的交付模型。
尽管如此,大多数云原生应用程序都在云中运行。任何按照云原生原则设计的应用程序都可以在云中运行。
云原生是如何工作的?
云原生是一个高级概念,而不是特定类型的应用程序架构、设计或交付过程。因此,有多种方法可以创建云原生软件以及可以帮助实现这一目标的各种工具。
然而,一般来说,云原生应用程序共享某些核心功能:
它们是使用微服务[3]架构构建的。这意味着应用程序功能分布在许多微服务中,这些微服务相互交互以运行完整的应用程序。
它们广泛依赖 API 将内部组件相互集成,以及与第三方服务进行交互。
它们使用DevOps[4]等软件开发策略迭代和持续更新。
它们部署在分布式环境中,例如服务器集群,而不是单个服务器上。
您可以总结以上所有内容,即云原生应用程序本质上是使用现代工具和方法设计和构建的应用程序。在很多方面,"云原生软件开发"简直成了"现代软件开发[5]"的简写。这两个术语都有些模棱两可,但这就是重点:正如有很多方法可以使软件设计和开发操作现代化一样,也有很多方法可以接近云原生。
云原生有什么好处?
与传统的应用程序设计和开发策略相比,云原生提供了多种优势。这意味着那些以单体架构、本地部署和单节点托管环境等技术为中心的优势:
弹性和可靠性:由于云原生应用程序通常部署在分布式环境中,因此它们在面对故障和中断时更具弹性。单个服务器故障,甚至是多个服务器的故障,通常不会导致应用程序失败,因为服务可以重新部署到集群中的其他服务器。
可扩展性:云原生通过允许将应用程序分解为离散的部分来达到可扩展性。每个部分都可以单独缩放,从而可以高效、快速地缩放。例如,如果应用程序登录次数激增,则可以扩展应用程序的身份验证服务以应对这种增加,即使应用程序的其余部分继续以正常容量运行。
效率:从成本和性能的角度来看,云原生应用程序往往是高效的。这是因为他们只能从与之交互的云服务中消耗他们需要的资源。单体应用程序和单节点应用程序通常效率不高,因为它们可能会占用整个服务器,即使它们并不总是需要服务器上的所有可用资源。
更快的创新:云原生将应用程序分解为多个组件,这些组件可以使用自己的代码库单独开发。它还鼓励通过持续集成/持续交付6 等方法进行持续的迭代开发。在这两种方式中,云原生都让创建新功能和创新变得更加容易。
可移植性:使用云原生方法设计的应用程序通常可以在任何云中运行,以及在基于服务的模型(如 Kubernetes)上管理资源的任何本地托管平台。在这方面,云原生应用程序往往与云和基础设施无关,因此可以轻松地将它们从一个环境移植到另一个环境,而无需修改应用程序本身。
自动化:云原生可以在部署和管理应用程序时轻松充分利用自动化工具。例如,云原生应用程序经常使用容器进行部署,可以使用 Docker Swarm 或 Kubernetes 等工具进行编排,这些工具可以自动处理负载平衡和工作负载放置等任务。
云原生的缺点是什么?
虽然云原生是加速应用程序开发、最大化效率和提高可靠性的好方法,但它带来了一些挑战。最常见的包括:
复杂性:简单来说,云原生的开发策略和应用架构比传统应用更复杂。与使用单个代码库开发的单体应用程序相比,云原生应用程序包含更多移动部件,并且需要更复杂的开发过程。出于这个原因,采用云原生的组织必须实施工具和流程,使他们能够管理应用程序开发过程以及应用程序部署和管理过程的复杂性。
更多工具:与此类似,云原生应用程序通常依赖于更多工具,从而导致更复杂的技术堆栈。虽然单体应用程序通常可以仅使用 VM 进行部署,但云原生应用程序可以使用容器部署,这些容器在 VM 上运行并通过 Kubernetes 进行编排。此外,CI/CD 等开发技术需要团队管理大量工具(CI 服务器、IDE、源代码管理器等)。在有关云原生应用程序的所有这些方面,团队必须学习和跟踪更多的工具和技术。
API 依赖:虽然云原生应用程序以 API 为中心的设计使得按需消耗资源变得容易,但广泛依赖 API 也存在缺陷。API 可能会引入原本不存在的安全问题。此外,API 性能或可用性问题可能会影响云原生应用程序的性能,并且由于对第三方 API(如云供应商提供的 API)的可见性有限,这些问题可能难以解决。
锁定风险:虽然可以通过使用开放 API 和技术将云原生应用程序设计为与供应商无关,但情况并非总是如此。一些云原生应用程序可能需要来自特定云供应商的 API,或者依赖于特定的编排平台,从而导致供应商或平台锁定。
云原生开发示例
如今,云原生开发在各种类型和规模的组织中得到广泛使用。考虑以下云原生示例和用例:
重构遗留应用程序
拥有设计为在本地运行的遗留应用程序的企业可能会采用云原生作为对这些应用程序进行全面检查和现代化的手段。通常,这项工作需要重构,这意味着重新设计应用程序,使其可以在分布式环境中运行并充分利用基于服务的交付模型。
容器化应用
寻求利用比虚拟机更高效且性能更好的容器的组织可能会转向云原生来实现这一点。虽然您不必使用容器来实现云原生,但容器很适合基于微服务、面向服务的开发和部署技术。
云迁移
拥抱云原生是开始向云迁移的好方法,或者是对现有云投资的双重投资。从技术上讲,您的应用程序不必是云原生的就可以在云中运行;例如,您可以在基于云的 VM 上部署单体应用程序以在云中运行它。但是为了充分利用云,并在云环境中实现成本和性能之间的最佳平衡,您需要您的应用程序是云原生的。
成本优化
由于云原生架构和开发策略倾向于更有效地利用资源,因此云原生是寻求降低 IT 运营成本的企业的常见策略。虽然采用云原生并不能自动保证成本效率,但精心设计的云原生应用程序的运行和更新成本将低于传统应用程序。
可靠性增强
如上所述,云原生应用程序往往更可靠,因为即使主机基础设施的一部分发生故障,它们仍然可用。出于这个原因,寻求使他们的应用程序更可靠,进而改善最终用户体验的组织应该考虑云原生。
概括
通过允许组织充分利用分布式、基于服务的应用程序托管环境,云原生可以为企业、开发人员和用户等带来更好的结果。并非每个应用程序都需要是云原生的,但总的来说,云原生是构建新应用程序或大修旧应用程序时要走的路。
参考资料
[1]
云原生: https://www.itprotoday.com/hybrid-cloud/how-and-when-use-cloud-native-technology
[2]
Kubernetes: https://www.itprotoday.com/hybrid-cloud/4-reasons-why-kubernetes-so-popular
[3]
微服务: https://www.itprotoday.com/microservices/what-are-microservices
[4]
DevOps: https://www.itprotoday.com/devops/what-devops
[5]
现代软件开发: https://www.geeksforgeeks.org/modern-principles-of-software-development/