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等)。
- container-trouble-shooting:华为云容器团队提供的公共镜像,该镜像预置gdb、python、delve、strace、tcpdump、traceroute、telnet、nmap、bind-utils、iperf3、net-tools、ethtool、iftop、pstack、gcc、golang、perf等丰富的网络诊断工具、性能诊断以及开发环境等。
权限配置(RBAC)
为调试用户或服务账号配置最小权限(只允许修改Pod的临时容器),操作步骤如下:
- 创建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。
- 创建以上RBAC配置。
kubectl create -f role-test.yaml
注入临时容器
- 执行以下命令,为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. / #
- 开始进行调试操作,使用各种调试工具来检查容器的状态。典型场景示例请参见典型问题诊断场景。
典型问题诊断场景
- 网络问题排查
场景:Pod 无法访问外部服务或内部服务。
- 使用调试工具镜像检查网络。
kubectl debug myapp -it --image=swr-gallery.swr-pro.myhuaweicloud.com/library/container-trouble-shooting:v1
- 在临时容器中执行命令检查网络。
tcpdump -i eth0 port 80 # 抓取 HTTP 流量 netstat -tuln # 检查端口监听状态 dig my-service.namespace.svc.cluster.local # 解析服务 DNS curl -v http://backend:8080 # 测试服务连通性
- 使用调试工具镜像检查网络。
- 文件系统检查
场景:主容器日志丢失或配置文件异常。
- 创建临时容器,挂载主容器的文件系统(共享volumeMounts)。
kubectl debug myapp -it --image=busybox --target=nginx
- 检查文件。
ls /var/log/nginx # 查看日志目录 cat /etc/nginx/nginx.conf # 验证配置文件内容
- 创建临时容器,挂载主容器的文件系统(共享volumeMounts)。
- 进程/性能分析
场景:CPU或内存使用率异常,使用htop、strace、perf等工具。
- 创建临时容器,共享目标容器的进程命名空间(使用--target 参数)。
kubectl debug myapp -it --image=alpine --target=nginx
- 在临时容器中执行命令检查进程。
# 查看进程树 ps aux # 监控资源使用 top -H # 跟踪系统调用 strace -p 1 # PID 1 为 Nginx 主进程
- 创建临时容器,共享目标容器的进程命名空间(使用--target 参数)。