大约一年前,我们遇到了一些阻碍我们开发和部署过程的挑战,所有这些都来自我们当时所采用的单体架构。事实上,团队对下一次部署过程充满了担忧,这个过程变得困难并且涉及到了,部署新功能与开发它们一样是一个巨大的挑战。部署也非常耗时,即使在所有事情都应该如期完成的情况下也需要半天的时间才能完成。
为了缓解这些问题,我们着手建立新的精简基础设施。更具体地说,我们的目标是创建一个定义明确的流程,用于部署需要的任何基础设施,实现通用的基础设施元素,为所有区域和层提供可重复的环境,并确保流程不会对参与其中的任何人造成困扰。
为了实现这些目标,我们开始探索基于微服务架构的可能实现。因为我们所在的公司主要业务在金融服务领域,帮助电子商务企业检测并防止消费者欺诈。我们在追求这种新架构的同时,意识到需要采取充分有效的安全和数据处理措施。这样做可以最好地满足客户的要求,并满足监管我们行业的非常严格的数据保护法规。
正如您在本图中看到的那样,我们以前存在的架构是一个非常传统的架构,包括
应用空间,单体应用,分段数据库以及在我们的企业内不可信的第三方软件。
当时我们的基础架构显示了一个复杂的环境,其中使用了大量的KVM。更复杂的是,这些KVM中的每一个都是独特的。这意味着它们不可复制,并且很难维护。
使用基于微服务的基础架构,对于该我们来说是第一次,对我们的团队来说也是一个全新的挑战。为了开始实施这个新的基础架构,我们开始引导旧环境,建立一个可编排的并丢弃一些对我们来说效果不好的组件。但我们也调整了我们的整个流程(包括构建管道),并为新基础架构准备并运行了服务器。然后,我们开始制作一个高度灵活的原型,适合与Docker和我们新的工具链完全集成。
我们早期学到的关于微服务的一点是:完美的微服务是完全解耦的。它什么都不知道。它不知道与谁交谈,在哪里或是谁。它不一定依赖于队列,也不应该(我们需要建立一个队列让我们学习这一点)。我们甚至不知道微服务在哪里,除非我们在基础设施中查找它。
从去年创建的最初原型开始,这种新的基础架构发展非常迅速。随着Docker的投入使用,我们能够设置一键式部署并实现我们的目标,即拥有可重复的环境。我们在迁移旧服务时遇到了一些问题,这导致我们发现节点包rc对Dockerize来说是一个非常有利的配置包。
为了支持我们的新基础架构,我们改变了我们的堆栈,我们利用GitLab作为解决方案的存储库。正如前面提到的,Docker使我们能够在重现性,通用性和可追踪性方面实现我们的目标。我们将Rancher作为我们的编排解决方案,因为它对我们的开发人员来说是最原生的体验,并且允许我们快速编译我们的遗留基础架构。Instana为我们提供强大的应用性能监控和微服务监控框架,能够实现有用的自动化,为我们提供对我们所需系统的深入了解。Kibana,Elasticsearch和Logstash也有关键部分。为了满足我们独特但关键的监管需求,NeuVector在这里扮演着一个重要角色,作为创建防火墙规则的自动化解决方案,并在微服务环境的复杂性中处理安全问题。
现在看看我们新的基于微服务的基础设施,显示我们的数据库是相同的,基本设计非常相似。改变之处在于,现在一切都变成了微服务,除了一些正在开发的遗留的庞然大物以及不可更改的必要第三方应用之外。
以前,我们依靠网络分段,使用四个分段网络来满足必要的数据保护法规。由于这些法规,我们有某些数据是不允许合并的,我们必须严格控制哪些应用可以访问哪些其他应用。
今天,我们能够满足我们的监管需求,同时利用更简单,更易维护的基于微服务的基础架构,这比以前更安全,因为由于docker和不可变的基础架构,环境约束可能更严格。现在只使用两个网络:数据库网络和应用网络。
分离数据库不是必需的,但是在这种情况下完成是为了提供高性能的专用服务。该设置还提供通用数据存储,Docker通常不需要这些数据存储,但可用于满足传统需求。同时,数据库等特殊服务需要特殊待遇;你想要保护他们更多,因为这是你的数据所在。还有一些例子,你可能需要解决某些特殊硬件需求,例如安装NVMe磁盘或安装特殊的CPU架构,如IBM的POWER8。将一个数据库放到Docker中会带来一些好处:它使数据库具有可重复性,通用性并且更容易扩展。我们使用CockroachDB来满足这些需求。
从这里开始,我们准备生产的最后一步就是准备好安全性,日志记录和监控功能。这样做需要深入了解我们的流量以及我们的应用的行为方式,不仅仅是为了安全的目的,而且还有助于解决问题。请记住,在微服务框架内,了解哪些服务可以相互沟通至关重要。这里Docker通过提供不变性产生另一个好处,它允许严格的访问规则来控制服务之间的内部通信或外部与互联网的通信。
对于安全自动化,我们严重依赖NeuVector来处理容器环境的复杂性。由于手动防火墙规则太大而无法在微服务系统中管理,因此需要一种自动安全的安全方法(NeuVector提供了这些规则自动为你创建优势)。此策略还有助于处理常见漏洞和CVE,这些漏洞和CVE是在问题修复程序可用时发布的。当生产中的镜像需要CVE修补程序时,NeuVector会通过触发我们的CI管道自动应用此修补程序,从而重新部署这些易受攻击的镜像。
关于它还有一点:容器安全软件在容器环境中也具有系统智能,进一步提高了安全性。不变性允许详细的行为分析,说明系统在受到攻击之前和之后如何行动,以便环境中的通常流量被列入白名单,并且立即识别并阻止任何异常行为造成伤害。这些安全功能是我们内部系统智能的完美延伸,并为实现我们公司合法维护的数据安全提供了巨大的支持。
有了新的微服务基础设施,我们将需要1-2个月的周期加速到1-2周。我们的小功能周期加速到以前正常sprint的时间。现在,小功能可以在准备就绪后立即推出,这意味着客户不会等待重要更新的部署。以前,分段不能按需完成,但是由于其过于复杂而在夜间部署,而且在每次部署之前我们都有大量准备时间,因为担心会发生什么。这被称为恐惧驱动的业务(fear driven business),最终导致更糟糕的软件:你遭受瘫痪,做出的恐惧决定会伤害你,而不是帮助你。现在,分阶段会根据需求进行,并且不需要准备时间。我们以前的麻烦部署流程已经很简单,开发和部署都更加迅速。
在实施这些解决方案的过程中,我们学到了一些重要的东西。我们发现,进行这些变革的主要挑战是在公司文化中赢得对他们的支持,因为毕竟系统和流程并不像人们那样情绪激动。当其他人看到商业案例有意义并为他们带来好处时,他们会接受并希望使用。实际上,许多开发人员非常讨厌操作,自动化不是替代方案,而是解决方案。根据我们团队的经验,如果你能够成功驾驭所涉及的文化变迁,那么实施高度自动化的基于微服务的架构会带来巨大的收益,因为Docker可以将你的步伐加快几个数量级。