k8s下的eureak服务注册失败(cannot execute request on any known server)解决

 问题场景

  项目使用了Spring Cloud 微服务框架并利用kubernetes(简称k8s)进行容器编排的。有一天查看Eureka Server监控页面,发现有个serviceid对应的服务副本数只有2个,正常应该是3个的,可是只注册了2个。

 

 

  在Master上使用kubectl logs命令对这个模块的pod进行日志查看,发现有2个pod运行正常,但是另外一个pod的日志一直在报:cannot execute request on any known server。之前还是好好的,怎么突然就不行了,其他2个pod运行正常,也能注册上,说明该模块的镜像和eureka server是没有问题的。而服务的注册是要发送网络请求进行通信的,因此很有可能是该pod的网络出现了问题(业务模块运行在docker容器内),导致有一个注册不上。为此,有以下2个办法可以解决注册不上的问题:

1、使用 kubectl 重新创建该服务对应的Deployment

#删除 deployment
kubectl delete -f xxx-dep.yaml
# 创建deployment kubectl create
-f xxx-dep.yaml

2、找到运行异常pod的服务器并使用docker命令停止容器

#查找特定容器信息
docker ps|grep xxxx
# 停止该容器 docker stop 容器ID
#再次查看特定容器信息
docker ps|grep xxxx

  虽然已经调用过停止命令,但是再次使用docker ps命令查看该容器时,你会发现相同名字的容器依然在。这是因为k8s会自动重新

创建pod中的这个业务容器(pod是k8s调度的最小单元,一个pod通常由一个或多个业务容器+pause容器组成),这个就是k8s作为容器编排工具的强大之处。

  此时刷新Eureka Server的监控页面,发现又成功注册上来了一个服务,达到了3个,注册失败问题解决。

从对用户的影响大小角度来看,推荐使用第二种方式,服务器开销最小,又不会影响原先2个服务。如果重新创建deployment的话,将导致有一段时间该模块无法提供服务。

posted on 2019-12-24 22:13  Javanumberone  阅读(1119)  评论(0编辑  收藏  举报

导航