k8s之微服务的优雅退出
#前言
前面有文章简单介绍过k8s优雅退出的内容 今天再来补充一下微服务在k8s中不同情况下需要处理的情况
# 基于k8s service服务发现
如果我们的服务是基于k8s的service实现服务发现 那么我们的服务是可以不去处理优雅退出的
流程如下图
可看出我们的service会在Deploy的生命周期中 自动更新对应的endpoints列表 以此保证我们上游服务通过service访问服务时 总能过滤掉term中的服务
所以这种情况我们就可以不用刻意去做服务的优雅退出 直接通过默认的优雅退出机制即可
# 基于注册中心的服务发现
假设我们的下游服务不去做优雅退出(处理sigterm信号) 而是依赖k8s默认的优雅退出(30秒的sigkill)
那么上游服务在下游服务term阶段 还是能在discovery中访问到下游服务 那么就可能出现问题
如下图
所以我们就必须在我们的应用中处理好k8s的sigterm信号 及时将terminating状态的pod从discovery中下线
如下以go代码示例
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM)
//监听
for {
s := <-c
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
// 监听退出信号 将服务从discovery下线
discovery.cancel()
return
}
}
流程如下图
# 后记
如上就是我们在k8s中使用微服务时需要关注的优雅退出内容 希望对你有帮助
天府云计算架构茶话会