首页/云/云与容器速查/kubectl exec 进入容器执行命令
Kubernetes68 条

kubectl exec 进入容器执行命令

在运行中容器里执行命令或开交互 shell:-it 交互、-c 指定容器、-- 分隔 kubectl 与容器命令。distroless 等精简镜像没有 shell,只能换排查思路。

云与容器速查云更新于 2026-10-13

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 时,用带工具的临时调试容器接入同一命名空间
  • 网络类问题优先在容器内做解析与连通性验证
  • 存储类问题检查挂载目录与权限,而不是反复重启实例
  • 进程类问题看主进程是否在运行以及它的启动参数
  • 配置类问题直接读取容器内实际文件,与配置仓库对比
  • 涉及写操作的命令先在测试环境验证一遍再执行
排查结束后把结论记录下来:同一类问题再次出现时,可以直接复用验证步骤,而不必从头摸索。
在容器里做验证优先选择只读操作,确实需要写入时先确认影响范围与回滚方式,再决定是否当场执行。

易错点

  • 命令前忘记加分隔符,容器命令不执行却报未知参数错误
  • 镜像没有 shell,执行进入命令直接报找不到文件
  • 多容器实例不指定容器名,报错后误判为权限或集群问题
  • 在容器里临时改配置就当修复完成,实例重建后问题重现
  • 在生产实例上执行有副作用的命令,缺少记录,事后无法追溯

数据来源与参考

  • Kubernetes Docs:kubectl exec

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌