我正在尝试使用.NET Core 2.0应用程序验证Kubernetes上的关闭操作是否正常完成。
我有一个可以在两种“模式”下运行的应用程序-一种使用ASP.NET Core,另一种作为一种工作进程。两者都使用Console和JSON(通过Filebeat-sidecar-container记录器输出结束在Elasticsearch中的输出),指示启动和关闭进度。
此外,我有控制台输出,当收到SIGTERM或Ctrl-C并开始关闭时,该输出直接写到stdout。
在本地,该应用程序可以完美运行-我得到直接的控制台输出,然后记录器输出流到Ctrl + C(在Windows上)的stdout。
我的实验场景:
helm
,尽管我认为这没什么用)kubectl logs -f
从特定容器中流式传输日志helm delete
删除资源FROM microsoft/dotnet:2.1-aspnetcore-runtime
,具有ENTRYPOINT ["dotnet", "MyAppHere.dll"]
,因此请不要将其包装在bash
进程中或其他任何内容中terminationGracePeriodSeconds
,因此猜测它默认为30秒结果:
我的结论:
我想知道:
答案 0 :(得分:1)
我已经开始出于个人目的对此进行研究,并且在问题发布后的一年中遇到了您的问题……这有点晚了,但是您是否尝试过GraceTerm? 为此有一个关联的NuGET package。
从描述中...
Graceterm中间件提供了实现,以确保正常关闭AspNet Core应用程序。基本概念是:应用程序收到SIGTERM(要求其终止的信号)后,Graceterm会将其保持活动状态,直到所有待处理的请求完成或发生超时。
我还没有亲自尝试过,但是看起来确实很有希望。
答案 1 :(得分:1)
尝试将STOPSIGNAL SIGINT
添加到您的Dockerfile
答案 2 :(得分:0)
SIGTERM
实际上确实表示终止。不太明显的部分是,当SIGTERM
处理程序返回时,一切都视为完成。
解决方法是在应用程序关闭之前,不要从SIGTERM
处理程序中返回。例如,在处理程序中使用ManualResetEvent
和Wait()
对其进行编辑。