kubectl-debug是K8S中Pod的诊断工具,它通过启动一个排错工具容器,并将其加入到目标业务容器的pid, network, user 以及 ipc namespace 中,这时我们就可以在新容器中直接用 netstat, tcpdump 这些熟悉的工具来解决问题了, 而业务容器可以保持最小化, 不需要预装任何额外的排障工具。
其主要有两部分组成:
- kubectl-debug工具,是一个二进制文件
- debug-agent,部署在node节点,用于启动关联的排错容器
部署
1、部署kubectl-debug工具
由于其仅仅是一个二进制文件,所以部署很简单,不过由于集群是通过kubeconfig进行授权访问的,所以我们将kubectl-debug工具部署在master上。
项目地址:https://github.com/aylei/kubectl-debug
# install kubectl-debug
export PLUGIN_VERSION=0.1.1
#linux x86_64
curl -Lo kubectl-debug.tar.gz https://github.com/aylei/kubectl-debug/releases/download/v${PLUGIN_VERSION}/kubectl-debug_${PLUGIN_VERSION}_linux_amd64.tar.gz
tar -zxvf kubectl-debug.tar.gz kubectl-debug
sudo mv kubectl-debug /usr/local/bin/
2、部署debug-agent
debug-agent以daemonSet的形式部署。直接执行下面命令即可
kubectl apply -f https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml
然后查看pod的状态,直到其变为running
kubectl get pod
NAME READY STATUS RESTARTS AGE
debug-agent-5prws 1/1 Running 0 27d
debug-agent-5qm2w 1/1 Running 1 23d
debug-agent-dd7bt 1/1 Running 1 27d
debug-agent-nfzqp 1/1 Running 0 27d
debug-agent-wx4qp 1/1 Running 0 27d
使用
1、pod里只有一个contaienr
kubectl-debug POD_NAME
2、pod里有多个container
kubectl-debug POD_NAME -c CONTAINER_NAME
3、指定namespace
kubectl-debug POD_NAME -n test
4、自定义排除的容器镜像
kubectl-debug POD_NAME --image aylei/debug-jvm
更多可以通过kubectl-debug -h
来查看帮助文档。
上面的debug-agent是部署在集群中的,这种方式对于调试频率不高的环境容易造成资源浪费,所以debug-agent还提供一种agentless的模式,kubectl-debug执行命令后,才创建agent pod和排错工具容器,并在退出后删除工具容器和agent pod。由于每次执行都要重新拉起agent,启动会比daemon-set模式稍慢。使用-a, —agentless开启agentless模式。
比如:
kubectl-debug POD_NAME -n NAMESPACE -a --image aylei/debug-jvm --agent-image nicolaka/netshoot:latest