在K8S集群中应尽量使用服务名访问正在运行的微服务,但有时会访问失败。由于服务涉及服务名的DNS域名解析,kube-proxy组件的负载分发,后端Pod列表的状态等。所以可以通过以下几个方面排查问题:

  1. 查看SVC的后端endpoint是否正常

可以通过kubectl get  endpoints svc-name 命令查看某个服务的后端endpoint列表,如果列表为空,则可能因为:

  • SVC 的label selector与pod的label不匹配

  • 后端pod一直没有达到ready状态(通过kubectl get pod进一步查看pod的状态)

  • svc 的targetPort端口号与pod的containerPort不一致。

  1. 查看SVC的名称能否被正确解析为clusterIP地址

可以通过在客户端容器中ping svc-name.namespace.svc进行检查,如果能够得到svc的clusterIP地址,则说明DNS服务能够正确解析svc的名称;如果不能得到svc的clusterIP地址,则可能是因为K8S集群的DNS服务工作异常。

  1. 查看kube-proxy的转发规则是否正确

kube-proxy的负载分发模式有两种:ipvs 或 iptables(推荐使用ipvs模式

  • 对于ipvs负载分发模式,可以通过ipvsadm工具查看Node上的ipvs规则,查看是否正确设置svc clusterIP的相关规则。

  • 对于iptables负载分发模式,可以通过查看Node上的iptables规则,查看是否正确设置svc clusterIP的相关规则。