kuberbetes的网络设计该要总结,它是K8S服务的基础:

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

所有pod都可以通过IP与其他pod通信。

每个节点都可以看到所有pod,反之亦然。

pod可以看到所有服务。

如下图
在这里插入图片描述
位于pod 1中的容器B可以直接将容器A寻址为localhost。

容器B可以通过其IP直接寻址pod 2(kubectl get pod-o wide)。我们知道这不是一个可靠的通信通道,因为pod 2 可能出现故障,一个新的pod可能出现在它的位置。我们不能追逐移动的目标。

下一步,容器B可以通过“service x”对POD2和POD3进行寻址,将它们的IP和负载平衡捆绑在一起;因此,在支持基于K8s的微服务应用程序方面发挥了关键作用。

下面说说具体的debug步骤:
1.检查service是否存在

kubectl get svc

2.测试 service
请记住,在集群外部无法访问内部K8s ClusterIP服务。有两种方法可以测试它。首先,可以启动一个test pod,SSH到其中,然后尝试访问服务,如下所示:

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

在这里,我们使用alpine 启动一个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.访问服务

3:检查服务是否真正针对相关的pod
记住,K8s服务基于标签选择器将入站流量路由到其中一个pod。流量通过IP路由到目标pod。
所以,检查服务是否绑定到这些pod。

kubectl describe service <service-name> | grep Endpoints

4.检查pod标签

确保K8s服务中的选择器与pods的标签匹配!

kubectl get pods --show-labels
kubectl describe svc <service_name>

在这里插入图片描述
5.确认服务端口与Pod匹配
最后,确保pods中的代码真正监听您为服务指定的targetPort(例如,如上图所示的端口8001)

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐