Go服务必须监听0.0.0.0而非127.0.0.1,否则外部无法访问;Dockerfile需禁用CGO构建静态二进制;Deployment的selector与template.labels必须完全一致,否则导致Running但不可访问或CrashLoopBackOff。

监听地址写成 127.0.0.1、镜像没禁用 CGO、selector 和 template.labels 不一致——这三处任一出错,服务就卡在 Running 但无法访问,或反复 CrashLoopBackOff。
Go 代码必须监听 0.0.0.0,不能是 127.0.0.1
Kubernetes 的 Pod IP 是绑定在容器网卡上的独立地址,localhost 在容器内只指向自己。写成 http.ListenAndServe("127.0.0.1:8080", nil),外部(包括 kube-proxy、Service、其他 Pod)根本连不上。
- 正确写法:
http.ListenAndServe(":8080", nil)(空 host 默认监听所有接口) - 更稳妥做法:读取环境变量,比如
port := os.Getenv("PORT"),再拼成":" + port - 若用
net/http.Server,务必先调用net.Listen("tcp", addr)获取 listener,再传给.Serve(lis),避免探针在 bind 完成前就发起请求 - 本地
go run main.go能通 ≠ 部署后能通;kubectl get pods显示Running也不代表流量可达
Dockerfile 必须禁用 CGO 并用多阶段构建
Alpine 或 scratch 镜像不带 glibc,而默认开启 CGO 的二进制会尝试链接它,运行时报 standard_init_linux.go:228: exec user process caused: no such file or directory,日志里看不到具体缺哪个库。
- 构建阶段加
CGO_ENABLED=0 GOOS=linux:RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o main . - 运行阶段优先选
FROM scratch或gcr.io/distroless/static-debian12,体积小、无 shell、攻击面低 - 别用
golang:alpine直接当运行镜像——它带编译器和包管理器,纯属冗余 -
EXPOSE 8080虽非强制,但不写容易漏掉端口意识,建议保留
Deployment 的 selector.matchLabels 和 template.metadata.labels 必须逐字一致
Kubernetes API Server 对这两处 label 做硬校验,不是松散匹配。哪怕一个空格、大小写错位、键值顺序不同,都会报 invalid label selector 或 field is immutable,后续 kubectl apply 全部失败,只能删掉重建。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 两个地方 label 必须完全相同,例如都写成
app: go-service,不能一边是app: go-service,另一边是app: GoService -
replicas字段类型是*int32,YAML 里写replicas: 2是 int 类型,虽常被容忍,但在严格校验场景下可能出问题 - 别依赖
image: myapp:latest——:latest在生产中等于“不可追踪更新”,K8s 不会重新拉取同名镜像
必须配 readinessProbe 和 livenessProbe,且路径真实存在
Kubernetes 不看进程是否 running,只认探针返回码。没配探针,或路径不存在、端口不对、HTTP 状态码不是 2xx/3xx,Pod 就永远卡在 Ready: 0/1 或反复重启。
- Go 代码里至少暴露两个 handler:
/healthz(基础存活)、/readyz(依赖就绪,比如 DB 连通性检查) -
livenessProbe.httpGet.port和readinessProbe.httpGet.port必须和containerPort一致,不能写成 Service 的port -
initialDelaySeconds得留够时间:Go 启动慢(尤其带 DB 迁移或缓存预热),livenessProbe建议 ≥30s,readinessProbe可设 5–10s - 别用 TCP 探针替代 HTTP 探针——TCP 成功只说明端口开了,不代表业务 ready
最容易被忽略的是:监听地址、探针路径、label 键值三者必须同步对齐;任何一处大小写、空格、端口数字不一致,都会导致静默失败——服务看似在跑,实则流量进不来、健康检查不过、扩缩容失效。

















