Kubernetes是一个开放编排平台,旨在用于部署,管理容器化的应用程序。
在Kubernetes的早期,该平台主要支持和运行无状态应用程序。无状态应用程序,被认为在重新启动容器时不需要保留从上一个会话到下一个会话的数据的应用程序。
这就造成了误解,认为Kubernetes仅适用于无状态应用程序。但是,随着Kubernetes的普及,它已经发展成为各种类型的应用程序的编排平台之一,包括可伸缩和高度可用的有状态应用程序的部署和管理。
但是,即使为状态应用程序提供了完整的业务流程支持,Kubernetes仍存在各种不足,尤其是与存储相关的不足。Kubernetes有意留给供应商填补。
越来越多用户使用Kubernetes的有状态应用程序,推动了云原生存储解决方案的发展,该解决方案可以提供有状态应用程序所需的可用性和弹性。
Kubernetes存储演进
最初,Kubernetes提供了基本支持,使用GFS和AWS等特定云提供商的共享存储驱动器(例如NFS和ISCSI)将存储卷静态附加到Pod。但是向Kubernetes添加任何新的存储解决方案都需要将代码提交到Kubernetes核心代码库中,从而使存储过程变得复杂。
Diamanti向Kubernetes贡献了FlexVolume插件,从而在Kubernetes中开启了存储卷配置的新时代。它使存储供应商可以创建自定义存储插件,而无需将其添加到Kubernetes存储库中。
反过来,这为Kubernetes用户提供了更好的管理和数据服务的存储解决方案。多年来,Kubernetes社区引入了多种功能丰富的存储,例如:
永久存储卷(PV),为集群中的对象提供存储资源。
PersistentVolumeClaim(PVC),这是使用PV的请求。
Volume Dynamic Provisioning允许按需创建数据存储卷。
StatefulSets轻松扩展和管理有状态应用程序。
FlexVolume插件为容器存储接口(CSI)的存储插件铺平了道路。该插件提供了Kubernetes与第三方存储集成的标准化解决方案,并为Kubernetes内部的数据服务提供支持。
Kubernetes运行有状态应用程序的注意事项
即使有了如上的改进,组织在Kubernetes中使用有状态应用程序时仍然面临与存储相关的挑战。随着组织采用包含重要知识产权的容器化数据库和其他应用程序,他们意识到需要提供一套更高级的存储功能。其中一些包括:
1. 易于使用的持久存储
Kubernetes为持久存储卷和有状态应用程序提供全面支持。但是,组织仍需要使用第三方CSI插件,来提供程序执行存储卷的实际配置。
例如,大多数公共云将Kubernetes与他们现有的存储架构集成在一起,以向用户提供此功能,但是这些架构通常在选择和性能上受到限制。
当谈到私有云时,有很多第三方选项可用,但是很难找到一个提供丰富功能,最佳性能并且具有成本效益的存储解决方案。
最重要的是,市场上许多现有的存储解决方案–都旨在支持虚拟化工作负载,然而,事实证明,在裸机上运行容器具有更高的可伸缩性和性能,并减少了不必要的抽象层。但是,很难找到一种适用于裸机容器的好的存储解决方案。
2. 高可用性选项
有状态应用程序的性质,决定了需要更多地考虑应用程序如何从不同的故障模式中恢复,但并非所有第三方Kubernetes存储解决方案都是高度可用的。
为了解决此问题,许多供应商提供了共享存储,但是这些解决方案通常性能不高和缺乏可管理性。
存储可用性服务( Storage availability services ),通常使用恢复点目标(RPO)和恢复时间目标(RTO)进行衡量。RTO衡量恢复数据所需的时间,RPO衡量恢复过去多久的数据。
下表演示了有状态应用程序必不可少的各种数据服务。
3. 混合云数据的可移植性
在当今的云原生世界中,越来越多的组织采用混合云方法,来结合公共云和私有云的优势。虽然可以轻松地跨多个云迁移无状态应用程序,但是很难将数据从一个云迁移到其他云。
4. 性能
市场上的大多数存储解决方案,都缺乏数据密集型应用程序所需的性能,这使存储设备成为应用程序性能的主要瓶颈。
带有固态驱动器的新存储技术 ,如NVMe (Non-Volatile Memory Express) 的出现意味着存储不再是瓶颈。因此,在选择存储供应商时,除了吞吐量之外,还要考虑最坏情况的延迟。
5. 服务质量(QoS)的保证
Kubernetes为容器本身预留了CPU和内存。但是,Kubernetes不支持存储或网络带宽预留,这仍然是一个问题。
为了保护重要的有状态应用程序免受此缺点的影响,为存储资源提供QoS级别保证很重要。
6. 用于存储和数据的共享网络
大多数传统存储解决方案都依赖于主机网络来存储数据流量。此数据流量与常规网络流量竞争,并带来安全风险。寻找隔离存储和容器流量的解决方案,有时是必要的。
7. 安全性/加密
考虑存储解决方案的安全性和加密方面。大多数企业都需要安全协议,例如自加密磁盘,存储卷级加密和密钥管理等,以保护自己免受数据丢失和安全漏洞的侵害。
结论
Kubernetes已经发展成为协调有状态应用程序的最佳平台。你可以使用Kubernetes中的StatefulSet和持久存储卷,轻松管理和扩展有状态应用程序。
但是,如果没有基础存储架构,仅利用Kubernetes的全部潜力是不够的。在决定第三方存储供应商时,请牢记这些挑战,并寻找适合你的应用程序部署的存储供应商。
译者:王延飞
原文链接:https://thenewstack.io/a-guide-to-running-stateful-applications-in-kubernetes/
END
本文分享自微信公众号 - K8S中文社区(k8schina)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。