kubectl-debug

原理

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

原理流程图

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

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

安装部署

  • kubectl-debug安装
1
2
3
wget https://github.com/aylei/kubectl-debug/releases/download/v0.1.1/kubectl-debug_0.1.1_linux_amd64.tar.gz
tar -zxvf kubectl-debug_0.1.1_linux_amd64.tar.gz kubectl-debug
mv kubectl-debug /usr/local/bin/
  • debug-agent DaemonSet安装
1
kubectl-debug 包含两部分, 一部分是用户侧的 kubectl 插件, 另一部分是部署在所有 k8s 节点上的 agent,在 agentless 中, kubectl-debug 会在 debug 开始时创建 debug-agent Pod, 并在结束后自动清理.(默认开启agentless模式)。
1
2
3
4
5
6
7
8
9
10
11
# 如果你的kubernetes版本为v1.16或更高
kubectl apply -f https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml
# 如果你使用的是旧版本的kubernetes(<v1.16), 你需要先将apiVersion修改为extensions/v1beta1, 可以如下操作
wget https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml

sed -i '' '1s/apps\/v1/extensions\/v1beta1/g' agent_daemonset.yml
kubectl apply -f agent_daemonset.yml
# 或者使用helm安装
helm install kubectl-debug -n=debug-agent ./contrib/helm/kubectl-debug
# 使用daemonset agent模式(关闭agentless模式)
kubectl debug --agentless=false POD_NAME

用法

1
2
3
4
kubectl-debug nginx-967459485-zwm5l
# 如提示如下报错,需在node节点docker pull nicolaka/netshoot:latest 镜像
# error execute remote, Internal error occurred: error attaching to container: Error: No such image: nicolaka/netshoot:latest
# error: Internal error occurred: error attaching to container: Error: No such image: nicolaka/netshoot:latest
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。