go应用本身不部署微服务,kubernetes才负责部署;需暴露/healthz和/readyz端点、监听0.0.0.0、禁用cgo多阶段构建轻量镜像、严格匹配labels与containerport、配置合理探针及优雅关闭,否则pod易卡在containercreating或crashloopbackoff。

Go 应用本身不“部署”到 Kubernetes,Kubernetes 才负责部署;你只需确保镜像够轻、探针路径对得上、YAML 标签严丝合缝——否则 Pod 会卡在 ContainerCreating 或反复进入 CrashLoopBackOff。
Go服务必须暴露/healthz和/readyz端点
Kubernetes 的 livenessProbe 和 readinessProbe 不会猜你的健康逻辑,只 HTTP GET 某个路径并看状态码。没这两个端点,Pod 很可能起不来或被反复杀掉。
-
/healthz应只返回200,不做 DB 查询、不连下游——它只回答“进程还活着吗” -
/readyz可查 DB 连通性、Redis 是否可写,但别超时太久(建议timeoutSeconds: 10) - 路径名必须和 Deployment YAML 中的
httpGet.path完全一致(比如 YAML 写的是/health,代码里却只注册了/healthz,探针就永远 404) - 端口也要和
containerPort一致(比如监听:8080,YAML 里却写containerPort: 80,探针连不上)
Dockerfile 必须用多阶段构建 + CGO_ENABLED=0
镜像太大不是“浪费空间”那么简单——它直接导致 ImagePullBackOff、节点磁盘爆满、CI 流水线卡住。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 第一阶段用
golang:1.22-alpine,关键命令是:RUN CGO_ENABLED=0 GOOS=linux go build -a -o main . - 第二阶段必须用
scratch或alpine:latest,绝不能FROM golang直接跑 - 如果用了 cgo(比如
sqlite3或某些加密库),就不能用scratch,得保留alpine并apk add对应依赖 - 入口命令必须是
./main,不是go run main.go——后者会把整个 Go 工具链打进镜像
Deployment YAML 中 label 和 selector 必须严格匹配
这是最常被忽略的配置断裂点:哪怕一个空格、大小写不一致,Deployment 就找不到它该管的 Pod,Service 也发现不了后端。
-
spec.selector.matchLabels和template.metadata.labels的键值对必须完全相同 -
containerPort值要和 Go 代码中http.ListenAndServe(":8080", nil)的端口一致 - 资源限制建议从
requests: cpu: "100m" memory: "64Mi"起步,避免因节点资源不足导致调度失败 - 镜像 tag 务必用具体版本(如
v1.2),禁用latest——它会让回滚、审计、复现问题变得不可控
真正难的不是写完 YAML 或跑通第一个 Pod,而是所有环节都得对齐:代码监听的端口、Docker 构建的二进制、探针路径、标签键值、Service 的 targetPort……少一个,Kubernetes 就不会帮你兜底。










