kubernetes暴露外部服务靠service+ingress或loadbalancer组合实现;go应用必须监听0.0.0.0:8080并匹配containerport、探针路径及ingress端口配置,否则导致访问失败或pod反复重启。

直接暴露外部服务不是靠“部署 Go 应用”这一步完成的,而是靠 Kubernetes 的 Service + Ingress 或 LoadBalancer 组合实现;Go 代码本身只需监听 0.0.0.0:8080、暴露 /healthz 和 /readyz,否则 Service 流量进得去、探针却通不过,Pod 会被反复重启。
Go 服务必须监听 0.0.0.0 而非 127.0.0.1
Kubernetes Pod 内部网络是独立的,容器进程若只绑定 127.0.0.1:8080,其他容器或 kube-proxy 就无法访问。常见错误现象是 kubectl get pods 显示 Running,但 kubectl logs 里没请求日志,curl 探针也超时。
- 正确写法:
http.ListenAndServe(":8080", nil)(冒号开头即默认绑定 0.0.0.0) - 错误写法:
http.ListenAndServe("127.0.0.1:8080", nil) - 如果用了
gin,确保启动时没写死地址:router.Run(":8080"),而不是router.Run("127.0.0.1:8080")
Deployment 中的 containerPort 必须和 Go 监听端口一致
containerPort 不是“映射端口”,而是告诉 Kubernetes “这个容器实际在监听哪个端口”,它要和 Go 代码里 ListenAndServe 的端口完全相同。不一致会导致 readiness/liveness 探针发包到错端口,返回 connection refused。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- Go 代码监听
:8080→ Deployment 中containerPort: 8080 - Go 代码监听
:3000→ Deployment 中containerPort: 3000 - 别依赖默认值:Kubernetes 不会自动猜端口,
containerPort字段必须显式写出
Service 类型选错,外部根本访问不到
ClusterIP 默认只允许集群内访问,想从浏览器或 curl 直连,必须用 NodePort、LoadBalancer 或 Ingress。三者适用场景差异明显:
-
NodePort:开发/测试最常用,节点 IP + 随机高位端口(如31234),访问http://<node-ip>:31234</node-ip>即可;但需确认云主机或本地防火墙放行该端口 -
LoadBalancer:公有云环境(AWS/Azure/GCP)自动创建 LB,分配公网 IP;私有集群需装metalLB才能生效 -
Ingress:真正生产推荐方式,用域名路由(如api.example.com),但必须先部署ingress-nginx或traefik控制器,否则 YAML 应用后无任何效果
探针路径不匹配,Pod 卡在 CrashLoopBackOff
Kubernetes 的 livenessProbe 和 readinessProbe 只做 HTTP GET 请求,路径必须和 Go 代码中注册的 handler 完全一致,包括大小写和末尾斜杠。写错一个字符就是 404,探针失败后 Pod 被杀,循环重启。
- 代码里写了
http.HandleFunc("/healthz", ...)→ YAML 中httpGet.path: /healthz - 代码里是
r.GET("/ready", ...)(gin)→ YAML 中不能写成/readyz - 常见坑:
/healthvs/healthz、/readyvs/readyz、漏掉前导/(如写成healthz) - 验证方法:
kubectl port-forward pod/<pod-name> 8080:8080</pod-name>,然后本地curl http://localhost:8080/healthz
最容易被忽略的是:Ingress 规则里的 service.port.name 或 service.port.number 必须和 Service 中定义的 ports[0].name 或 ports[0].port 对得上;很多团队配完 Ingress 发现 503,查半天才发现 Service 没暴露 port: 80 这个名字,或者 Ingress 指向了不存在的 targetPort。










