微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

kubernetes 上的零停机更新当有上传文件的请求时

如何解决kubernetes 上的零停机更新当有上传文件的请求时

我的目标是在 kubernetes 上实现零停机更新。

但是,存在与文件上传相关的问题。

情况是当用户上传文件时,网络服务器首先存储它。 WAS 将文件的元数据保存到数据库中。

所以问题是当我们更新网络服务器时。网络服务器不会等待请求完成。并且文件上传/下载服务将失败(如果客户端连接到将关闭的网络服务器)。

我该怎么办?

解决方法

简而言之,Kubernetes 中没有任何神奇的工具可以为任何类型的应用程序解决这个问题。

主要目标是什么?

  • 删除一个 Pod(如果你能优雅地删除一个 Pod,那是一大步)

  • 应用同时支持两个版本(用于推出和回滚)

那么如何实现零停机部署和更新?

Kubernetes/Docker:

  • 应用程序作为特殊的 PID 1 运行,因此它可以直接接收 SIGTERM(标准正常关机)信号

  • 您在 terminationGracePeriodSecondsStatefulSet 中指定 Deployment。当您缩小应用程序(或删除一个 Pod 以替换为新 Pod)时,不会路由任何新连接,它会向应用程序发送 SIGTERM 并等待 terminationGracePeriodSeconds 时间。通常排空连接最多需要 5-10 分钟,但完成长连接可能甚至需要几个小时。如果应用按照您的意愿理解 SIGTERM,它可以更早完成。

  • 刚刚工作readinessProbe检查

应用:

  • 理想情况下理解 SIGTERM 并优雅地关闭操作

  • 如果第一次尝试失败(例如从前端到后端的 API 调用、从后端的数据库查询等),应用程序应该能够重试连接或操作 - 这有助于在新 pod 上重试操作,一般来说在高可用系统中重试是一件好事

  • 应用以较小的块完成其工作,并具有提到的重试需求,例如使用 http://resumablejs.com 来避免长文件传输 - 长连接

  • 模式更改策略,应该同时支持两个版本(例如,如果您向数据库添加新列,最好在第一个版本中添加它,然后在第二个版本中使用它等等其他技术)

申请(最后的手段):

  • 有些公司无法承受停机时间,但部署新版本很复杂/无法部署,因此决定在应用升级时将新连接(附加代码)排队。因此文件和数据库记录从旧版本导入到新版本以完成零停机部署。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?