clusterip默认仅限集群内访问,若从本地curl或浏览器访问需改用nodeport或loadbalancer;selector标签不匹配或targetport错误会导致endpoints为空、服务不可达。

Service类型选错会导致服务根本访问不到
Go应用部署后Pod能跑起来,但kubectl get services看到ClusterIP却连不通,八成是Service类型和访问场景不匹配。ClusterIP默认只允许集群内通信,如果从本地curl或浏览器访问,必须改用NodePort或LoadBalancer。
-
ClusterIP:仅限其他Pod或kubectl port-forward调试时用,生产环境内部调用推荐这个 -
NodePort:开发测试最常用,绑定节点IP+端口(如30080),需确认节点防火墙放行该端口 -
LoadBalancer:云厂商自动分配公网IP,但会额外计费,私有云可能不支持
selector标签不一致,Service压根找不到Pod
Service靠selector字段匹配Pod标签,一旦Deployment里定义的app: go-app和Service中selector: {app: go-app}不完全一致(比如大小写、空格、多写个破折号),Service的Endpoints就会为空——kubectl get endpoints go-app-service返回<none></none>就是这个原因。
- 检查Deployment模板里的
metadata.labels和Service的spec.selector是否逐字相同 - 避免在Deployment中用
app.kubernetes.io/name这类复杂标签,初期统一用简单key如app - 用
kubectl describe service go-app-service看Events里有没有“no endpoints found”提示
targetPort写成服务名而非容器端口,请求直接503
Service的targetPort必须对应容器实际监听的端口,不是Service自己的port,也不是容器名。比如Go程序监听8080,但写成targetPort: http(假设没在容器ports里定义name)或targetPort: 80,流量就进不去。
- 确认Go代码里
http.ListenAndServe(":8080", nil)监听的端口 - 检查Deployment中
containers[].ports[].containerPort是否为8080 - Service里写
targetPort: 8080,不要依赖端口名,除非你显式定义了name: http且两端一致
Ingress配置生效前,别急着删NodePort
想用域名访问Go服务?Ingress需要配套Ingress Controller(如nginx-ingress、traefik),光写Ingress资源没用。很多人配完Ingress发现404,其实是Controller没装或没监听对应namespace。
- 先用
NodePort验证服务本身能通,再上Ingress - 确认Ingress Controller已运行:
kubectl get pods -n ingress-nginx(路径依安装方式而定) - Ingress的
spec.rules[].host要和你curl的域名一致,且DNS需解析到Ingress Controller的LoadBalancer IP或Node IP
kubectl get endpoints为空,都该先盯死selector和containerPort。











