如何配置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
相关产品推荐
相关产品推荐

