You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes Nginx Ingress滚动更新遇短暂连接拒绝问题求助

解决Helm滚动更新时Nginx出现503的无断连优化方案

问题根源

滚动更新时出现短时间503,本质是旧Pod被删除后,Nginx Ingress的upstream列表未及时刷新,仍有请求路由到已回收的Pod IP;同时可能存在Pod就绪判断不准确、优雅终止流程缺失的问题。

以下是针对性的解决措施:


1. 配置Pod优雅终止流程

在你的服务chart(environment/server.yaml)中,为Deployment添加优雅终止配置,给Nginx足够的时间刷新upstream:

spec:
  template:
    spec:
      terminationGracePeriodSeconds: 30  # 给应用足够时间处理剩余请求
      lifecycle:
        preStop:
          exec:
            command: ["sleep", "5"]  # 延迟5秒再终止,确保Endpoint从服务列表中移除
      containers:
        - name: server
          # 确保应用能响应SIGTERM信号,比如Spring Boot需设置server.shutdown=graceful
          env:
            - name: SERVER_SHUTDOWN
              value: "graceful"

2. 强制滚动更新过程中无服务中断

调整Deployment的滚动更新策略,保证更新期间始终有足够的可用Pod:

spec:
  strategy:
    rollingUpdate:
      maxSurge: 1  # 每次最多新增1个Pod(或设为25%)
      maxUnavailable: 0  # 更新时不允许任何Pod不可用,必须等新Pod就绪再删旧Pod
    type: RollingUpdate

你可以在Terraform的values模板中加入这段配置,或者直接在chart的Deployment.yaml中定义。

3. 优化Nginx Ingress Controller的upstream刷新速度

针对Bitnami的Nginx Ingress chart,添加以下配置加快upstream同步:

resource "helm_release" "nginx_ingress" {
  # 原有配置...
  
  set {
    name  = "controller.config.worker-refresh-interval"
    value = "1000"  # 1秒刷新一次upstream列表(默认可能是5秒)
  }
  
  set {
    name  = "controller.config.enable-dynamic-configuration"
    value = "true"
  }
  
  set {
    name  = "controller.config.update-status-on-shutdown"
    value = "true"
  }
}

4. 完善Pod就绪探针配置

确保就绪探针能准确判断Pod是否真正可以处理请求,避免新Pod未就绪就被加入流量路由:

spec:
  template:
    spec:
      containers:
        - name: server
          readinessProbe:
            httpGet:
              path: /healthz  # 替换为你的应用健康检查接口
              port: 8080
            initialDelaySeconds: 10  # 启动后延迟10秒开始检查
            periodSeconds: 5  # 每5秒检查一次
            failureThreshold: 3  # 连续3次失败才标记为未就绪

5. 评估ExternalTrafficPolicy的影响

你当前设置了service.externalTrafficPolicy=Local,该配置会让流量直接路由到节点上的Pod,可能放大Endpoint更新的延迟。如果不需要保留客户端源IP,可以考虑改为Cluster:

resource "helm_release" "nginx_ingress" {
  # 原有配置...
  
  set {
    name  = "service.externalTrafficPolicy"
    value = "Cluster"
  }
}

若必须保留Local,则需确保前面的优雅终止和就绪探针配置严格执行。


内容的提问来源于stack exchange,提问作者yacho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:07:49