游乐游手机版
首页/AI教程/文章详情

Kubernetes网络排错工具kubectl-debug使用指南

时间:2026-08-15 14:00
一 背景容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。 在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查

一 背景

容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。 在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查问题,效率很低。需要一款k8s排障工具帮助诊断目标容器,kubectl-debug就是一款(github.com/aylei/kubec…): **通过启动一个安装了各种排障工具的容器,来帮助诊断目标容器的利器 。

二 概述

2.1 工作原理

容器本质上是带有 cgroup 资源限制和 namespace 隔离的一组进程。因此,我们只要启动一个进程,并且让这个进程加入到目标容器的各种 namespace 中,这个进程就能 “进入容器内部”(注意引号),与容器中的进程”看到”相同的根文件系统、虚拟网卡、进程空间了——这也正是 docker execkubectl exec 等命令的运行方式。

眼下的问题其实很直接:不只是要“进入容器内部”,还得顺手把一整套排障工具带进去,真正把问题查清楚。要想让这套工具便于管理,同时还能兼顾跨平台使用,把工具统一封装进一个容器镜像里,通常是更稳妥的做法。接下来要做的也不复杂——通过这个“工具镜像”启动一个容器,再让它加入目标容器对应的各类 namespace,就等于把“一整套工具集”一并带进了容器内部。实际上,这件事用 docker-cli 就能完成:

代码语言:bash

复制

export TARGET_ID=666666666# 加入目标容器的 network, pid 以及 ipc namespacedocker run -it --network=container:$TARGET_ID --pid=container:$TARGET_ID --ipc=container:$TARGET_ID busybox

2.2 流程图详解

2.2.1 流程图

这就是 kubectl-debug 的出发点: 用工具容器来诊断业务容器 。背后的设计思路和 sidecar 等模式是一致的:每个容器只做一件事情。

具体到实现上,一条 kubectl debug 命令背后是这样的:

2.2.2 流程详解

插件查询 ApiServer:demo-pod 是否存在,所在节点是什么ApiServer 返回 demo-pod 所在所在节点插件请求在目标节点上创建 Debug Agent PodKubelet 创建 Debug Agent Pod插件发现 Debug Agent 已经 Ready,发起 debug 请求(长连接)Debug Agent 收到 debug 请求,创建 Debug 容器并加入目标容器的各个 Namespace 中,创建完成后,与 Debug 容器的 tty 建立连接

接下来,客户端就可以开始通过 5,6 这两个连接开始 debug 操作。操作结束后,Debug Agent 清理 Debug 容器,插件清理 Debug Agent,一次 Debug 完成。效果如下图:

三 安装部署

3.1 kubectl-debug安装

3.1.1 mac安装

代码语言:bash

复制

# brew安装brew install aylei/tap/kubectl-debug# 二进制安装export PLUGIN_VERSION=0.1.1curl -Lo kubectl-debug.tar.gz https://github.com/aylei/kubectl-debug/releases/download/v${PLUGIN_VERSION}/kubectl-debug_${PLUGIN_VERSION}_darwin_amd64.tar.gztar -zxvf kubectl-debug.tar.gz kubectl-debugsudo mv kubectl-debug /usr/local/bin/

3.1.2 Linux安装

代码语言:bash

复制

export PLUGIN_VERSION=0.1.1# linux x86_64curl -Lo kubectl-debug.tar.gz https://github.com/aylei/kubectl-debug/releases/download/v${PLUGIN_VERSION}/kubectl-debug_${PLUGIN_VERSION}_linux_amd64.tar.gztar -zxvf kubectl-debug.tar.gz kubectl-debugsudo mv kubectl-debug /usr/local/bin/

3.2 debug-agent DaemonSet安装

kubectl-debug 包含两部分, 一部分是用户侧的 kubectl 插件, 另一部分是部署在所有 k8s 节点上的 agent(用于启动"新容器", 同时也作为 SPDY 连接的中继). 在 agentless 中, kubectl-debug 会在 debug 开始时创建 debug-agent Pod, 并在结束后自动清理.(默认开启agentless模式)

agentless 虽然方便, 但会让 debug 的启动速度显著下降, 你可以通过预先安装 debug-agent 的 DaemonSet 并配合 --agentless=false 参数来使用 agent 模式, 加快启动速度:

代码语言:bash

复制

# 如果你的kubernetes版本为v1.16或更高kubectl apply -f https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml# 如果你使用的是旧版本的kubernetes(

四 使用

代码语言:bash

复制

kubectl debug -h老版本的 kubectl 无法自动发现插件, 需要直接调用 binarykubect-debug POD_NAME假如安装了 debug-agent 的 daemonset, 可以略去 --agentless 来加快启动速度之后的命令里会略去 --agentlesskubectl debug POD_NAME --agentless假如 Pod 处于 CrashLookBackoff 状态无法连接, 可以复制一个完全相同的 Pod 来进行诊断kubectl debug POD_NAME --fork假如 Node 没有公网 IP 或无法直接访问(防火墙等原因), 请使用 port-forward 模式kubectl debug POD_NAME --port-forward --daemonset-ns=kube-system --daemonset-name=debug-agent

4.1 使用agentless模式

使用agentless模式,无需在node节点安装pod,但是每次都需要拉取镜像,排错较慢,但是比较干净,不在集群内部安装debug-agent

代码语言:yaml

复制

[root@master01 kubectl-debug]# kubectl debug --agentless=true centos-778d877549-7r5h8 -n anchnet-devops-devAgent Pod info: [Name:debug-agent-pod-44e763d0-edad-11ea-bbaf-5254f5694cb5, Namespace:default, Image:aylei/debug-agent:latest, HostPort:10027, ContainerPort:10027]Waiting for pod debug-agent-pod-44e763d0-edad-11ea-bbaf-5254f5694cb5 to run...pulling image nicolaka/netshoot:latest... latest: Pulling from nicolaka/netshootDigest: sha256:04786602e5a9463f40da65aea06fe5a825425c7df53b307daa21f828cfe40bf8Status: Image is up to date for nicolaka/netshoot:lateststarting debug container...container created, open tty...bash-5.0# netstat -lntup

4.2 使用其他方法排错

运行在k8s中的应用遇到问题的时候,除了利用kubectl-debug进入容器,也可以使用利用nsenter进入容器网络名称空间内,利用tcpdump进行抓包分析。

确定需要查看的pod运行在那台宿主机节点,之后登录该宿主机节点排查网络问题通过pod找到容器,通过容器找到运行在宿主机上pid,之后利用nsenter -n —target $pid进入到容器的网络名称空间中,就可以运用宿主机的工具来查看pod内的网络情况。

可以使用以下脚本,在运行pod的宿主机进行注册函数,然后进行排查pod网络情况。

代码语言:go

复制

function netcheck() { set -eu ns=${2-"default"} pod=`kubectl -n $ns describe pod $1 | grep -A10 "^Containers:" | grep -Eo 'docker://.*$' | head -n 1 | sed 's/docker://(.*)$/1/'` pid=`docker inspect -f {{.State.Pid}} $pod` echo "entering pod netns for $ns/$1" cmd="nsenter -n --target $pid" echo $cmd $cmd}

接下来就可以直接用这个脚本来做测试了。

代码语言:yaml

复制

[root@node01 ~]# kubectlget poNAMEREADY STATUSRESTARTS AGEnginx-98f85fbb8-ql2gv 1/1 Running 229d# 注册函数[root@node01 ~]# function netcheck() {>set -eu>ns=${2-"default"}>pod=`kubectl -n $ns describe pod $1 | grep -A10 "^Containers:" | grep -Eo 'docker://.*$' | head -n 1 | sed 's/docker://(.*)$/1/'`>pid=`docker inspect -f {{.State.Pid}} $pod`>echo "entering pod netns for $ns/$1">cmd="nsenter -n --target $pid">echo $cmd>$cmd> }# 进入容器网络名称空间[root@node01 ~]# netcheck nginx-98f85fbb8-ql2gv entering pod netns for default/nginx-98f85fbb8-ql2gvnsenter -n --target 4536# 通过工具查看网络情况。[root@node01 ~]# ip a1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever3: eth0@if12: mtu 1500 qdisc noqueue state UP link/ether ba:0e:65:c4:bb:1c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.233.82.89/32 scope global eth0 valid_lft forever preferred_lft forever4: tunl0@NONE: mtu 1480 qdisc noop state DOWN qlen 1link/ipip 0.0.0.0 brd 0.0.0.0[root@node01 ~]# ss -tnlState Recv-Q Send-Q Local Address:PortPeer Address:PortLISTEN0128*:80 *:*LISTEN0128 :::80:::*

五 注意事项

如果使用agentless模式,需要修改debug-agent安装中配置运行kubectl-debug 如果出现找不到pod,需要制定-n 目标pod的名称空间

六 参考链接

aleiwu.com/post/kubect…github.com/aylei/kubec…segmentfault.com/a/119000002…
来源:https://cloud.tencent.com.cn/developer/article/2725240
上一篇OctaFuse 2.4.0统一接入DashScope的ASR与TTS语音能力 下一篇Kubernetes配置热更新实践:Reloader自动重载方案
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CAD零基础入门教程:坐标输入、图层管理与基础绘图命令
AI教程 · 2026-09-01

CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

本文面向CAD零基础学习者,系统讲解坐标输入、图层管理与基础绘图命令的核心用法。通过分步实操与常见问题排查,帮助新手建立精确绘图习惯,掌握规范出图的基础能力。

CAD从入门到项目交付:绘图、标注、图块与实战工作流
AI教程 · 2026-09-01

CAD从入门到项目交付:绘图、标注、图块与实战工作流

掌握CAD的核心在于建立“画得准、标得清、复用快、交付稳”的工作流。本文提供从环境设置、高频命令组合、标注规范、图块标准化到项目分阶段交付的完整路径,帮助初学者避免常见返工陷阱,独立完成可检查、可复用、可打印的工程图纸。

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤
AI教程 · 2026-09-01

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

本文详细解析 Claude Code 登录前的账号类型区分方法,涵盖个人订阅、Teams 席位与企业 Enterprise 席位的授权路径差异。提供终端登录命令、环境变量排查及常见异常处理步骤,帮助用户快速完成正确授权并避免登录路径混淆。

Claude Code 文件修改前的权限模式配置与命令审批指南
AI教程 · 2026-09-01

Claude Code 文件修改前的权限模式配置与命令审批指南

本文详细介绍Claude Code在修改文件前的权限模式配置方法,包括defaultMode可选值、permissions allow与deny规则设置、多层级配置文件管理以及 status验证技巧,帮助开发者安全高效地使用AI编程助手。

Claude Code接入VS Code后先测扩展和终端命令
AI教程 · 2026-09-01

Claude Code接入VS Code后先测扩展和终端命令

在VS Code中接入Claude Code后,建议优先验证扩展面板与集成终端两条入口。本文提供标准检查顺序、关键命令与常见故障排查路径,帮助你快速确认环境就绪,避免后续开发受阻。