1

当您对Kubernetes Service的问题进行故障排除并且意识到无法使用ping对其进行测试时,这很烦人。

所以...这是一个技术解释,为什么ping无法与Kubernetes Services一起使用。

快速了解背景

Kubernetes服务是一个稳定的网络结点,位于一组应用程序Pod的前面。您可以通过服务访问它们,而不是直接访问Pod。该服务公开了一个DNS名称,虚拟IP和网络端口,可用于连接到其后面的Pod。

有效的组合包括:

  • name:port
  • IP:port

b-01.jpg

在上面的示例中,您可以通过以下任一套接字访问应用程序Pod:

  • web-svc:8080
  • 10.20.30.40:8080

之所以不使用ping是因为端口要求!

无效的简短原因

简短的原因是,仅当连接到达正确的端口时,Kubernetes服务才会激活。不幸的是ping不使用端口.

如果您对更多细节感兴趣,请继续阅读...

Service的细节

当应用程序通过服务连接到另一个应用程序时,将发生以下事件:

  • 该应用程序使用群集DNS将服务名称解析为ClusterIP(虚拟IP)和端口
  • 应用程序发送特定端口上的ClusterIP的流量
  • ClusterIP位于没有路由的特殊网络上,因此请求将转到默认网关
  • 请求发送到集群节点的默认网关时,由节点内核处理
  • 将所有群集节点配置为捕获在服务正在使用的端口上进入ClusterIP地址的请求
  • trap导致数据包头被重写,以便将请求重定向到特定的Pod
  • Pod接收流量并服务请求

问题在于,仅当请求前往服务定义中指定的端口上的ClusterIP时,才会发生trap。无法将ping流量发送到特定端口,因此永远不会发生trap。

ping的细节

ping实用程序基于称为ICMP(互联网控制消息协议)的协议。

好吧,我有点知道。

我知道ping使用ICMP,但我不知道ICMP是IP协议套件中其自己的成熟协议。所以我知道这个流行词,但是我不知道现实意义是什么。

我想虽然ICMP就像HTTPS和DNS,它们本质上是通过众所周知的TCP/UDP端口运行的服务(HTTPS通常在端口443上运行,而DNS在53上运行)。但是,并非如此,ICMP是与TCP和UDP完全不同的协议(但它仍在IP网络上运行)。

无论如何,不​​要迷失在细节上。关键是... ICMP不能在TCP/UDP上运行,因此没有TCP/UDP端口的概念。因此,无法在配置为侦听和trap的服务的端口上使用ping。

不过,请不要强调,其他工具也可以帮助您。

其他可以帮助您的工具

令人遗憾的是,我们无法使用ping来测试Kubernetes服务,但我们绝对可以使用其他工具来测试连接性。个人最喜欢的是curl。


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。