如何为 kubernetes pod 终止实现自定义逻辑?
How to implement custom logic for kubernetes pod termination?
我有一个有状态的 pod(处理来自 IVR 的 phone 呼叫),因此,执行更新或让 HPA 执行 pod 终止可能会导致 phone 呼叫中断。我可以将 terminationGracePeriodSeconds 延长到 10 分钟之类的大值,但如果没有 phone 呼叫通过此 pod,我不想将其延长那么远。
是否有某种方法可以通过 rest 端点查询 pod 以验证有多少 phone 调用处于活动状态?我想快速终止 pod,但如果它仍有正在进行的对话,也想扩展它。
一些可能相关的细节:
- K8s:v1.20
- 语言:NodeJS v16
您可以使用 preStop
处理程序,请参阅
https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/
假设您的 /calls 端点 returns 当前通话次数,您可以这样做,每 5 秒查询一次此端点,直到通话次数为零
containers:
- name: your container
# . . .
lifecycle:
preStop:
exec:
command: ["/bin/bash","-c","while [ \"$(curl localhost/calls)\" != '0' ]; do echo 'there are active calls'; sleep 5; done; echo 'no active calls, exiting'; exit 0" ]
这需要 curl
出现在你的图像中,你可能还想将 stderr 重定向到 /dev/null and/or 添加其他故障保护,但应该足以证明概念
我有一个有状态的 pod(处理来自 IVR 的 phone 呼叫),因此,执行更新或让 HPA 执行 pod 终止可能会导致 phone 呼叫中断。我可以将 terminationGracePeriodSeconds 延长到 10 分钟之类的大值,但如果没有 phone 呼叫通过此 pod,我不想将其延长那么远。
是否有某种方法可以通过 rest 端点查询 pod 以验证有多少 phone 调用处于活动状态?我想快速终止 pod,但如果它仍有正在进行的对话,也想扩展它。
一些可能相关的细节:
- K8s:v1.20
- 语言:NodeJS v16
您可以使用 preStop
处理程序,请参阅
https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/
假设您的 /calls 端点 returns 当前通话次数,您可以这样做,每 5 秒查询一次此端点,直到通话次数为零
containers:
- name: your container
# . . .
lifecycle:
preStop:
exec:
command: ["/bin/bash","-c","while [ \"$(curl localhost/calls)\" != '0' ]; do echo 'there are active calls'; sleep 5; done; echo 'no active calls, exiting'; exit 0" ]
这需要 curl
出现在你的图像中,你可能还想将 stderr 重定向到 /dev/null and/or 添加其他故障保护,但应该足以证明概念