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

  1. # install kubectl-debug
  2. export PLUGIN_VERSION=0.1.1
  3. #linux x86_64
  4. 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
  5. tar -zxvf kubectl-debug.tar.gz kubectl-debug
  6. sudo mv kubectl-debug /usr/local/bin/

2、部署debug-agent

debug-agent以daemonSet的形式部署。直接执行下面命令即可

  1. kubectl apply -f https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml

然后查看pod的状态,直到其变为running

  1. kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. debug-agent-5prws 1/1 Running 0 27d
  4. debug-agent-5qm2w 1/1 Running 1 23d
  5. debug-agent-dd7bt 1/1 Running 1 27d
  6. debug-agent-nfzqp 1/1 Running 0 27d
  7. debug-agent-wx4qp 1/1 Running 0 27d

使用

1、pod里只有一个contaienr

  1. kubectl-debug POD_NAME

2、pod里有多个container

  1. kubectl-debug POD_NAME -c CONTAINER_NAME

3、指定namespace

  1. kubectl-debug POD_NAME -n test

4、自定义排除的容器镜像

  1. 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模式。
比如:

  1. kubectl-debug POD_NAME -n NAMESPACE -a --image aylei/debug-jvm --agent-image nicolaka/netshoot:latest