kubectl exec 是干什么的
kubectl exec 在运行中的容器里执行命令或开一个交互式 shell,用于排查运行时问题:看环境变量、测域名解析、验证依赖连通性、检查挂载目录。命令要用分隔符与 kubectl 自身参数分开,多容器实例还要指定容器名,否则会直接报错。
基本信息
| 基本用法 | kubectl exec 实例名 [-c 容器名] -- 容器内命令 |
|---|---|
| 交互 shell | 加交互参数即可进入容器,注意精简镜像常常只有更简易的 shell |
| 多容器 | -c 指定容器名,实例里存在多个容器时不指定会报错 |
| 退出码 | 容器内命令的退出码会透传,可用于脚本判断 |
| 指定命名空间 | 跨命名空间操作需要显式指定 |
| 替代思路 | 镜像里没有任何 shell 时,改用临时调试容器排查 |
典型使用场景
- 验证域名解析:在容器内解析依赖服务名,判断是网络问题还是配置问题
- 核对环境变量:确认注入的连接串、时区与开关是否符合预期
- 测试依赖连通性:直连数据库或缓存端口,判断链路是否可达
- 检查挂载内容:确认配置文件与密钥文件确实存在于预期路径
- 查看进程状态:确认主进程是否在运行、监听哪个端口
- 执行一次性维护命令:在实例内做轻量数据修正或缓存清理
常用参数速查
| 参数 | 作用 | 使用注意 |
|---|---|---|
| -it | 交互终端 | 脚本中不要加,会挂住等待输入 |
| -c 容器名 | 指定容器 | 多容器实例必填 |
| -n 命名空间 | 指定命名空间 | 与查询实例时保持一致 |
| -- | 分隔 kubectl 与容器命令 | 漏写时参数会被误解析并报错 |
| --container | 等价于 -c | 长参数写法更清晰 |
| 临时调试容器 | 无 shell 镜像的替代方案 | 需要集群开启对应特性 |
使用示例
使用示例
kubectl exec -it web-1 -n dev -- sh # 进入容器
kubectl exec web-1 -- env | sort # 看环境变量
kubectl exec web-1 -- nslookup db.default.svc.cluster.local # 测域名解析
kubectl exec -c istio-proxy web-1 -- curl -s localhost:15000/stats | head
# 命令前的分隔符不能省,否则参数会被 kubectl 自己吃掉进入容器改文件只影响当前实例且不持久:真正的修复要走镜像或配置更新,改完记得回到声明式管理,否则下次重建改动就消失了。
精简镜像常常没有 shell:遇到找不到命令时不要怀疑集群,改用临时调试容器或在镜像里增加必要工具。
命令前的分隔符是硬性要求:漏写时容器内命令的参数会被 kubectl 当自己的参数解析,报出的错误与真实原因无关。
进出容器只解决现场判断:所有临时变更都要回到配置仓库,否则线上状态会与配置长期不一致。
替代排查手段
- 镜像没有 shell 时,用带工具的临时调试容器接入同一命名空间
- 网络类问题优先在容器内做解析与连通性验证
- 存储类问题检查挂载目录与权限,而不是反复重启实例
- 进程类问题看主进程是否在运行以及它的启动参数
- 配置类问题直接读取容器内实际文件,与配置仓库对比
- 涉及写操作的命令先在测试环境验证一遍再执行
排查结束后把结论记录下来:同一类问题再次出现时,可以直接复用验证步骤,而不必从头摸索。
在容器里做验证优先选择只读操作,确实需要写入时先确认影响范围与回滚方式,再决定是否当场执行。