暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubectl debug 调试运行中的pod

云原生内经 2021-07-05
3092

背景

  • 如何判断运行中的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论