-w 持续观察是什么
kubectl 的 -w(--watch)在列出当前对象后保持连接,把后续的变化事件按行追加输出,因此能看到 Pod 从 Pending、ContainerCreating 到 Running 的推进过程,也能盯着 Deployment 的副本数变化。它读取的是 API Server 的变化流,不是定时轮询:输出是增量的,只反映连接期间发生的事,历史变更要看事件或审计日志。加 --watch-only 可跳过初始列表,只看变化。
基本信息
| 语法 | kubectl get <资源> -w [-l 选择器] [-n 命名空间] |
|---|---|
| 适用平台 | 任意受支持的 kubectl 客户端,对集群版本无额外要求 |
| 只看变化 | --watch-only 不打印当前列表,从连接后的第一个事件开始 |
| 输出控制 | 可配合 -o wide、-o custom-columns 精简列,避免刷屏 |
| 结束方式 | Ctrl+C 结束;脚本里要加 timeout 或 head,否则不会自然退出 |
| 连接中断 | 长连接可能因超时或网络抖动断开,kubectl 会重试,偶发解码警告可忽略 |
典型使用场景
- 肉眼看滚动更新过程:实例先增后减、逐个替换
- 排查 Pod 卡在 Pending 或 ContainerCreating 的时长与顺序
- 确认缩容、驱逐、重调度是否真的发生
- 发布时盯新副本是否如期起来,比反复手敲 get 省事
- 配合 -l 只盯某业务或某个版本的 Pod,缩小观察面
使用示例
使用示例
kubectl get pods -w -l app=web # 只盯某业务的 Pod 变化
kubectl get pods -w --watch-only -n dev # 不看初始列表,只看变化
kubectl get deploy web -w # 观察副本数与可用数变化
kubectl get pods -o custom-columns='NAME:.metadata.name,PHASE:.status.phase' -w # 精简列防刷屏
timeout 60 kubectl get pods -w -n dev > watch.log # 脚本里限制时长,避免挂住
kubectl rollout status deploy/web # 看发布进度,与 -w 互为印证Pod 状态推进读法
| 状态 | 含义 | 下一步看什么 |
|---|---|---|
| Pending | 未调度或尚未开始拉镜像 | describe 看 Events:资源不足、污点、PVC 未绑定 |
| ContainerCreating | 正在拉镜像与创建沙箱 | 镜像大小、拉取凭据、CNI 是否正常 |
| Running | 容器已启动 | READY 列是否就绪,未就绪查探针与日志 |
| Terminating | 正在优雅退出 | grace period 与 finalizer 是否卡住 |
| Completed | 一次性任务正常结束 | Job 的 completions 是否已满足 |
| CrashLoopBackOff | 反复启动失败后进入退避 | kubectl logs --previous 看上一轮容器日志 |
滚动更新时开两个窗口:一个用 -w 看 Pod 更替,一个用 rollout status 看发布进度,两边互为印证。
watch 只反映连接期间的变化:想查“之前到底发生了什么”,用 kubectl get events --sort-by=.lastTimestamp 或集群审计日志。