为什么我不能通过其 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 服务。 它们更详细,但简而言之:
- 为集群的服务创建堡垒 GCE 路由。
- 在您想要访问集群服务的任何位置安装集群的 kube-proxy。
我在 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 服务。
- 为集群的服务创建堡垒 GCE 路由。
- 在您想要访问集群服务的任何位置安装集群的 kube-proxy。