go不部署微服务,仅编写服务代码、暴露/healthz和/readyz探针、构建多阶段轻量镜像;kubernetes通过deployment、service等资源编排运行,需确保端口一致、标签匹配、探针配置正确。

Go 本身不部署或管理微服务,Kubernetes 才是干这事的;Go 只负责写好服务代码、暴露探针、打成轻量镜像,剩下的交给 K8s 的 Deployment、Service 和 client-go 控制器去协调。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
Go 服务必须暴露 /healthz 和 /readyz 端点
Kubernetes 的livenessProbe 和 readinessProbe 不会猜你的健康逻辑,它只 HTTP GET 某个路径并看状态码。没这两个端点,Pod 很可能卡在 ContainerCreating 或反复重启。
- 用
net/http最简写法:http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }) http.HandleFunc("/readyz", func(w http.ResponseWriter, r *http.Request) { // 可加 DB 连通性检查,但别太重 w.WriteHeader(200) }) - 用
gin就是r.GET("/healthz", func(c *gin.Context) { c.Status(200) }) - 端口必须和 Deployment 中的
containerPort一致(比如8080),否则探针连不上 - 启动日志里加
log.Printf("server started on :8080"),方便排查CrashLoopBackOff
Dockerfile 必须用多阶段构建 + CGO_ENABLED=0
Go 编译出的是静态二进制,没必要把整个 Go 环境塞进镜像。镜像过大不仅拉取慢,还容易触发ImagePullBackOff。
- 第一阶段用
golang:1.22-alpine编译,关键命令:RUN CGO_ENABLED=0 GOOS=linux go build -a -o main .
- 第二阶段用
scratch或alpine:latest,不要FROM golang直接跑 - 如果用了 cgo(比如
sqlite或某些 crypto 库),就不能用scratch,得保留alpine并apk add对应依赖 - 别写
go run main.go—— 那会把 Go 工具链全打进镜像
Deployment YAML 要带资源限制和 label 匹配
Kubernetes 不认“微服务”这个词,只认Deployment 里写的字段。少一个 selector.matchLabels 或 template.metadata.labels 不匹配,Deployment 就起不来 Pod。
-
replicas设初值(比如3),别留默认值 -
resources.limits和requests必填,否则调度器无法分配节点,尤其在资源紧张时 -
env从ConfigMap或Secret注入,别硬编码密码或地址 -
livenessProbe和readinessProbe的initialDelaySeconds要大于服务冷启动时间(Go 一般 5–10 秒够了)
用 client-go 写 Operator 前先搞清边界
Operator 是给复杂生命周期管理用的(比如自动备份、主从切换、版本灰度),不是每个 Go 微服务都需要。多数场景下,直接 kubectl apply YAML 就够了。- 真要用 Operator,核心是 CRD + Reconcile 循环:定义
MyMicroService类型,Controller 用client-go查当前 Deployment 状态,比对 spec 字段,缺啥补啥 - 别在 Reconcile 里做阻塞操作(如 HTTP 请求没设 timeout),否则调谐卡住
- Finalizer 要手动清理,否则
kubectl delete会 hang 在Terminating - 本地开发建议先用
kind跑单节点集群验证 YAML,再上生产
真正容易被忽略的,是 Probe 的路径和端口是否与代码监听一致、Dockerfile 是否真用了 CGO_ENABLED=0、以及 Deployment 里 label selector 和 pod template 的 labels 是否完全相同——这三个地方错一个,服务就起不来,且错误日志往往藏在 kubectl describe pod 的 Events 里,而不是 logs 里。










