pod的端口拒绝连接:Liveness probe failed:dial tcp ,connect:connection refused
昨天在生产环境上发版,发现pod一直起不来,一直到崩溃循环结束:
倒数第三行第四行。
这个本质上是健康检查不通过导致的,意思其实是,pod启动起来,运行给定的镜像,但是在设定的超时时间过后,K8S去检查pod是否健康的时候,发现18015这个端口不通,拒绝连接。K8S判定pod存在问题。
这里为啥是拒绝连接,而不是pod直接死亡呢,是谁拒绝的呢。后面我咨询了下开发,开发表示,这里的健康检查是检查了pod里面的一个关键线程是否成功启动并占用该端口。虽然这个线程没有成功启动,但是主进程并没有结束,那么pod自然不会死亡,如果这个时候将deployment中定义的健康检查给去掉,会发现该pod会一直运行,只不过业务不正常罢了。
解决问题的正确操作是检查代码,打印详细日志进行分析,或者直接回滚版本。
但是我这里发现回滚版本也不行,也不能通过健康检查,后面才发现是业务所依赖的某个外部kafka系统失联,导致kafka初始化失败,进而导致关键线程失败。所以问题根因在于外部kafka以及代码逻辑。