go服务在kubernetes中启动失败主因是端口、监听地址及探针配置不一致;须监听0.0.0.0:8080、containerport/targetport/探针port严格对齐、配置readiness/liveness探针并确保handler路径与响应格式正确。

Go服务在Kubernetes里起不来,90%是端口、监听地址或探针没对齐——不是代码逻辑问题,而是容器网络和声明式配置的衔接断了。
Go代码必须监听 0.0.0.0:8080,不能用 localhost 或 127.0.0.1
Pod 有独立网络命名空间,127.0.0.1 只指向容器自身,kube-proxy、Service、livenessProbe 全部连不上。
- 错误写法:
http.ListenAndServe("127.0.0.1:8080", nil)—— 本地能跑,部署后kubectl get endpoints返回<none></none> - 正确写法:
http.ListenAndServe(":8080", nil)(Go 默认等价于0.0.0.0:8080)或显式写"0.0.0.0:8080" - 更健壮的做法:从环境变量读端口,强制绑定全接口:
port := os.Getenv("PORT")<br>if port == "" { port = "8080" }<br>log.Fatal(http.ListenAndServe("0.0.0.0:"+port, nil)) - 用
net/http.Server自定义时,务必检查srv.Addr是:8080,不是127.0.0.1:8080
containerPort、探针 port、targetPort 必须完全一致
这四个值错一个,就会出现 connection refused、CrashLoopBackOff 或 Service 流量进不来。
-
containerPort在 Deployment 的ports下声明,必须等于 Go 监听的端口号(如8080) -
livenessProbe.httpGet.port和readinessProbe.httpGet.port必须和containerPort相同,不能写成 Service 的port - Service 的
targetPort必须等于containerPort;如果省略,会默认取port值,容易踩坑 -
EXPOSE 8080虽非强制,但写在 Dockerfile 里能强化端口意识,避免漏配
必须配 readinessProbe 和 livenessProbe,且路径要真实存在
Kubernetes 不看进程是否 running,只信 HTTP 状态码。没探针或路径返回非 2xx/3xx,Pod 就卡在 Ready: 0/1 或反复重启。
- Go 代码至少暴露两个 handler:
/healthz(基础存活)、/readyz(带 DB 连通性检查等业务就绪逻辑) -
initialDelaySeconds要留足:Go 启动慢(尤其带 migration 或 cache warmup),livenessProbe建议 ≥30s,readinessProbe可设 5–10s - 别用 TCP 探针替代 HTTP 探针——TCP 成功只说明端口开了,不代表业务 ready
- 探针路径必须是完整 URL 路径,比如
path: /healthz,不是/healthz/(结尾斜杠不匹配就 404)
Deployment selector 和 Pod labels 必须严格字符级匹配
Service 不认 Deployment 名、不认镜像名、不认容器名,只靠 label key/value 字符串精确匹配。差一个空格、大小写或拼写,Endpoint 就为空。
- Deployment 模板中
metadata.labels和spec.selector.matchLabels必须完全一致 - Service 的
selector必须和 Deployment 的matchLabels完全一样,例如都是app: go-app,不能是app: GoApp或app: go_app -
kubectl describe service <name></name>查Endpoints字段;为空就立刻查kubectl get pods --show-labels对比 label - 建议所有 label 使用小写字母、短横线分隔,避免特殊字符和空格
最常被忽略的是:健康检查 handler 的响应体必须是纯文本(如 "ok"),不能是 JSON 包裹的结构体——某些 Ingress 或网络策略会因 Content-Type 拒绝非 text/plain 响应。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











