# 04-05-nodejs-探针与健康检查 > 为 `nodejs-demo` 配置 **存活 / 就绪 / 启动** 探针,使 kubelet 能在异常时重启容器,并在未就绪时从 Service **Endpoints** 摘除流量。 ## TL;DR - **手动练习**:复制本课目录 `ansible/files/04-05/` 下清单到目标路径,按需改字段后按本文 `kubectl`/bash 操作(学习路径可不使用 verify)。 - **自动化验收**:`./ansible/bin/verify.sh run 04-05` - **关键前置**:按本文「前置条件」准备环境变量/Secret/入口 IP - **成功判据**:达到本文「预期」且 playbook 断言通过 - **排障**:见本文「排障」 ## 前置条件 - 已部署 `nodejs-demo`(`04-01`);应用需暴露可探测的 HTTP 路径(示例用根路径 `/`)。 ## 清单路径(本课分目录) | 本篇完整清单 | [`ansible/files/04-05/04-05-nodejs-demo.yaml`](../ansible/files/04-05/04-05-nodejs-demo.yaml) | | 应用 | `kubectl apply -f ansible/files/04-05/04-05-nodejs-demo.yaml` | 探针端口与累积清单一致,为 **8080**(自 `04-02` 起与监听端口对齐)。 ## 场景说明(白话) Kubernetes 会**周期性访问**你指定的地址,判断容器该不该重启、该不该接流量: | 探针 | 人话 | |------|------| | **存活 liveness** | 「还活着吗?」一直失败就**重启容器**(认为卡死)。 | | **就绪 readiness** | 「能接客了吗?」失败时**不放进 Service 负载均衡**(流量不打进来)。 | | **启动 startup** | 「是不是还在慢启动?」启动阶段先由它把关,避免被 liveness **误杀**。 | ### 相对 `04-04` 的变更(原文 → 新文) | 位置 | 原文(`04-04`) | 新文(`04-05`) | |------|-----------------|-----------------| | `livenessProbe` / `readinessProbe` | (无) | `httpGet` 路径 `/`,端口 **8080**,`initialDelaySeconds`/`periodSeconds` 见清单文件 | 生产建议为健康检查单独提供 `/health` 或 `/ready` 路径(与业务路由分离)。 ## 部署与验证 ```bash kubectl apply -f ansible/files/04-05/04-05-nodejs-demo.yaml kubectl describe pod -l app=nodejs-demo -n default | sed -n '/Liveness/,/Events/p' kubectl get endpoints nodejs-demo -n default ``` 故意让应用崩溃或阻塞时,观察 **重启次数** 与 **Ready** 条件变化。 ## TCP 探针(备选) **YAML 怎么接**:与 HTTP 探针二选一;仍在 **Deployment 容器**里把 `httpGet` 换成 `tcpSocket: { port: 3000 }` 即可。适合「没有 HTTP、但端口能连上就算活着」的服务。 ## 失败排查 - **CrashLoopBackOff**:`livenessProbe` 过严或 `initialDelaySeconds` 过短;先放宽或加 `startupProbe`。 - **Service 无流量但 Pod Running**:readiness 失败;`kubectl get ep` 为空地址。 - `06-01-k3s-networkpolicy-故障排查.md` ## 相关文档 - [`04-02-nodejs-端口与Service.md`](04-02-nodejs-端口与Service.md) - [`04-06-nodejs-副本与滚动发布.md`](04-06-nodejs-副本与滚动发布.md) ## 排障 - **先看 playbook 输出**:失败时先定位是 deploy/wait/http_check 哪一步。 - **集群侧总览**:`kubectl get nodes -o wide`、`kubectl -n kube-system get pods -o wide`。 - **事件与日志**:`kubectl -n describe ...`、`kubectl -n logs ... --tail=200`。