
# Kubernetes临时容器问题定位最佳实践
Pod是Kubernetes应用程序的基本构建块。 由于Pod是一次性且可替换的，因此一旦Pod创建，就无法将容器加入到Pod中。临时容器（Ephemeral containers）是Kubernetes中的一种特殊容器，主要用途是在运行中的Pod中临时创建容器进行调试。
在大部分情况下，如果容器中出现异常故障，您可以通过**kubectl exec/logs**命令进入到容器进行业务调试与问题定位。但一些容器可能处于Crash状态，或者容器镜像中不包含一些调试工具，此时无法使用exec命令进行业务调试或者定位。在这些场景中，您可以使用临时容器（Ephemeral containers）进行调试，在现有Pod中注入临时容器来检查其状态并运行任意命令，对难以复现的故障进行排查。
#### 前提条件
- 集群版本 ≥ v1.23（确保EphemeralContainers特性默认启用）。
- 安装kubectl并配置集群访问权限，详情请参见[使用kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
- 准备调试工具镜像（推荐使用预置工具包的镜像）：
  - container-trouble-shooting：华为云容器团队提供的公共镜像，该镜像预置gdb、python、delve、strace、tcpdump、traceroute、telnet、nmap、bind-utils、iperf3、net-tools、ethtool、iftop、pstack、gcc、golang、perf等丰富的网络诊断工具、性能诊断以及开发环境等。 镜像地址：swr-gallery-ymzpnj.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1
    
  
  - nicolaka/netshoot：网络诊断工具集（tcpdump、netstat、curl等）。
   
- 执行镜像拉取操作的主机需要具备公网访问能力。
 
#### 权限配置（RBAC）
为调试用户或服务账号配置最小权限（只允许修改Pod的临时容器），操作步骤如下：
1. 创建role-test.yaml文件，并只赋予用户临时容器的修改权限。 
   ```
   vi role-test.yaml
   ```
   内容如下：
   ```
   apiVersion: rbac.authorization.k8s.io/v1
   kind: ClusterRole
   metadata:
     name: ephemeral-debugger
   rules:
   - apiGroups: [""]
     resources: ["pods/ephemeralcontainers"]
     verbs: ["update", "patch"]  # 只允许修改 Pod 的临时容器
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: ClusterRoleBinding
   metadata:
     name: debugger-binding
   subjects:
   - kind: User
     name: "xxx"  # 用户ID
     apiGroup: rbac.authorization.k8s.io
   roleRef:
     kind: ClusterRole
     name: ephemeral-debugger
     apiGroup: rbac.authorization.k8s.io
   ```
   关于获取用户ID的操作步骤请参见[获取账号、IAM用户、项目、用户组、区域、委托的名称和ID](https://support.huaweicloud.com/api-iam/iam_17_0002.html)。
   
   
2. 创建以上RBAC配置。 
   ```
   kubectl create -f role-test.yaml
   ```
   
   
 
#### 注入临时容器
1. 执行以下命令，为Pod注入一个临时容器并进入交互式Shell： 
   ```
   kubectl debug <pod-name> -it --image=swr-gallery-ymzpnj.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1 --target=<target-container>
   ```
   该命令中参数说明如下：
   - -it：进入交互式终端。
   
   - --image：指定临时容器的镜像。
   
   - --target：共享目标容器的进程命名空间（可选）。
   
   
   例如，调试名为 "myapp" 的Pod中的 "nginx" 容器，可执行以下命令：
   ```
   kubectl debug myapp -it --image=swr-gallery-ymzpnj.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1 --target=nginx
   ```
   您也可以通过Pod副本调试，命令如下：
   ```
   kubectl debug myapp -it --image=swr-gallery-ymzpnj.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1 --share-processes --copy-to=myapp-debug
   ```
   其中：
   - --share-processes： 使临时容器与现有的Pod共享进程命名空间，允许在临时容器中查看此Pod中的其他容器进程。
   
   - --copy-to：创建一个Pod副本，将临时容器复制到这个新Pod中，并指定新Pod的名称。
   
   
   执行上述命令后，您将会看到类似以下的输出：
   ```
   Pod/myapp created
   Defaulting container name to debugger.
   If you don't see a command prompt, try pressing enter.
   / #
   ```
   
   
2. 开始进行调试操作，使用各种调试工具来检查容器的状态。典型场景示例请参见[典型问题诊断场景]。
 
 #### 典型问题诊断场景
- **网络问题排查**
  场景：Pod 无法访问外部服务或内部服务。
  1. 使用调试工具镜像检查网络。
     ```
     kubectl debug myapp -it --image=swr-gallery-ymzpnj.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1
     ```
     
  
  2. 在临时容器中执行命令检查网络。
     ```
     tcpdump -i eth0 port 80     # 抓取 HTTP 流量
     netstat -tuln               # 检查端口监听状态
     dig my-service.namespace.svc.cluster.local  # 解析服务 DNS
     curl -v http://backend:8080 # 测试服务连通性
     ```
     
   
- **文件系统检查**
  场景：主容器日志丢失或配置文件异常。
  1. 创建临时容器，挂载主容器的文件系统（共享volumeMounts）。
     ```
     kubectl debug myapp -it --image=busybox --target=nginx
     ```
     
  
  2. 检查文件。
     ```
     ls /var/log/nginx          # 查看日志目录
     cat /etc/nginx/nginx.conf  # 验证配置文件内容
     ```
     
   
- **进程/性能分析**
  场景：CPU或内存使用率异常，使用htop、strace、perf等工具。
  1. 创建临时容器，共享目标容器的进程命名空间（使用--target 参数）。
     ```
     kubectl debug myapp -it --image=alpine --target=nginx
     ```
     
  
  2. 在临时容器中执行命令检查进程。
     ```
     # 查看进程树
     ps aux
     # 监控资源使用
     top -H
     # 跟踪系统调用
     strace -p 1  # PID 1 为 Nginx 主进程
     ```
     
   
 
