设想情况:
我们有一个K8s (AKS)集群,其中包括运行一个.NET容器的3个副本。副本使用Redis锁访问共享资源。如果一个副本在保存锁时死亡,则锁不会释放,因此其他副本需要等到锁过期后才能继续操作。为了减少这个延迟,我们可以减少锁过期超时,但是如果锁太早过期,而持有者仍然在使用共享资源时,我们就会得到一个竞争条件。其他解决方案也是可能的(如续订锁租约等)。看上去已经足够强壮了。
有办法在吊舱死亡时从k8s引擎接收事件吗?
剩下的活副本将移除锁并继续其工作。没有过期问题(锁将永久创建,不需要扩展)
发布于 2022-04-06 10:24:53
最简单的解决方案可能是添加一个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"]'
来自文档
Kubernetes在容器终止之前立即发送preStop事件
编辑
关于崩溃吊舱,没有这样的工具,特别是没有收到.NET的细节。
您可以观察容器崩溃,它们被发布为事件,运行kubectl get events
。所以有一种不同的方法:
您可以使用Kubernetes C#客户端来监视这些事件。最干净的解决方案是让第二个应用程序运行在同一个名称空间中,该名称空间解析事件并向其他应用程序发出死亡信号。
想到的另一个解决方案是在吊舱中有一个侧面容器,定期检查主应用程序的健康状况。如果它死了,它会向其他舱发出信号。
https://stackoverflow.com/questions/71762604
复制相似问题