• Kubernetes如何实现零停机部署(zero-downtime deployment)?


    1、零停机部署

    在 Kubernetes (k8s) 集群中部署 Spring Cloud 微服务时,实现新版本平滑替换的关键在于确保零停机部署(zero-downtime deployment)。Kubernetes 提供了多种策略来实现这一点。以下是一些常用的方法:

    1. 滚动更新(Rolling Update)

      • Kubernetes 默认的部署策略是滚动更新。在此策略下,新版本的 Pods 会逐渐替换旧版本的 Pods,新旧版本将暂时并存,直到所有 Pods 都更新为新版本为止。
      • 可以定义 maxUnavailable 和 maxSurge 参数来控制更新过程中可用和额外 Pods 的数量。
    2. 蓝绿部署(Blue-Green Deployment)

      • 蓝绿部署是一种将应用的新版本(绿色)与当前版本(蓝色)同时部署,但只有一个版本对外提供服务的策略。
      • 一旦新版本就绪并且经过测试无误,流量将通过更新服务的标签选择器从旧版本切换到新版本。
      • 这种方法的好处是快速回滚,只需将流量切换回旧版本即可。
    3. 金丝雀发布(Canary Release)

      • 金丝雀发布是逐渐引入新版本的策略,先让新版本只处理一小部分用户流量。
      • 根据金丝雀版本的性能和稳定性,逐步增加处理的流量比例。
      • 通常需要配合服务网格(如 Istio)来更细粒度地控制流量。
    4. 使用 Readiness Probes

      • 在 Pod 规格中定义 readinessProbe,Kubernetes 会定期检查容器是否准备好接收流量。
      • 只有当 readinessProbe 检查通过时,服务才会开始向 Pod 发送流量。
    5. 使用 Liveness Probes

      • 定义 livenessProbe 以确定容器何时需要重启。如果检查失败,Kubernetes 将重启该容器,以保持服务的稳定性。
    6. 设置 Pod Disruption Budget (PDB)

      • PDB 保证在维护期间或者出现问题时,至少有一定数量的 Pods 是正常服务的。
    7. 优雅关闭 (Graceful Shutdown)

      • 确保应用程序能够在接收到停止信号时优雅地关闭,完成所有正在处理的请求并断开与服务注册中心的连接。

    实际操作中,以下是一些步骤示例:

    • 更新 Deployment 配置

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: your-service
    5. spec:
    6. replicas: 3
    7. strategy:
    8. type: RollingUpdate
    9. rollingUpdate:
    10. maxUnavailable: 1
    11. maxSurge: 1
    12. ...

    配置 readinessProbelivenessProbe 检查

    1. spec:
    2. containers:
    3. - name: your-service-container
    4. image: your-service:new-version
    5. readinessProbe:
    6. httpGet:
    7. path: /actuator/health
    8. port: 8080
    9. initialDelaySeconds: 10
    10. periodSeconds: 5
    11. livenessProbe:
    12. httpGet:
    13. path: /actuator/health
    14. port: 8080
    15. initialDelaySeconds: 30
    16. periodSeconds: 10

    当你通过 CI/CD 管道或手动方式更新 Kubernetes Deployment 的配置时,上述设定将启动零停机部署的流程。

    为了确保服务间的调用不会在更新过程中失败,你可能还需要考虑实现客户端重试机制和断路器模式,这些可以通过 Spring Cloud 的组件如 Spring RetryResilience4j

    2、优雅停机

    在 Spring Boot 应用中实现优雅关闭(Graceful Shutdown),可以确保应用在停止之前有机会处理完当前正在执行的任务。这个过程通常包括以下几个步骤:

    1、配置 Spring Boot 应用的优雅关闭: Spring Boot 2.3 及更新版本提供了直接的支持来配置优雅关闭。在 application.propertiesapplication.yml 文件中设置以下配置项:

    1. server.shutdown=graceful
    2. spring.lifecycle.timeout-per-shutdown-phase=30s

    或者在 application.properties 中:

    1. server.shutdown=graceful
    2. spring.lifecycle.timeout-per-shutdown-phase=30s

    这里,server.shutdown 设置为 graceful 意味着应用在停止前会完成当前正在处理的请求。spring.lifecycle.timeout-per-shutdown-phase 定义了每个关闭阶段的超时时间,以便在此期间完成清理工作。

    2、使用 Spring Boot Actuator: Spring Boot Actuator 提供了 /actuator/shutdown 端点,可以通过 HTTP 调用来触发应用关闭。默认情况下,这个端点是禁用的,需要手动启用:

    management.endpoint.shutdown.enabled=true
    

    然后,可以通过发送 POST 请求到 /actuator/shutdown 来触发优雅关闭。

    3、在代码中处理关闭信号: 在必要时,你可以监听应用上下文的关闭事件,来执行自定义的清理逻辑:

    1. @Component
    2. public class GracefulShutdownHandler implements ApplicationListener<ContextClosedEvent> {
    3. @Override
    4. public void onApplicationEvent(ContextClosedEvent event) {
    5. // 执行清理逻辑,如关闭资源、通知其他服务等
    6. }
    7. }

    4、配置容器的优雅关闭: 如果 Spring Boot 应用运行在容器环境中(比如 Docker 或 Kubernetes),你还需要确保容器平台本身支持优雅关闭。例如,在 Kubernetes 中,你可以设置 Pod 的 terminationGracePeriodSeconds

    1. spec:
    2. terminationGracePeriodSeconds: 60
    3. containers:
    4. - name: your-service-container
    5. image: your-service:latest
    6. lifecycle:
    7. preStop:
    8. exec:
    9. command: ["/bin/sh", "-c", "sleep 10"]
    1. 这里,terminationGracePeriodSeconds 表明在发送 SIGTERM 信号后,Kubernetes 将等待多长时间来关闭容器。preStop 生命周期钩子可以用来执行关闭前的操作,例如稍微延迟关闭,以确保服务有足够的时间完成请求处理。

    通过上述的配置和代码实现,你的 Spring Boot 应用将能够在接收到停止信号时,优雅地完成正在处理的请求,然后再关闭。这样可以最大程度减少服务中断带来的影响。

  • 相关阅读:
    【Redis 开发】(长篇学习)掌握Redis的用法,各种客户端下的操作
    Roson的Qt之旅#108 QML ListView的布局、方向和堆叠顺序
    【JAVA-QA】java注释的方式/格式/特点/作用知识点
    fedora工具篇章(版本号35)
    org.springframework.web.reactive.function.server.ServerResponse设置响应头
    1409. 查询带键的排列
    android 代码设置静态Ip地址的方法
    DML操作
    普中51单片机:串口通信原理与应用指南(八)
    开发微信小程序的作用
  • 原文地址:https://blog.csdn.net/flyfeifei66/article/details/137117586