在Kubernetes中,服务是一个核心概念。在本文中,将介绍如何调试K8S服务,这些服务是由多个Pod组成的工做负载的抽象接口(主机+端口)。web
在咱们深刻探索debug方法以前,咱们先简单回顾一下网络,这是Kubernetes服务的基础。shell
那么,在实践中这些意味着什么呢?网络
在图中:架构
kubectl get pod -o wide
)。咱们知道当pod2出现故障时着不是一个可靠的通讯渠道,而且一个新的pod能够出如今其位置中。可是咱们没法追逐不断变化的目标。尽管对Kubernetes的内部网络结构的检查不在本文的讨论范围内,但我稍后会发布一些参考资料以供你们进一步研究。app
对于当下,我仍是鼓励你花费一点时间在实践中经历和理解Kubernetes中的网络。例如,你能够启动一个Kubernetes测试pod而且尝试从该pod中访问其余pod、节点和服务。此处显示的命令将在Pod内弹出一个Linux shell。负载均衡
kubectl run -it networktest --image=alpine bin/ash --restart=Never --rm
如今你在Kubernetes网络空间内而且你能够随意使用wegt
、ping
、nslookup
之类的命令进行实验。例如,测试你的Kubernetes集群中先前列出的网络要求,nslookup <servicename>, ping <PodIP>
。frontend
如今让咱们回到咱们的话题,troubleshooting Kubernetes服务,这其实是一种网络结构。ide
kubectl get svc
若是服务不存在,应该是服务建立出现了故障,所以要去检查你的服务定义。微服务
请记住,一个内部的Kubernetes ClusterIP服务是没法在集群外部访问的。所以,有两种方法能够对其进行测试。方法一,你能够启动一个测试Pod,经过SSH进入该pod,而后尝试像这样访问你的服务:性能
kubectl run -it testpod --image=alpine bin/ash --restart=Never --rm
在本文中咱们启动一个alpine Docker镜像做为pod来从其内部测试服务:
#works for http services wget <servicename>:<httpport> #Confirm there is a DNS entry for the service! nslookup <servicename>
或者,你能够转发到本地计算机并在本地进行测试。
kubectl port-forward <service_name> 8000:8080
如今,你能够经过localhost:8000
访问服务。
Kubernetes服务会根据标签selector将入站流量路由到其中一个pod,流量经过其IP路由到目标Pod。因此,请检查服务是否绑定到那些pod。
kubectl describe service <service-name> | grep Endpoints
执行上述命令以后,你应该看到与列出的工做负载相关的全部Pod的IP。若是没有看到,请执行Step4。
确保在Kubernetes服务中的selector与pod的标签相匹配。
kubectl get pods --show-labels kubectl describe svc <service_name>
从下面的截图的中能够看到,pod的标签在右边。四个pod被标记为app=tinywebsite
和tier=frontend
,这些标签与下面“described”
的服务selector相匹配。
在这四个匹配的Pod中,只有三个正在运行,其IP在突出显示的行中被列为服务的端点(endpoint)。你还能够在IP列中看到相同的IP。
最后,确保在你的pod中的代码可以监听到你为服务指定的targetPort(例如,你在上方截图中看到的port8001)!
这十分简单,为了让你更进一步深刻了解和研究Kubernetes的网络世界,欢迎你阅读如下文章。
做者:
Ram Rai,性能、可扩展性以及软件架构的爱好者