Kratos服务上线需确保监听地址为0.0.0.0或:端口、健康探针路径严格匹配且HTTP接口可用、Helm配置中资源/端口/环境变量三项准确无误,缺一则触发CrashLoopBackOff或NotReady。

Kratos 服务上线不是“打包丢进 Kubernetes 就完事”,关键卡点在监听地址、健康探针、配置加载三处——错一个,CrashLoopBackOff 或 NotReady 立刻出现。
main.go 必须绑定 0.0.0.0,不能写 127.0.0.1
Kubernetes Pod 内部网络靠 ClusterIP Service 转发,容器进程若只监听 127.0.0.1:9000,Service 流量根本进不来,livenessProbe 直接失败。
-
http.Server启动时地址必须是":8000"或"0.0.0.0:8000",显式写"127.0.0.1:8000"会阻断所有外部访问 -
grpc.Server同理,lis, _ := net.Listen("tcp", ":9000")才安全;写成"127.0.0.1:9000"会导致 gRPC 客户端超时 - 本地开发用
127.0.0.1没问题,但上线前必须改;建议统一用":${PORT}"+ 环境变量驱动,避免硬编码
健康检查接口必须存在且可被 HTTP 探针调用
Kubernetes 的 readinessProbe 和 livenessProbe 默认走 HTTP GET,gRPC 原生不支持,直接配 httpGet.path: /healthz 会 404 或 503。
- HTTP 服务:在
http.Server路由里加一条r.GET("/healthz", func(c *gin.Context) { c.NoContent(200) })(若用 Gin)或 Kratos 自带的http.Handle("/healthz", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) })) - gRPC 服务:不要试图让
httpGet直连 gRPC 端口;要么暴露配套 HTTP 健康接口,要么用grpc-health-probe工具(需额外加initContainer下载二进制) - 探针路径必须和
values.yaml中readinessProbe.httpGet.path完全一致,大小写、斜杠都不能错;常见错误是写了/health但代码里注册的是/healthz
Helm values.yaml 里这三项改错就起不来
Kratos 对资源、端口、环境变量极其敏感,模板里字段名或值写错,Deployment 创建后立刻 CrashLoopBackOff。
-
resources.requests.memory至少设为128Mi;Kratos 启动时加载 gRPC 反射、中间件、日志组件会瞬时吃内存,64Mi很容易触发OOMKilled -
service.port和deployment.container.ports.containerPort必须严格一致;默认 HTTP 是8000、gRPC 是9000,改了任一端口就得同步改另一处,否则 Service 流量无法路由到容器 -
env.KRATOS_ENV必须传入,比如prod;Kratos 的config.Load()依赖它加载configs/config.prod.yaml,漏掉就 panic:“failed to load config”
ConfigMap 挂载 config.yaml,别拆成几十个 .Values 键
把数据库地址、Redis 地址、超时时间全写成 .Values.db.host、.Values.redis.port 这类键,维护成本爆炸,且和 Kratos 的多层配置优先级(环境变量 > ConfigMap > 默认值)冲突。
- 在
templates/configmap.yaml里用{{ .Values.config | nindent 2 }}直接渲染整个config.yaml内容,格式保持 YAML 原样 -
values.yaml里只保留顶层开关,比如config: |<br> server:<br> http:<br> addr: ":8000"<br> data:<br> database:<br> source: ${DB_SOURCE} - 敏感字段如密码,走
Secret挂载,并在config.yaml中用${DB_PASSWORD}占位,由 Kratos 的env解析器自动替换
真正难的不是写 Helm Chart,而是让 Kratos 进程在容器里“活下来”——它得能被探活、能读到配置、能扛住启动峰值内存。这三个条件缺一不可,任何一处松动,上线就是反复重启。


















