天天看点

使用 Kubernetes 管理容器化的有状态应用

使用 Kubernetes 管理容器化的有状态应用

目前,几乎所有关于容器和微服务的谈论都跟“无状态”的应用挂钩。这完全可以理解,因为无状态应用程序更简单。而且容器和编排技术已经成熟到能够承工作负载的程度:即有状态的应用。

kubernetes 是一个用于自动部署、扩展和管理容器化应用程序的开源系统,我之前做过两次关于 kubernetes、数据库以及容器的演讲。

无状态服务,即 web 服务器、代理和应用程序代码这样的应用程序,它们可以处理数据但不进行存储。编排过程中,开发者比较喜欢使用它们,因为它们易于部署且易于扩展。如果流量上升,则只需添加更多的负载平衡。更重要的是,它们是“不变动的”;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别。这意味着它们可以随时被替代,而且容器实例切换过程中几乎不需要耗费“切换成本”。

有状态的服务,即路由器、cdn(内容传送网络)、streaming 服务器和认证服务器。从部署开始,这些容器就开始与上游镜像不同了,时间越长它们的差异越大。这种差异就被称为“state(状态)”。事实上,每个运行的应用程序都至少有一个小状态(差异),但对于“无状态”应用程序来说,状态(差异)很小,而且可以进行快速替换。

对于有状态的,那就不是这样的情况了。虽然状态可以通过状态节点进行同步或复制,但是这必须通过应用程序专用的一些方法在业务流程系统之外完成。总之很麻烦。

当然,鉴于我在 postgresql 工作18年的历史,我真正关心的有状态应用程序是交易型数据库。数据库对于大多数应用程序堆栈而言至关重要,而且对于状态支持来说也是一个很好的测试用例,因为它们可以用有效方式进行状态化,包括: 

storage identity session cluster role 

例如,postgresql 需要将数据和交易存储在每个 postgresql 容器(存储)持久和特有的文件中。每个容器需要被识别为特定的数据库节点,我们需要能够通过名称或地址将流量路由到它。数据库客户端连接或会话也有一个状态,打破它们需要付出一定的代价,所以我们不想随意移动数据库节点。最后,每个数据库节点在其数据库集群中都有一个角色,集群角色例如 master、replica、shard 等。这些集群角色将持续存在,直到数据库特定 event 更改它们为止。

在流行的容器云堆栈上实现这些类型的状态一直是具有挑战性的。 docker 和编排框架将大多数类型的状态视为发生在容器堆栈之外的状态,迫使数据库架构师管理存储、身份、路由以及很多其他的东西。你没有办法将数据库移动到帮助您的容器。因此,尽管很多网页应用程序已经容器化,但几乎没有数据库或其他有状态的应用程序能够容器化。那么,我们在哪里存储数据?一般来说,可以使用 amazon rds。

kubernetes 项目一直致力于一个对象和一组功能,去年称为 statefulset 来处理数据库和其他状态服务。开发人员最初以“petset”的工作名称发布了此功能,但是他们进行了更改,然后发布到1.5版本中,并且有了一个更合适的名字:statefulset。此时,statefulset 实现 storage 和 identity 有状态质量。其他两个可以使用最小粘合代码使用 kubernetes 作为资源实现。换句话说,你不必等待部署协调的容器化数据库。

现在,你可以在 kubernetes 上的容器中运行数据库,但是为什么要这样做呢?答案与容器无关,但是都与编排的好处有关。

我们期望再现代数据库平台中高可用性(ha),希望它能够脱颖而出,但这光靠数据库软件是提供不了的。引入群集,替换故障机器上的数据库节点,重新路由应用程序流量到迁移的节点,以及其他 ha 注意事项需要大量的代码和许多数据库外部以及其内部的实用程序。

这样的代码很难写,因为它需要先实现分布式系统。

像其他业务流程系统一样,kubernetes 提供了一个简单易用的分布式系统。数据库(如 postgresql和mysql)如果没有内置的 ha,很容易变成这样,已经是 ha 的数据库(如 cassandra 和 rethinkdb),那就可以实现全自动。从经验来说,这是比自己从头开始做更容易。

我创建了一些例子,展示如何在我的 atomicdb 演示 repo 上使用 statefulset 来部署 postgresql。以上这些是为了说明如何使用功能,并非完整的生产部署。 zalando 是 patroni 集群管理项目的领导者发布了 helm chart,它基于 kubernetes 的群集 postgresql。

作者简介:

josh berkus 供职于 redhat 的 project atomic,这个项目需要跟kubernetes,atomichost,docker,fedora 以及其它项目近距离接触。 他之前在 postgresql 核心团队拥有十几年工作经验,为流行的开源数据库做出贡献。 

本文转自d1net(转载)