在GKE中如何访问NodePort类型的Service?是否需要创建Ingress?
你当前创建的Service类型为NodePort,这类Service默认不会被GKE分配公网外部IP,以下是具体的访问方案和相关说明:
问题原因
你配置的spec.type为NodePort,该类型Service的作用是在集群所有节点的指定端口(你这里配置的是30080)上暴露服务,但仅默认暴露节点的内网端口,不会自动绑定公网IP,因此你在Service详情中看不到EXTERNAL-IP字段的有效值。

访问当前NodePort服务的标准流程
根据你的使用场景,可以选择以下任意一种访问方式:
- 集群内访问:适合集群内部其他工作负载调用该服务,直接通过
服务名.命名空间.svc.cluster.local:端口的格式访问,你这个场景下访问地址为ui-svc.dev.svc.cluster.local:8080 - 临时本地测试访问:如果仅需要本地临时调试,不需要对外暴露,可使用
kubectl port-forward命令做端口转发,执行命令:
执行后即可通过本地浏览器访问kubectl port-forward svc/ui-svc -n dev 8080:8080http://localhost:8080使用服务 - 公网临时访问:可直接通过GKE节点的公网IP访问,需要先确认你的GKE节点已经分配了公网IP,然后在VPC防火墙中放开30080端口的入站规则(建议仅放开你自己的公网IP作为源地址),之后访问
http://<节点公网IP>:30080即可。该方式不建议用于生产环境,节点IP会随节点重建变更,且安全性较低。
是否需要创建Ingress
是否需要Ingress取决于你的业务场景,你可以参考以下方案选择:
- 如果你只有这一个服务需要长期对外暴露,最简单的方案是将Service的type从
NodePort改为LoadBalancer,GKE会自动为你分配一个固定的公网负载均衡IP,直接通过该IP加端口即可访问服务,修改后的Service配置片段示例:
注意该方案会创建公网负载均衡实例,会产生对应的云资源费用。spec: selector: app: ui targetEnv: dev ports: - name: ui port: 80 # 可改为80端口,访问时无需额外加端口号 targetPort: 8080 type: LoadBalancer - 如果你有多个服务需要对外暴露、需要配置域名路由、HTTPS证书、访问限流等能力,建议创建Ingress资源。你可以直接使用GKE托管的Ingress Controller,无需自行部署,配置Ingress规则后即可通过同一个公网IP复用暴露多个服务,整体成本更低,也更方便统一管理。
内容的提问来源于stack exchange,提问作者Pengbo Wu
相关产品推荐
相关产品推荐

