我有一个Nginx服务部署在GKE与NodePort暴露,我想从我的计算引擎实例通过内部IP地址连接它。当我尝试用集群IP连接到Nginx时,我只收到Timeout.
我认为clusterIP只能在集群内访问,但当我激活NodePort时可能会工作。
我不太清楚NodePort和ClusterIP的区别。
Background
你可以使用NodePort或LoadBalancer在集群外公开你的应用程序。ClusterIP
只允许在集群内部连接,并且它是默认的服务类型。
- ClusterIP:
在集群内部IP上公开服务。选择此值将使服务只能从集群内访问。这是默认的ServiceType
- NodePort:
在静态端口(NodePort)上公开每个节点的IP上的服务。系统会自动创建ClusterIP服务,NodePort服务会路由到该服务。您可以通过请求:.
从集群外部联系NodePort服务。
- loadbalance
使用云提供商的负载平衡器在外部公开服务。自动创建外部负载均衡器路由到的NodePort和ClusterIP服务。
简而言之,当您使用NodePort
时,您需要使用NodePublicIP:NodePort
。当您使用LoadBalancer
时,它将创建Network LB
与ExternalIP
。
在你的GKE集群中,你有一个叫做VPC的东西——虚拟私有云,它为你的基于云的资源和服务提供网络,这是全球性的,可扩展的,灵活的。
解决方案使用VPC-Native CLuster使用vpc本地集群,您将能够直接访问Pod的ip。为此,您需要创建subnet
。完整的指南可以在这里找到
使用VPC对等如果您想从GKE中的两个不同项目连接,您需要使用VPC对等连接。
使用NodePort从集群外部访问
如果你想从外部访问nginx服务,你可以使用NodeIP:NodePort
。NodeExternalIP
(请记住,此节点上必须有应用程序pod。如果您有3个节点和1个应用程序副本,则必须在部署该pod的地方使用NodeExternalIP
。另一个节点,您需要允许NodePort
访问Firewall
。
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
gke-cluster-1-default-pool-faec7b51-n5hm Ready <none> 3h23m v1.17.14-gke.1600 10.128.0.26 23.236.50.249 Container-Optimized OS from Google 4.19.150+ docker://19.3.6
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.8.9.10 <none> 80:30785/TCP 39m
$ curl 23.236.50.249:30785
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
集群IP地址只能在集群内访问;这就是它给出超时消息的原因。Nodeport用于在集群的每个节点的公有IP上公开一个端口;所以它可能有效。