attach 与 exec 的区别
attach 把本地终端接到容器主进程的标准输入输出上,看到的是应用自己的日志与交互,也能向它发送输入。exec 则在容器内新起一个进程。前者用于交互式命令行程序或需要观察实时输出的场景,后者用于在容器里执行排查命令。
基本信息
| 用途 | 连接容器主进程的标准输入输出与错误输出 |
|---|---|
| 语法 | kubectl attach 加交互与终端参数,可指定容器 |
| 多容器场景 | 必须显式指定容器名 |
| 输入能力 | 取决于主进程是否读取标准输入 |
| 相关命令 | 查看日志、在容器内执行命令 |
典型使用场景
- 应用带有交互式命令行,需要本地终端直连
- 需要实时观察应用启动过程的输出
- 多容器 Pod 中定位到特定容器查看输出
- 排查日志采集延迟时直接观察实时输出
- 向等待标准输入的程序发送指令
常用示例
常用示例
kubectl attach -it web-7d9c8b6f5c-abcde # 交互式连接到主进程
kubectl attach web-7d9c8b6f5c-abcde -c app # 指定容器
kubectl attach web-7d9c8b6f5c-abcde -it --stdin=true --tty=true # 显式开启输入与终端
kubectl attach deploy/web -it # 按控制器选择实例
kubectl logs -f web-7d9c8b6f5c-abcde # 只观察输出时更安全常用参数
| 参数 | 作用 | 注意点 |
|---|---|---|
| 交互输入 | 保持标准输入打开 | 主进程不读输入时无效 |
| 终端模式 | 分配伪终端 | 与交互输入通常成对使用 |
| 指定容器 | 多容器 Pod 中选择目标 | 缺少时直接报错 |
attach 看到的内容与日志同源,都是主进程的标准输出。日常观察容器输出用日志命令即可,attach 更适合需要输入交互的场合。
会话断开不会影响容器里的进程本身,只是本地终端退出连接。需要长时间观察输出时,用跟随日志的方式比长时间挂着一个附加会话更稳妥。
多数服务的运行进程会响应终端中断信号。在 attach 会话里按下中断键可能直接向容器进程发送信号,导致服务意外退出,操作时需格外谨慎。