Go服务端口硬编码导致readinessProbe失败是首次部署失败主因,须从环境变量读端口并确保与containerPort及sidecar代理端口一致;禁用CGO、差异化设置探针initialDelaySeconds、Pod内使用in-cluster config初始化client-go。

Go服务端口硬编码导致readinessProbe失败
绝大多数首次部署失败,根源是http.ListenAndServe(":8080", nil)这类写法。Kubernetes不认你代码里写的数字,只认containerPort和探针实际访问的端口是否一致。
必须从环境变量读端口,并 fallback 到默认值:
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.ListenAndServe(":"+port, nil)
-
containerPort字段(YAML里)必须和这个port值完全一致 - 如果用了 Nginx sidecar,还要确认它
proxy_pass http://127.0.0.1:8080里的目标端口也对得上 - 本地调试时设
PORT=8080没问题,但上线后集群通常由 Service 或 Ingress 注入真实端口,硬编码会直接让就绪探针返回connection refused
镜像构建未禁用CGO导致Alpine容器启动崩溃
用FROM golang:alpine编译、再FROM alpine:latest运行,看似精简,但若没关CGO_ENABLED,二进制仍会动态链接libc——而 Alpine 用的是musl,一启动就报no such file or directory。
构建命令必须显式关闭CGO并指定目标平台:
CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o main ./cmd/api
- 不要依赖
Dockerfile里没声明的默认值,CGO_ENABLED=0必须写死在RUN指令中 - 最终运行镜像若用
scratch,记得提前在 Alpine 阶段apk add ca-certificates,否则调 Kubernetes API 会因证书缺失失败 -
-ldflags="-s -w"去掉调试符号,能减小 30%+ 二进制体积,对冷启动速度有实际影响
livenessProbe和readinessProbe的initialDelaySeconds设成一样
Go 应用冷启动慢:加载配置、连 DB、初始化缓存。如果两个探针的initialDelaySeconds都设为10,结果就是流量刚进来,Pod 还没 ready,liveness 就把它杀掉,陷入重启循环。
-
readinessProbe.initialDelaySeconds建议设为30~60,给应用足够时间完成初始化 -
livenessProbe.initialDelaySeconds应比 readiness 大至少10s,比如45或70 - 两者
periodSeconds可以相同(如10),但延迟必须错开,否则探测节奏会打架
client-go初始化失败却误判为RBAC权限问题
本地用clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)能跑通,一上集群就 panic:open /root/.kube/config: no such file or directory——这不是权限问题,是压根没走 in-cluster 流程。
Pod 内必须用rest.InClusterConfig():
config, err := rest.InClusterConfig()
if err != nil {
log.Fatal(err) // 不要 fallback 到 kubeconfig 路径
}
clientset, err := kubernetes.NewForConfig(config)
- 挂载自定义
kubeconfig时,volume权限必须是400或444,否则 client-go 拒绝读取 - RBAC 缺失的表现是
clientset.CoreV1().Pods("default").List()返回Forbidden,而不是初始化阶段 panic - ServiceAccount 必须绑定对应 Role/ClusterRole,且
automountServiceAccountToken: true不能被手动关掉
kubectl get pods里就只剩CrashLoopBackOff或Pending。调试时别堆命令,先盯住kubectl describe pod的 Events 和 Conditions 字段,那里写的才是真相。


















