为什么我不能通过其 IP 访问我的 Kubernetes 服务?

Why can't I access my Kubernetes service via its IP?

我在 GKE 上有一个 Kubernetes 服务如下:

$ kubectl describe service staging
Name:           staging
Namespace:      default
Labels:         <none>
Selector:       app=jupiter
Type:           NodePort
IP:             10.11.246.27
Port:           <unnamed>   80/TCP
NodePort:       <unnamed>   31683/TCP
Endpoints:      10.8.0.33:1337
Session Affinity:   None
No events.

我可以直接通过其中一个端点 (10.8.0.21:1337) 或通过节点端口(10.240.251.174:31683 在我的例子中)从 VM 访问服务。但是,如果我尝试访问 10.11.246.27:80,我什么也得不到。我还尝试了端口 1337 和 31683。

为什么我无法通过其IP访问该服务?我需要防火墙规则还是什么?

服务 IP 是由 kube-proxy 管理的虚拟 IP。因此,为了使该 IP 有意义,客户端还必须是 kube-proxy "overlay" 网络的一部分(有 kube-proxy 运行,指向同一个 apiserver)。

GCE/GKE 上的 Pod IP 由 GCE Routes 管理,它更像是网络中所有 VM 的 "underlay"。

有几种方法可以从集群外部访问非public 服务。 它们更详细,但简而言之:

  1. 为集群的服务创建堡垒 GCE 路由。
  2. 在您想要访问集群服务的任何位置安装集群的 kube-proxy。