首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes 应用无损上下线

Kubernetes 应用无损上下线

作者头像
用户11081884
发布2026-07-20 19:00:27
发布2026-07-20 19:00:27
210
举报

Kubernetes 集群中部署应用时,明明应用已经成功容器化并运行在 Kubernetes 上,但在发布更新或扩缩容时,仍然会出现请求丢失、连接中断等问题。这些“有损”发布现象直接影响用户体验和系统稳定性。本文将深入分析 Kubernetes 中应用上下线的核心问题,帮助实现真正的“零停机”、“零感知”无损发布。

典型场景

场景1:电商大促期间的服务更新

背景:某电商平台在双11大促期间需要紧急修复一个支付服务的安全漏洞。如果采用传统的有损发布方式,可能会导致:

  • 支付请求失败,造成交易流失;
  • 用户支付过程中出现连接中断;
  • 订单状态不一致等问题;

需求:需要在用户无感知的情况下完成服务更新,确保支付流程的连续性。

场景2:微服务架构下的频繁部署

背景:一个采用微服务架构的 SaaS 平台,每天需要部署数十次。每次部署都可能导致:

  • 服务间调用失败;
  • 网关路由错误;
  • 监控指标异常;

需求:实现平滑的滚动更新,确保服务的高可用性。

1、探针精准感知应用状态

1)就绪探针(Readiness Probe)
代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
spec:
  template:
    spec:
      containers:
      - name: payment-app
        image: payment-service:v1.2.0
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 20  # 等待应用启动完成
          periodSeconds: 5
          failureThreshold: 3
          successThreshold: 1

作用:确保 Pod 只有在应用完全就绪后才接收流量,避免“启动即崩溃”的问题。

2)存活探针(Liveness Probe)
代码语言:javascript
复制
livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 8080
  initialDelaySeconds: 30  # 给予足够的启动时间
  periodSeconds: 10
  failureThreshold: 1     # 快速失败,及时重启

作用:自动检测并恢复僵尸进程,保证服务的长期稳定性。

2、完整的优雅停机配置
代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  template:
    spec:
      terminationGracePeriodSeconds: 60  # 总优雅停机时间
      containers:
      - name: user-app
        image: user-service:v2.1.0
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 20"]  # 等待流量摘除
        env:
        - name: SERVER_SHUTDOWN_GRACE_PERIOD
          value: "25s"

对应的 Spring Boot 配置(application.yml):

代码语言:javascript
复制
server:
  shutdown: graceful
spring:
  lifecycle:
    timeout-per-shutdown-phase: 25s

工作流程

1、Pod 收到终止信号。

2、执行 preStop 钩子,等待 20 秒确保流量完全摘除。

3、发送 SIGTERM 信号给应用。

4、Spring Boot 开始优雅停机,最多等待 25 秒。

5、如果超时,K8s 发送 SIGKILL 强制终止。

3、滚动更新策略

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  replicas: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0  # 保证始终有足够实例提供服务
      maxSurge: 1       # 平滑的逐个更新
  template:
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: order-app
        image: order-service:v3.0.0
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 20"]

生产配置示例

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: production-ready-app
  labels:
    app: production-service
spec:
  replicas: 5
  selector:
    matchLabels:
      app: production-service
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    metadata:
      labels:
        app: production-service
    spec:
      terminationGracePeriodSeconds: 75
      containers:
      - name: main-app
        image: my-company/production-app:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        
        # 健康检查配置
        readinessProbe:
          httpGet:
            path: /health/readiness
            port: 8080
            httpHeaders:
            - name: Custom-Header
              value: Kubernetes-Probe
          initialDelaySeconds: 25
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 3
          successThreshold: 1
        
        livenessProbe:
          httpGet:
            path: /health/liveness
            port: 8080
          initialDelaySeconds: 45
          periodSeconds: 10
          timeoutSeconds: 3
          failureThreshold: 1
        
        # 生命周期管理
        lifecycle:
          preStop:
            exec:
              command: 
              - /bin/sh
              - -c
              - |
                echo "开始优雅停机流程"
                sleep 25
                echo "流量摘除完成,开始应用停机"
        
        # 环境变量配置
        env:
        - name: JAVA_OPTS
          value: "-Xms512m -Xmx512m -Dserver.shutdown=graceful"
        - name: SPRING_LIFECYCLE_TIMEOUTPER_SHUTDOWN_PHASE
          value: "30s"

---
apiVersion: v1
kind: Service
metadata:
  name: production-service
spec:
  selector:
    app: production-service
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
  type: ClusterIP

通过无损上下线方案,可以在 Kubernetes 环境中实现真正的“零停机”发布,为用户提供持续稳定的服务体验。

1、探针配置原则

  • 就绪探针检查业务就绪状态;
  • 存活探针检查进程存活状态;
  • 设置合理的初始延迟和检查间隔;

2、优雅停机关键点

  • preStop 钩子为流量摘除提供缓冲时间;
  • 应用需要正确处理 SIGTERM 信号;
  • terminationGracePeriodSeconds 要覆盖整个停机过程;

3、滚动更新策略

  • 使用 maxUnavailable: 0 保证服务容量;
  • 合理设置 maxSurge 控制更新节奏;
  • 结合 HPA 实现自动扩缩容;

“无他,惟手熟尔”!有需要的用起来!

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 典型场景
    • 场景1:电商大促期间的服务更新
    • 场景2:微服务架构下的频繁部署
  • 1、探针精准感知应用状态
    • 1)就绪探针(Readiness Probe)
    • 2)存活探针(Liveness Probe)
    • 2、完整的优雅停机配置
    • 3、滚动更新策略
  • 生产配置示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档