前言
容器化是实现更自动化基础设施的关键,而将应用程序迁移到 Kubernetes 是一个重大步骤。根据 Canonical 的数据,只有大约 15% 的企业完全使用 Kubernetes 来运行应用程序。大约同样比例的人仍在使用纯粹以虚拟机为中心的基础设施,而其余的人要么计划迁移到 Kubernetes,要么混合使用 Kubernetes、虚拟机和裸金属。是什么阻碍了企业实现应用程序现代化呢?企业一贯支持 DevOps 原则,但许多企业仍然发现很难放弃单体应用程序架构。做出重大改变,比如采用微服务、容器和云是很困难的。应用程序迁移到 Kubernetes 应该注意些什么呢?
像对待宠物一样对待传统应用,而不是牛
早在20 世纪 10 年代初,微软工程师 Bill Baker 就曾试图鼓励数据库管理员(DBA)重新思考他们对待服务器的方式,鼓励他们把服务器当作牛而不是宠物对待。这意味着不给服务器起特殊的名字,不在出现问题时给予特殊的照顾,也不在服务器上投入太多的时间和精力。相反,Baker 建议,当一台服务器出现问题时,DBA 应该将其取出,将其快照,并用一台几乎完全相同的服务器替换。这一类比在基础设施领域广受欢迎,如今已被应用于许多不同的场景。在云迁移的背景下,基础设施管理员需要反过来应用这句格言:你的应用程序和虚拟机应该像宠物一样对待,而不是像牛一样对待。每个虚拟机都需要有一个唯一的标识,并且需要仔细、深思熟虑地将它们迁移到基于 Kubernetes 和云的基础设施中。对于那些被要求快速将应用程序迁移到云端以减少资本支出的基础设施管理员来说,这似乎是个坏消息。这意味着他们不能依赖批量迁移服务,比如谷歌的 Anthos migrate —— 这些系统没有为单个 VM 提供太多考虑。因为这些迁移服务采取了类似牛的方式,它们经常会制造各种各样的问题,这些问题再次困扰着未来的基础设施管理者。
不要只是 lift and shift —— 不断改进方法,打造一款更好的应用
在许多方面,这遵循了将遗留应用程序视为宠物而不是牛的一般方法。你可以简单地将遗留应用程序转换为基于云的环境。但在内部有效的东西在云中不一定有效。通过做出必要的调整,让你的应用程序云就绪,你最终将进行重构,以获得更精简的用户体验。例如,应用程序现代化工作应该包括将整体分解为微服务,以实现更大的可伸缩性、可用性和灵活性。应该这样做,以便尽可能多的基础设施工作可以自动化,实现快速发布和持续改进。它应该利用容器而不是虚拟机,确保应用程序灵活且高可用。
如果还没有准备好离开虚拟机,有很多选择
最终,从长远来看,在应用程序现代化过程中采用云原生实践将更加有效。然而,并不是每个组织都能做出这样的承诺。如果你愿意,你可以把虚拟机带到云端,但首先进行严格的成本效益分析很重要。如果有很多与虚拟机使用相关的知识,并且不想为了学习一个新系统而放弃这些知识,那么将虚拟机以其原始的内部格式托管在云中并由同一个虚拟机监控程序进行管理可能是有益的。你将保留云迁移的一些好处,例如更高的可用性和更少的维护需求,你的团队仍将能够使用他们习惯的相同计算环境。缺点是什么?这可能非常昂贵。你不仅需要支付云服务提供商的费用,还需要支付虚拟机平台的费用。最终,这只是权宜之计。最终,如果你想将现代原则应用到应用程序部署过程中,你会希望完全使用云计算技术。如果你在早期制定了全面的应用程序迁移计划,并在时间表和流程上获得所有内部利益相关者的认可,你可以跳过这一步,更快、更具成本效益地过渡到基于微服务和容器的基础设施。
不要指望云提供商取代内部存储
当一切都在内部时,单体应用程序可能不需要任何特殊处理来处理存储;它只是连接到一个数据库并在那里存储状态。一旦你将应用分解成微服务进行迁移,你会发现微服务在基于容器的环境中工作得非常好。但是,尽管服务本身本质上是无状态的,但它们处理的数据却不是。容器是非常短暂的,在 Kubernetes 环境中经常上下旋转,这使得通过传统方法很难保持状态。一种选择是使用云提供商提供的数据库服务。不幸的是,这种方法可能成本高昂,而且无法提供与内部解决方案相同的功能,例如同步复制、灾难恢复、静态和传输加密等。
选择Kubernetes原生存储解决方案
企业不用依赖云提供商来存储,而是可以使用云和 Kubernetes 原生存储解决方案(如 Ondat)以更低的成本做更多的事情。这些工具与 Kubernetes 的容器存储接口(CSI)配合使用,为有状态的容器化应用程序提供存储。因为你可以在终端定义存储需求,而不是接受云提供商提供的任何东西,所以你可以内置这些功能,以确保应用程序的最大可用性。Ondat 的工作原理是将 Kubernetes 集群中节点之间的存储聚合到主机聚合池的集合中,从而使卷能够从集群中的任何位置动态地配置到容器中。更重要的是,Ondat 允许你重建与在内部使用的存储功能相同的存储功能,以及可能尚未实现的其他功能,例如:
—— 同步复制
—— 静止和传输中的加密
—— 灾难恢复
—— 确定性性能
—— 精简资源调配
—— 与 Kubernetes 的原生集成