Kubernetes HTTP 流量进入正在更新的 pod
Kubernetes HTTP Traffic goes to pod being updated
我有一个具有以下结构的管道:
Step 1: kubernetes-deployment
Step 2: kubectl rollout restart deploy -n NAMESPACE
Step 3: http-calls to deployment A and B
在同一个命名空间中,有一个数据库 pod,Pod A 和 B 连接到这个数据库。
问题
现在的问题是由滚动更新引起的 - 当应用滚动更新时,kubernetes 在部署更新时启动新的 pods。不过,直到相应的新 pod 启动后,旧 pod 才会终止。
由于kubectl rollout restart deploy
是一个非阻塞调用,它不会等待更新完成。而且 afaik,kubectl 没有内置的方式来强制这种行为。
当我在调用它之后执行一些 HTTP 请求时,我现在遇到的问题是 有时,当更新不够快时,接收到 HTTP 调用并且由来自部署 A 和 B 的旧 pods 回答。不久之后,旧的 pods 将被终止,因为新的 运行.
这导致了这些 HTTP 请求的效果不再可见的问题,因为它们是由旧的 pods 接收的,将相应的数据保存在位于“旧”数据库 pod 中的数据库中.随着数据库pod重启,数据会丢失。
请注意,在这种情况下我没有使用 persistent Volume
,因为它来自夜间构建场景,我想每天重新启动这些部署,并且数据库状态应该始终只包含来自当天的构建。
你有什么办法解决这个问题吗?
包括一个简单的 wait
步骤可能会奏效,但我很好奇是否有更好的解决方案。
提前致谢!
kubectl rollout status deployment <deploymentname>
与 startupProbe
和 livenessProbe
一起解决了我的问题。
我有一个具有以下结构的管道:
Step 1: kubernetes-deployment
Step 2: kubectl rollout restart deploy -n NAMESPACE
Step 3: http-calls to deployment A and B
在同一个命名空间中,有一个数据库 pod,Pod A 和 B 连接到这个数据库。
问题
现在的问题是由滚动更新引起的 - 当应用滚动更新时,kubernetes 在部署更新时启动新的 pods。不过,直到相应的新 pod 启动后,旧 pod 才会终止。
由于kubectl rollout restart deploy
是一个非阻塞调用,它不会等待更新完成。而且 afaik,kubectl 没有内置的方式来强制这种行为。
当我在调用它之后执行一些 HTTP 请求时,我现在遇到的问题是 有时,当更新不够快时,接收到 HTTP 调用并且由来自部署 A 和 B 的旧 pods 回答。不久之后,旧的 pods 将被终止,因为新的 运行.
这导致了这些 HTTP 请求的效果不再可见的问题,因为它们是由旧的 pods 接收的,将相应的数据保存在位于“旧”数据库 pod 中的数据库中.随着数据库pod重启,数据会丢失。
请注意,在这种情况下我没有使用 persistent Volume
,因为它来自夜间构建场景,我想每天重新启动这些部署,并且数据库状态应该始终只包含来自当天的构建。
你有什么办法解决这个问题吗?
包括一个简单的 wait
步骤可能会奏效,但我很好奇是否有更好的解决方案。
提前致谢!
kubectl rollout status deployment <deploymentname>
与 startupProbe
和 livenessProbe
一起解决了我的问题。