当您对Kubernetes Service的问题进行故障排除并且意识到无法使用ping对其进行测试时,这很烦人。
所以...这是一个技术解释,为什么ping无法与Kubernetes Services一起使用。
快速了解背景
Kubernetes服务是一个稳定的网络结点,位于一组应用程序Pod的前面。您可以通过服务访问它们,而不是直接访问Pod。该服务公开了一个DNS名称,虚拟IP和网络端口,可用于连接到其后面的Pod。
有效的组合包括:
- name:port
- IP:port
在上面的示例中,您可以通过以下任一套接字访问应用程序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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。