17·Pod 基础入门

进入 Pod 容器

kubernetespodexec

进入 Pod 容器

学习目标

  1. 掌握进入 Pod 容器的方法
  2. 理解 exec 的使用场景
  3. 能够在容器内执行命令排查问题

核心概念

基本进入命令

# 进入容器(交互式)
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...

继续学习

完成本课后,建议继续学习下一课「删除 Pod」 以巩固所学知识。