kubernetes:五步法定位 service问题
kuberbetes的网络设计该要总结,它是K8S服务的基础:pod中的容器共享相同的网络空间和相同的IP。所有pod都可以通过IP与其他pod通信。每个节点都可以看到所有pod,反之亦然。pod可以看到所有服务。如下图位于pod 1中的容器B可以直接将容器A寻址为localhost。容器B可以通过其IP直接寻址pod 2(kubectl get pod-o wide)。我...
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)
更多推荐
所有评论(0)