iris 是 go 语言 web 框架,不参与 kubernetes 集群部署;需将其应用打包为镜像,通过 deployment 部署到已有 k8s 集群,关键包括正确配置 image、ports、健康探针、redis session 外部化、优雅终止及主进程常驻。

Iris 框架本身不参与 Kubernetes 集群的部署,它只是一个 Go 语言 Web 框架,负责处理 HTTP 请求;Kubernetes 集群部署是基础设施层的事,和 Iris 无关。你真正需要的是:如何把一个基于 Iris 的应用(比如你写的 kubemgr 后端)正确打包、配置并部署进已有的 Kubernetes 集群。
怎么写 Iris 应用的 Kubernetes Deployment YAML
Deployment 是让 Iris 服务在 K8s 中跑起来的核心资源。关键不是框架怎么“配置集群”,而是你的服务如何适配 K8s 的运行模型。
-
image必须指向你构建好的镜像,比如my-registry/kubemgr:v1.2,不能写本地路径或./main -
ports要显式声明容器监听端口,Iris 默认用8080,YAML 里就得写containerPort: 8080 -
livenessProbe和readinessProbe建议加,哪怕只是简单地 GET/healthz—— Iris 里加个路由就行:app.Get("/healthz", func(ctx iris.Context) { ctx.StatusCode(200) }) - 如果你用了
SessionMgr并连了 Redis,确保env里传入了REDIS_BIND等变量,而不是硬编码在conf文件里
为什么 Iris 的 session 配置在 K8s 里容易失效
Kubernetes Pod 是可被随时驱逐重建的,而 Iris 默认的内存 session 存储只存在于单个进程内。一旦 Pod 重启,所有 session 就丢了,用户登录态直接中断。
- 必须禁用内存 session,改用外部存储——你代码里已经写了
NewRedis(),这是对的 - 但要注意:
redisbind配置项不能写localhost:6379,得是 K8s 内部 DNS 名,比如redis-svc.default.svc.cluster.local:6379 - 如果 Redis 也部署在 K8s 里,建议用
StatefulSet + Headless Service,避免 DNS 解析失败导致SessionMgr初始化 panic - 检查
redisdb配置值是否为数字(如"0"),Iris 的redis.Config.Database类型是string,但底层 Go-Redis 期望是int,错传会静默失败
怎么让 Iris 服务支持 K8s 的滚动更新
Iris 默认不处理 SIGTERM,Pod 被删除时会直接 kill 进程,正在处理的请求可能被中断。
- 在
Listen函数返回后,手动监听系统信号:iris.RegisterOnInterrupt(func() { app.Shutdown(ctx) }) - 确保
app.Shutdown调用前,所有长连接(比如你用的 websocket)已关闭,否则Shutdown会超时失败 - Deployment 中设置
terminationGracePeriodSeconds: 30,给 Iris 留出足够时间完成 graceful shutdown - 别依赖
preStophook 来发 HTTP 请求关服务——Iris 没提供内置的 shutdown API,得自己暴露一个管理端点
最常被忽略的一点:Iris 的 app.Run 启动后是阻塞的,但 K8s 要求容器主进程不能退出,否则 Pod 状态变成 Completed。所以你必须确认 km.Listen(...) 调用后整个进程持续运行,不要在 main 函数末尾提前 return 或 os.Exit。











