39.5. 调试服务
如果您无法从集群内部与服务通信(因为您的服务无法直接通信,或者因为您使用路由器,一切工作,直到进入集群)后,您需要执行与服务关联的端点并调试它们。
首先,让我们获得这些服务:
# oc get services --all-namespaces NAMESPACE NAME LABELS SELECTOR IP(S) PORT(S) default docker-registry docker-registry=default docker-registry=default 172.30.243.225 5000/TCP default kubernetes component=apiserver,provider=kubernetes <none> 172.30.0.1 443/TCP default router router=router router=router 172.30.213.8 80/TCP
您应该会在列表中看到您的服务。如果没有,您需要 定义服务。
服务输出中列出的 IP 地址是 Kubernetes 服务 IP 地址,Kubernetes 将映射到支持该服务的其中一个 pod。因此,您应该能够与这个 IP 地址进行通信。但遗憾的是,即使您可以想象的是所有 pod 都可被访问,也意味着可以访问所有 pod;如果无法访问,则并不意味着所有 pod 都无法访问。它只是告诉您 kubeproxy hooked 的一个状态。
让我们一起测试服务。从其中一个节点:
curl -kv http://172.30.243.225:5000/bar # Replace the argument with your service IP address and port
然后,让我们来看看哪些 pod 正在支持我们的服务(将 docker-registry
替换为已损坏的服务的名称替换 docker-registry):
# oc get endpoints --selector=docker-registry NAME ENDPOINTS docker-registry 10.128.2.2:5000
我们可以看到,只有一个端点。因此,如果您的服务测试成功,并且路由器测试成功,那么实际上会发生奇怪。但是,如果有多个端点,或者服务测试失败,请尝试 每个端点的 以下内容:确定端点无法正常工作后,继续执行下一节。
首先,测试每个端点(更改 URL 以获取正确的端点 IP、端口和路径):
curl -kv http://10.128.2.2:5000/bar
如果这不起作用,请尝试下一个操作。如果失败,请记下这部分,我们将在下一节中找出原因。
如果所有这些都失败,则可能本地节点无法正常工作,跳到 第 39.7 节 “调试本地网络” 部分。
如果它们都正常工作,则跳至 第 39.11 节 “调试 Kubernetes” 部分来找出为什么服务 IP 地址无法正常工作。