k8s发布服务,nacos未服务未下线紧急处理流程

Nacos 残留实例应急处理 SOP

场景:K8s 发版后,旧 Pod IP 仍残留在 Nacos,未正常摘除


一、问题时间线复盘

gantt title 2026-06-10 故障时间线 dateFormat HH:mm axisFormat %H:%M section 发布阶段 K8s 开始滚动发布 : milestone, m1, 20:49, 0m 发布完成 : done, 20:49, 20:54 section 异常阶段 旧Pod存活并重连Nacos : crit, 20:54, 22:00 运维手动Nacos下线 : milestone, m2, 22:00, 0m 旧Pod进程继续运行 : crit, 22:00, 23:22 section 清理阶段 旧Pod连接断开 : milestone, m3, 23:22, 0m Nacos清理过期metadata : done, 23:22, 23:24

二、根因分析

K8s 发版时会向旧 Pod 发送 SIGTERM,正常情况下应用收到信号后退出,Nacos 心跳随之停止,实例自动摘除。

本次异常路径如下:

K8s 发送 SIGTERM → Pod 未正常退出 → 进程持续存活 → 持续向 Nacos 发心跳 → 旧实例长期残留 → 上游流量仍路由到旧 Pod ⚠️

可能原因:

  • 应用未正确处理 SIGTERM,进程没有响应信号退出
  • terminationGracePeriodSeconds 配置过长,K8s 等待期间进程一直活着
  • 容器运行时(containerd)异常,容器进程泄漏到宿主机,K8s 层面误认为 Pod 已删除

三、应急处理 SOP

🚨 发现 Nacos 残留异常实例后,按以下步骤处理:


① 立即止血

  • Nacos 控制台找到该实例,手动点击下线
  • ⏱ 第一优先级,防止上游继续路由流量到旧 Pod

② 查 K8s Pod 状态

bash 复制代码
kubectl get pods -n prod -o wide | grep <异常IP>

根据结果分三种情况处理:

结果 说明 处理方式
Pod 处于 Terminating 卡住未退出 强制删除(见下方命令)
Pod 处于 Running 完全未被终止 强制删除(见下方命令)
找不到 Pod K8s 层面已删,进程泄漏到宿主机 跳到第③步宿主机排查
bash 复制代码
# Terminating 或 Running 时,强制删除
kubectl delete pod <pod-name> -n prod --force --grace-period=0

③ SSH 到宿主机

从上一步 kubectl get pods 结果中找到 NODE 列,拿到宿主机 IP,ssh 上去:

bash 复制代码
ssh <node-ip>

④ 定位残留进程

bash 复制代码
# 用业务端口查找进程(比随机端口可靠)
ss -tlnp | grep <业务端口>

# 确认该进程属于哪个容器
cat /proc/<PID>/cgroup

⑤ 确认后强杀

bash 复制代码
kill -9 <PID>

⚠️ kill 前务必通过 cgroup 确认是目标容器进程,避免误杀。


⑥ 收尾确认

  • 回到 Nacos 控制台,确认该实例已彻底消失
  • 记录事件时间、操作人、处理过程,留存备查

✅ 处理完毕


四、关键命令速查

☸️ K8s 侧

bash 复制代码
# 按 IP 查 Pod
kubectl get pods -n prod -o wide | grep <IP>

# 查 Pod 详情
kubectl describe pod <pod-name> -n prod

# 强制删除
kubectl delete pod <pod-name> -n prod --force --grace-period=0

🖥️ 宿主机侧

bash 复制代码
# 查业务端口对应进程
ss -tlnp | grep <业务端口>

# 确认进程的容器归属
cat /proc/<PID>/cgroup

# 强制杀进程
kill -9 <PID>

五、根本性解决方案

📋 短期

  • 建立本 SOP 流程,形成团队共识
  • 每次发版后人工核查 Nacos 实例数是否符合预期

🔧 中期

  • 应用注册 ShutdownHook,收到 SIGTERM 后主动调 Nacos 接口下线自身,不依赖心跳超时被动摘除
  • 合理配置 terminationGracePeriodSeconds,给应用足够但不过长的优雅退出时间

🚀 长期

  • Nacos 实例数变更接入自动告警,发版后异常残留第一时间通知,不依赖人工发现
  • 发版流水线增加后置检查步骤,自动验证旧实例已全部摘除,否则阻断发布

六、端口说明

端口类型 示例 说明
业务端口 8082 服务对外提供接口,排查进程用这个
Nacos 客户端随机端口 60674 应用连接 Nacos 时的本地 ephemeral port,每次随机分配,不固定
Nacos 服务端端口 8848 Nacos 服务器监听端口
相关推荐
Lost of 程序猿12 分钟前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式
知守观19 分钟前
Maven SNAPSHOT 更新排查:-U 无效、clean 无用,问题在 _remote.repositories(附完整链路)
java·后端·maven
IT_陈寒27 分钟前
一文搞懂SpringBoot的核心概念
前端·人工智能·后端
Mikko744 分钟前
fastjson 1.2.84 能在 JDK 7 上跑吗?实测:编译能过,一启动就 UnsupportedClassVersionError
java·后端·jdk·fastjson·安全漏洞
高频因子挖掘机1 小时前
股票 API 返回 HTTP 429 怎么办?Python 量化系统的限流排查与重试设计
后端·github·api
mldong1 小时前
为了 token 自由,我把 jeeflow 工作流引擎用 MoonBit 写了一遍
后端·架构
高频因子挖掘机2 小时前
从回测到实盘:量化策略为什么不应该直接依赖行情 API
后端·github·api
大鸡腿同学10 小时前
手心向上,手心向下
后端
CCblandy10 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构