进入 Pod 容器
学习目标
- 掌握进入 Pod 容器的方法
- 理解 exec 的使用场景
- 能够在容器内执行命令排查问题
核心概念
基本进入命令
# 进入容器(交互式)
kubectl exec -it nginx -- /bin/bash
# 进入容器(sh)
kubectl exec -it nginx -- /bin/sh
# 执行单个命令(不进入)
kubectl exec nginx -- ls /
# 执行多个命令
kubectl exec nginx -- sh -c 'echo hello && ls /'
exec 参数说明
| 参数 | 说明 |
|---|---|
-i | 保持标准输入打开(interactive) |
-t | 分配伪终端(tty) |
-it | 交互式进入(常用) |
-- | 分隔命令和参数 |
交互式 vs 非交互式
# 交互式(进入容器)
kubectl exec -it nginx -- /bin/bash
root@nginx:/#
# 非交互式(执行命令后退出)
kubectl exec nginx -- cat /etc/nginx/nginx.conf
交互式:适合调试、探索
非交互式:适合自动化、脚本
多容器 Pod exec
apiVersion: v1
kind: Pod
metadata:
name: multi
spec:
containers:
- name: web
image: nginx
- name: sidecar
image: busybox
# 进入指定容器
kubectl exec -it multi -c web -- /bin/bash
kubectl exec -it multi -c sidecar -- /bin/sh
# 不指定容器(默认第一个)
kubectl exec -it multi -- /bin/bash
常用排查命令
# 查看进程
kubectl exec nginx -- ps aux
# 查看网络
kubectl exec nginx -- netstat -tlnp
kubectl exec nginx -- ss -tlnp
# 查看文件系统
kubectl exec nginx -- df -h
kubectl exec nginx -- ls -la /var/log
# 查看环境变量
kubectl exec nginx -- env
# 测试网络连接
kubectl exec nginx -- curl http://other-service
kubectl exec nginx -- ping 10.244.1.5
# 查看配置文件
kubectl exec nginx -- cat /etc/nginx/nginx.conf
文件拷贝
# 从容器拷贝到本地
kubectl cp nginx:/etc/nginx/nginx.conf ./nginx.conf
# 从本地拷贝到容器
kubectl cp ./file.txt nginx:/tmp/file.txt
# 从指定容器拷贝
kubectl cp nginx:/etc/nginx/nginx.conf ./nginx.conf -c web
容器内调试
# 安装调试工具(如果容器内没有)
# 方式 1: 使用临时容器
kubectl run debug --image=busybox -it --rm -- /bin/sh
# 方式 2: 使用 ephemeral containers(K8s 1.18+)
kubectl debug -it nginx --image=busybox --target=nginx
常见调试场景
场景 1: 网络问题
# 进入容器
kubectl exec -it nginx -- /bin/bash
# 测试 DNS
nslookup kubernetes
nslookup my-service
# 测试连接
curl http://my-service:8080
ping 10.244.1.5
场景 2: 文件问题
# 查看挂载
kubectl exec nginx -- mount | grep /data
# 查看文件权限
kubectl exec nginx -- ls -la /data
# 查看文件内容
kubectl exec nginx -- cat /data/config.yaml
场景 3: 进程问题
# 查看进程
kubectl exec nginx -- ps aux
# 查看监听端口
kubectl exec nginx -- netstat -tlnp
# 查看资源使用
kubectl exec nginx -- top
不进入容器执行命令
# 单个命令
kubectl exec nginx -- ls /
# 管道命令
kubectl exec nginx -- sh -c 'cat /var/log/nginx/access.log | tail -10'
# 输出到文件
kubectl exec nginx -- sh -c 'cat /var/log/nginx/access.log' > access.log
权限问题
# 容器内可能是非 root 用户
kubectl exec -it nginx -- whoami
# 需要 root 权限时
kubectl exec -it --as root nginx -- /bin/bash
# 或者使用 securityContext
实践练习
练习 1: 基本进入
创建 Pod 并进入容器:
kubectl run test --image=nginx --restart=Never
kubectl exec -it test -- /bin/bash
在容器内执行:
whoami
pwd
ls /
cat /etc/hostname
exit
练习 2: 非交互式命令
不进入容器执行命令:
kubectl exec test -- whoami
kubectl exec test -- ls /usr/share/nginx/html
kubectl exec test -- cat /etc/nginx/nginx.conf
练习 3: 文件拷贝
从容器拷贝文件:
kubectl cp test:/etc/nginx/nginx.conf ./nginx.conf
cat ./nginx.conf
练习 4: 网络排查
进入容器排查网络:
kubectl exec -it test -- /bin/bash
apt-get update && apt-get install -y curl dnsutils
nslookup kubernetes
curl http://kubernetes.default.svc
常见误解
1. exec 需要容器运行中
错误:Pod 创建后就能 exec
正确:容器必须处于 Running 状态
Pending 或 CrashLoopBackOff 状态无法 exec
2. 容器内可能没有 bash
错误:所有容器都有 /bin/bash
正确:
- Alpine 镜像只有 /bin/sh
- distroless 镜像没有 shell
可以使用 /bin/sh 或 kubectl debug
3. exec 不适合生产调试
错误:生产环境用 exec 调试
正确:
- exec 适合开发/测试环境
- 生产环境用日志和监控
- 避免在生产容器安装工具
小结
| 要点 | 说明 |
|---|---|
| 基本命令 | kubectl exec -it <pod> -- /bin/bash |
| -it 参数 | 交互式终端 |
| -c 参数 | 指定多容器 Pod 的容器 |
| 非交互式 | kubectl exec <pod> -- command |
| 文件拷贝 | kubectl cp |
| 排查用途 | 网络、文件、进程 |
| 注意 | 容器需运行中,可能没有 bash |
练习编辑器
bash
Loading...