文档首页/ 云容器引擎 CCE/ 最佳实践/ 容器/ Kubernetes临时容器问题定位最佳实践
更新时间:2025-04-28 GMT+08:00
分享

Kubernetes临时容器问题定位最佳实践

Pod是Kubernetes应用程序的基本构建块。 由于Pod是一次性且可替换的,因此一旦Pod创建,就无法将容器加入到Pod中。临时容器(Ephemeral containers)是Kubernetes中的一种特殊容器,主要用途是在运行中的Pod中临时创建容器进行调试。

在大部分情况下,如果容器中出现异常故障,您可以通过kubectl exec/logs命令进入到容器进行业务调试与问题定位。但一些容器可能处于Crash状态,或者容器镜像中不包含一些调试工具,此时无法使用exec命令进行业务调试或者定位。在这些场景中,您可以使用临时容器(Ephemeral containers)进行调试,在现有Pod中注入临时容器来检查其状态并运行任意命令,对难以复现的故障进行排查。

前提条件

  • 集群版本 ≥ v1.23(确保EphemeralContainers特性默认启用)。
  • 安装kubectl并配置集群访问权限,详情请参见使用kubectl连接集群
  • 准备调试工具镜像(推荐使用预置工具包的镜像):
    • container-trouble-shooting:华为云容器团队提供的公共镜像,该镜像预置gdb、python、delve、strace、tcpdump、traceroute、telnet、nmap、bind-utils、iperf3、net-tools、ethtool、iftop、pstack、gcc、golang、perf等丰富的网络诊断工具、性能诊断以及开发环境等。

      镜像地址:swr-gallery.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

  2. 创建以上RBAC配置。

    kubectl create -f role-test.yaml

注入临时容器

  1. 执行以下命令,为Pod注入一个临时容器并进入交互式Shell:

    kubectl debug <pod-name> -it --image=swr-gallery.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.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1 --target=nginx

    您也可以通过Pod副本调试,命令如下:

    kubectl debug myapp -it --image=swr-gallery.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.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 主进程

相关文档