19

调试Kubernetes Service 5个简单的步骤

 4 years ago
source link: http://dockone.io/article/10056
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

——了解Kubernetes的网络和调试服务

qARjqiB.jpg!web

在上一篇文章中,我们调试了Kubernetes pods。现在,该检查Kubernetes服务(service)了,这些服务是工作负载的抽象接口(主机+端口),工作负载可能由几个pod组成。

在深入研究调试之前,先简要介绍一下作为K8s service基础的网络。

• pod中的容器共享同一个网络空间和相同的IP。

• 所有的pod都可以通过IP与其他pod进行通信。

• 每个节点(node)都可以看到所有的pod,反过来也是一样的。

• pod可以看到所有的service。

在实践中这意味着什么?

M32MZnI.png!web

K8s网络

图中:

• 容器B位于pod 1中,以localhost直连容器A。

• 容器B可以通过它的IP直接访问pod 2 (kubectl get pod –o wide)。我们知道这不是一个可靠的通信方式,因为pod 2可能会发生故障,继而会生成一个新的pod。因此无法追踪定位一个会变化的目标。

• 其次,容器B可以通过“service x”连接到pod 2和pod 3,它捆绑了它们的IP以及负载均衡;因此,在K8s里,service在支持基于微服务的应用程序方面起着至关重要的作用。

尽管对K8s的网络内部机制的研究超出了本文的范围,但我还是打算发表一些相关的参考资料以供进一步研究。

那么现在,我鼓励大家花一点时间来试验和理解Kubernetes中的网络关系。

例如,你可以启动一个K8s测试Pod,并从这个Pod尝试连接其他Pod、Node、Service!这里看到的命令是在一个pod中打开一个Linux shell。

kubectl run -it networktest --image=alpine bin/ash --restart=Never --rm

我们现在处于K8s的网络空间内,而且可以使用wget、ping、nslookup等命令进行实验!在K8s集群中测试一些之前列出来的网络需求。例如,nslookup <servicename>, ping <PodIP>。

现在回到我们的主题,故障排除K8s service,它本质上其实就是一个网络结构。

步骤1:检查服务(service)是否存在

Kubectl get svc

如果服务不存在,可能是服务创建失败,请检查service定义。

步骤2:测试服务(service)

请记住,在K8s内部,ClusterIP类型的service是不能在集群之外访问的。有两种方法可以测试它。首先,你可以启动一个测试pod, SSH到它,并尝试访问你的service,就像这样:

kubectl run -it testpod --image=alpine bin/ash --restart=Never –rm

在这里,我们开始一个alpine Docker镜像作为一个pod,从service内部进行测试。

#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

现在可以将service定位为localhost:8000。

步骤3:检查服务(service)是否对映相关Pod

请记住,K8sservice根据标签选择器将入站流量路由到其中一个pod。流量通过IP路由到目标Pod。

因此,检查service是否绑定到这些Pod上。

kubectl describe service <service-name> | grep Endpoints

你应该看到与列出的工作负载相关的所有pod的IP。如果没有,转到步骤4。

步骤4:检查Pod标签

请确保K8s service的选择器(selector)与pod的标签匹配!

kubectl get pods --show-labels

kubectl describe svc <service_name>

在下面的截图中,你可以在右边看到pod的标签。四个pod分别被标记为app=tinywebsite和tier=frontend,它们与下面描述的service选择器相匹配。

在这四个匹配的pod中,只有三个在运行,在高亮显示的那一行可以看到,IP作为服务的Endpoints,而且还可以在“IP”列中看到相同的IP。

7VbyyyB.png!web

步骤5:确认service端口与你的Pod匹配

最后,确保pod中的代码实际上监听了你为service指定的targetPort(例如,如上面的屏幕截图所示,端口8001)!

这很容易,要进一步研究和深入K8s网络的世界,请参阅下面的文章。但是,假如你的K8s集群由一个云服务托管,该供应商应该负责去处理任何底层集群级别的问题。

感谢你的阅读!

参考

在Kubernetes部署一个应用( https://medium.com/better-prog ... 2e533

调试service( https://kubernetes.io/docs/tas ... exist

Kubernetes网络( https://kubernetes.io/docs/con ... king/

原文链接: https://medium.com/better-prog ... f024c


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK