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

如何配置Kubernetes滚动更新,等待新Pod就绪后再删除旧Pod

解决Kubernetes滚动更新时过早删除旧Pod的问题

核心方案:添加就绪探针(Readiness Probe)

Kubernetes默认在容器启动后就判定其就绪,随即开始替换旧Pod,但你的NodeJS应用需要额外时间完成初始化。添加就绪探针可以让K8s等待应用真正对外提供服务后,再将新Pod加入负载均衡池,之后才删除旧Pod。

修改你的Deployment YAML,在容器配置中加入readinessProbe:

spec:
  replicas: 4
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: image
        imagePullPolicy: Always
        resources:
          limits:
            memory: "8Gi"
            cpu: "10"
          requests:
            memory: "8Gi"
            cpu: "10"
        livenessProbe:
          httpGet:
            path: /api/Health
            port: 5274
          initialDelaySeconds: 180
          periodSeconds: 80
          timeoutSeconds: 20
          failureThreshold: 2
        # 新增就绪探针
        readinessProbe:
          httpGet:
            path: /api/Health
            port: 5274
          initialDelaySeconds: 15  # 首次检测延迟,覆盖你的10秒启动窗口
          periodSeconds: 5         # 每隔5秒检测一次
          timeoutSeconds: 3        # 检测超时时间
          successThreshold: 1      # 一次成功即标记就绪
          failureThreshold: 3      # 连续3次失败才标记未就绪
        ports:
        - containerPort: 5274
        - containerPort: 5900

这里复用了存活探针的健康检查接口/api/Health,确保只有当接口能正常响应时,新Pod才会被纳入服务集群。你可以根据实际启动时间微调initialDelaySeconds的值。

可选:调整滚动更新策略

为进一步强化更新安全性,可在Deployment的spec下添加滚动更新规则,限制同时更新的Pod数量,确保新Pod就绪后再删除旧Pod:

spec:
  replicas: 4
  strategy:
    rollingUpdate:
      maxSurge: 1        # 最多额外创建1个新Pod
      maxUnavailable: 0  # 更新期间不允许出现不可用Pod(必须等新Pod就绪才删旧Pod)
    type: RollingUpdate
  selector:
    matchLabels:
      app: app
  # 其余配置保持不变

设置maxUnavailable: 0会强制K8s遵循“先就绪新Pod,再删除旧Pod”的逻辑,彻底避免服务中断。

额外建议:优化Dockerfile

你的Dockerfile目前未启用多阶段构建的最终镜像,建议启用注释部分,减小镜像体积并提升安全性:

FROM node:14 AS builder
# Create app directory
WORKDIR /app
# A wildcard is used to ensure both package.json AND package-lock.json are copied
COPY package*.json ./
COPY prisma ./prisma/
COPY protos ./protos/
COPY tsconfig.build.json ./
COPY tsconfig.json ./
# Install app dependencies
RUN npm install
RUN export NODE_OPTIONS=--max_old_space_size=16384
RUN npm run build
COPY . .

# 多阶段构建:仅复制运行时必要文件到最终镜像
FROM node:14
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/protos ./protos
EXPOSE 5274  # 修正为实际服务端口5274
CMD ["npm", "run", "start"]

优化后的镜像仅包含运行所需文件,体积更小,同时将EXPOSE改为实际服务端口5274,配置更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:15:52