[英]Receive alert messages from kubernetes in a pod when another pod dies
设想:
我们有一个 K8s (AKS) 集群,其部署包括 3 个运行 .NET 容器的副本。 副本使用 Redis 锁访问共享资源。 如果一个副本在持有锁时死亡,则锁不会被释放,因此其他副本需要等到锁过期才能继续。 为了减少这种延迟,我们可以减少锁过期超时,但如果锁过早过期,而持有者仍在使用共享资源,我们就会出现竞争条件。 其他解决方案是可能的(如更新锁租约等)似乎不够稳健。
当 pod 死亡时,有没有办法从 k8s 引擎接收事件?
其余的活动副本然后将解除锁定并 go 继续他们的工作。 没有过期问题(锁将被创建为持久的,没有过期)
最简单的解决方案可能是添加一个lifecycle.preStop
步骤,在该步骤中释放锁定文件或向其他容器发出信号。 像这样:
[...]
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","echo free > /tmp/lockfile"]
或command: ["/bin/sh","-c","curl -X POST -F 'status=free' http://<service-name>:8080/lock"]'
来自文档:
Kube.netes 在容器终止之前立即发送 preStop 事件
编辑
关于崩溃的 pod,没有相应的工具,尤其是不接收 .NET 细节。
您可以观察容器崩溃,它们作为事件发布,运行kubectl get events
。 所以有一个不同的方法:
您可以使用Kube.netes C# 客户端来监视这些事件。 最干净的解决方案是让第二个应用程序在同一个名称空间中运行,该名称空间解析事件并向其他应用程序发出一个已死亡的信号。
想到的另一个解决方案是在 pod 中有一个 sidecar 容器,它会定期检查主应用程序的运行状况。 如果它死了,它可以向其他吊舱发送信号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.