vlambda博客
学习文章列表

k8s之微服务的优雅退出

#前言

    前面有文章简单介绍过k8s优雅退出的内容 今天再来补充一下微服务在k8s中不同情况下需要处理的情况


# 基于k8s service服务发现

    如果我们的服务是基于k8s的service实现服务发现 那么我们的服务是可以不去处理优雅退出的 

    流程如下图

    可看出我们的service会在Deploy的生命周期中 自动更新对应的endpoints列表 以此保证我们上游服务通过service访问服务时 总能过滤掉term中的服务
    所以这种情况我们就可以不用刻意去做服务的优雅退出 直接通过默认的优雅退出机制即可


# 基于注册中心的服务发现

    假设我们的下游服务不去做优雅退出(处理sigterm信号) 而是依赖k8s默认的优雅退出(30秒的sigkill)


    那么上游服务在下游服务term阶段 还是能在discovery中访问到下游服务 那么就可能出现问题

    

   如下图

k8s之微服务的优雅退出

    所以我们就必须在我们的应用中处理好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中使用微服务时需要关注的优雅退出内容 希望对你有帮助


天府云计算架构茶话会