如何解决用于有状态应用程序的 Kubernetes 工作负载,但不需要永久磁盘
我有一个有状态的应用程序 - 我将数据保存在用户的会话中(基本上是 HttpSession
对象中的数据) - 但我没有任何要求将任何内容写入永久磁盘。
从我目前所读到的 - StatefulSet 工作负载适用于有状态应用程序,但到目前为止我的理解是,即使我的应用程序是有状态应用程序,但部署工作负载也可以满足我的要求,因为我不想写任何东西到永久性磁盘。
但是,我不确定的一点是,假设我使用部署工作负载并且我的 HttpSession
对象中存在大量用户数据,现在由于某种原因 Kubernetes 重新启动了我的 Pod,然后当然所有这些用户会话数据将丢失。所以,我的问题如下:
- StatefulSet 是否比部署工作负载更好地处理这种情况?
- 那么,部署工作负载和 StatefulSet 工作负载之间的唯一区别是永久磁盘的缺失/存在,或者在 StatefulSet 的情况下也与应用程序会话管理有关?
解决方法
StatefulSet 是否比部署工作负载更好地处理这种情况?
没有。 Deployment
和 StatefulSet
都不会保留内存内容。要保留会话信息,您需要将其存储在某处。一种常见的方法是使用 Redis。
那么,部署工作负载和 StatefulSet 工作负载之间的唯一区别是永久磁盘的缺失/存在,或者在 StatefulSet 的情况下也与应用程序会话管理有关?
不,还有其他区别:
- StatefulSet 创建(并重新创建)确定性、一致的 pod 名称(标识符)。
- StatefulSets 以确定性、一致的顺序一个一个部署、扩展和更新。只有在前一个 Pod 达到
Running
状态后才会创建下一个 Pod。
此外,值得一提的是,永久性磁盘可以附加到不属于 StatefulSet
的 Pod。只是让磁盘始终连接到具有一致 id 的 pod 很方便。例如,如果您有运行复制数据库的 pod,您可以使用 StatefulSets 来确保主副本的磁盘始终附加到 pod #1。
编辑:
Link to official documentation about StatefulSets
来自文档:
与 Deployment 一样,StatefulSet 管理基于 相同的容器规格。与 Deployment 不同,StatefulSet 维护 每个 Pod 的粘性标识。这些 Pod 是从 相同的规格,但不可互换:每个都有一个持久的 它在任何重新调度期间维护的标识符。
...
StatefulSets 对于需要一个或多个 以下。
- 稳定、唯一的网络标识符。
- 稳定、持久的存储。
- 有序、优雅的部署和扩展。
- 按顺序自动滚动更新。
在上面,稳定是跨 Pod 持久化的同义词 (重新)调度。如果应用程序不需要任何稳定 标识符或有序部署、删除或扩展,您应该 使用工作负载对象部署您的应用程序,该对象提供一组 无状态副本。 Deployment 或 ReplicaSet 可能更适合 您的无状态需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。