背景
如何判断运行中的pod是否能解析某域名,pod里的服务端口是否被监听? pod里面如何可以使用Telnet、curl、nslookup、tcpdump、netstat、htop等常规调试问题的工具呢? 在使用kubectl debug时,如何跳过docker.io拉取镜像限制呢? 在不改变原来pod的基础上,除了kubectl logs和describe pod方式之外,还有别的方法?
如何使用 kubectl debug
kubectl debug原理:在运行中的 Pod 上额外起一个新容器, 并将新容器加入到目标容器的 pid, network, user 以及 ipc namespace 中。
可以在Mac、linux和window安装该插件,具体方法可以参考官网内容。本文从linux环境下安装该插件为例说明。
下载、解压、拷贝至/usr/local/bin目录下,即kubectl debug指令即可使用,(由于国内环境的原因不能下载可以单独联系我)。
wget https://github.com/aylei/kubectl-debug/releases/download/v0.1.1/kubectl-debug_0.1.1_linux_amd64.tar.gz tar -xzvf kubectl-debug_0.1.1_linux_amd64.tar.gz mv kubectl-debug usr/local/bin 除了安装kubectl debug外,还需要安装debug agent,有两种安装模式,推荐使用agentless模式,只是偶尔pod需要调试。本文以agentless模式说明。
由于docker.io镜像限制,此处debug-agent和netshoot镜像已存放阿里镜像仓库下。 也可以在离线环境下使用,请参考文档中第三篇文档。 daemon-set模式,agent pod预先部署在所有node上,会始终占用资源,对于排错调试频率不高的环境造成资源浪费; agentless模式,kubectl-debug执行命令后,才创建agent pod和排错工具容器,并在退出后删除工具容器和agent pod。由于每次执行都要重新拉起agent,启动会比daemon-set模式稍慢。使用-a, --agentless开启agentless模式。
kubectl debug 具体实践
前提kubectl-debug已拷贝至/usr/local/bin下。
kubectl-debug -h查看有哪些功能。
一般使用方法,执行下面指令等同于进入pod里面,可以执行网络工具nslookup/netstat/telnet等操作。
kubectl debug POD_NAME -n NAMESPACE -a --agent-image registry.cn-hangzhou.aliyuncs.com/lilin123/debug-agent:v0.1.1 --image registry.cn-hangzhou.aliyuncs.com/lilin123/netshoot:v0.1.1 假如 Pod 处于 CrashLookBackoff 状态无法连接, 可以复制一个完全相同的 Pod 来进行诊断
kubectl debug POD_NAME -n NAMESPACE --fork -a --agent-image registry.cn-hangzhou.aliyuncs.com/lilin123/debug-agent:v0.1.1 --image registry.cn-hangzhou.aliyuncs.com/lilin123/netshoot:v0.1.1 排错init-container:
kubectl debug demo-pod --container=init-pod -a --agent-image registry.cn-hangzhou.aliyuncs.com/lilin123/debug-agent:v0.1.1 --image registry.cn-hangzhou.aliyuncs.com/lilin123/netshoot:v0.1.1 对于没有安装yum ,apt-get 的镜像可以挂载 centos 的sidecar 镜像, 再进行操作, 如安装 redis 命令, 再使用redis-cli 命令。
kubectl-debug POD_NAME -n NAMESPACE --image centos -a --agent-image registry.cn-hangzhou.aliyuncs.com/lilin123/debug-agent:v0.1.1 --image registry.cn-hangzhou.aliyuncs.com/lilin123/netshoot:v0.1.1
[root@lin ~]# kubectl get pod -test | grep test
test test-85c46f4965-p846z 1/1 Running 0 2d22h
kubectl debug test-85c46f4965-p846z -n test -a --agent-image registry.cn-hangzhou.aliyuncs.com/lilin123/debug-agent:v0.1.1 --image registry.cn-hangzhou.aliyuncs.com/lilin123/netshoot:v0.1.1
Agent Pod info: [Name:debug-agent-pod-90ed20b2-b62a-11eb-9eed-080027dccc59, Namespace:default, Image:registry.cn-hangzhou.aliyuncs.com/lilin123/debug-agent:v0.1.1, HostPort:10027, ContainerPort:10027]
Waiting for pod debug-agent-pod-90ed20b2-b62a-11eb-9eed-080027dccc59 to run...
container created, open tty...
bash-5.1# telnet
BusyBox v1.33.0 () multi-call binary.
Usage: telnet [-a] [-l USER] HOST [PORT]
Connect to telnet server
-a Automatic login with $USER variable
-l USER Automatic login as USER
bash-5.1# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 rocketmq-operator-758bb9c774-v7kkl:51046 kubernetes.default.svc.cluster.local:https ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
bash-5.1# nslookup
> exit
bash-5.1# tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
参考文档
Kubernetes官网描述的kubectl-debug kubectl-debug官网 离线环境下使用参考
文章转载自云原生内经,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




