K8s診斷工具:kubectl-debug


kubectl-debug 是一個簡單的 kubectl 插件, 能夠幫助你便捷地進行 Kubernetes 上的 Pod 排障診斷. 背后做的事情很簡單: 在運行中的 Pod 上額外起一個新容器, 並將新容器加入到目標容器的 pidnetworkuser 以及 ipc namespace 中, 這時我們就可以在新容器中直接用 netstattcpdump 這些熟悉的工具來解決問題了, 而舊容器可以保持最小化, 不需要預裝任何額外的排障工具.

kubectl-debug 包含兩部分:
kubectl-debug:命令行工具;
debug-agent:部署在K8s的node上,用於啟動關聯排錯工具容器

我們先不着急進入 Quick Start 環節。 kubectl-debug 本身非常簡單,因此只要理解了它的工作原理,你就能完全掌握這個工具,並且還能用它做 debug 之外的事情。

我們知道,容器本質上是帶有 cgroup 資源限制和 namespace 隔離的一組進程。因此,我們只要啟動一個進程,並且讓這個進程加入到目標容器的各種 namespace 中,這個進程就能 “進入容器內部”(注意引號),與容器中的進程”看到”相同的根文件系統、虛擬網卡、進程空間了——這也正是 docker exec 和 kubectl exec 等命令的運行方式。

現在的狀況是,我們不僅要 “進入容器內部”,還希望帶一套工具集進去幫忙排查問題。那么,想要高效管理一套工具集,又要可以跨平台,最好的辦法就是把工具本身都打包在一個容器鏡像當中。 接下來,我們只需要通過這個”工具鏡像”啟動容器,再指定這個容器加入目標容器的的各種 namespace,自然就實現了 “攜帶一套工具集進入容器內部”。事實上,使用 docker-cli 就可以實現這個操作:

export TARGET_ID=666666666

# 加入目標容器的 network, pid 以及 ipc namespace

docker run -it --network=container:$TARGET_ID --pid=container:$TARGET_ID --ipc=container:$TARGET_ID busybox

這就是 kubectl-debug 的出發點: 用工具容器來診斷業務容器 。背后的設計思路和 sidecar 等模式是一致的:每個容器只做一件事情。

具體到實現上,一條 kubectl debug <target-pod> 命令背后是這樣的:

 

 

步驟分別是:

  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 建立連接

接下來,客戶端就可以開始通過 5,6 這兩個連接開始 debug 操作。操作結束后,Debug Agent 清理 Debug 容器,插件清理 Debug Agent,一次 Debug 完成。效果如下圖

安裝相應的工具

export PLUGIN_VERSION=0.1.1
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

下載完之后就可以開始使用 debug 插件:

簡單使用(K8s v1.15.0):

kubectl 1.12.0 或更高的版本, 可以直接使用:
kubectl debug -h

kubectl 從 1.12 版本之后開始支持從 PATH 中自動發現插件。1.12 版本之前的 kubectl 不支持這種插件機制,但也可以通過命令名 kubectl-debug 直接調用。

假如安裝了 debug-agent 的 daemonset, 可以略去 --agentless 來加快啟動速度
之后的命令里會略去 --agentless
kubectl debug POD_NAME --agentless

debug-agent 兩種運行方式:
daemon-set模式,agent pod預先部署在所有node上,會始終占用資源,對於排錯調試頻率不高的環境造成資源浪費;

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

agentless模式,kubectl-debug執行命令后,才創建agent pod和排錯工具容器,並在退出后刪除工具容器和agent pod。由於每次執行都要重新拉起agent,啟動會比daemon-set模式稍慢。
使用-a, --agentless開啟agentless模式:

假如 Pod 處於 CrashLookBackoff 狀態無法連接, 可以復制一個完全相同的 Pod 來進行診斷
kubectl debug POD_NAME --fork

假如 Node 沒有公網 IP 或無法直接訪問(防火牆等原因), 請使用 port-forward 模式
kubectl debug POD_NAME --port-forward --daemonset-ns=kube-system --daemonset-name=debug-agent

進階使用:
排錯init-container:
kubectl debug demo-pod --container=init-pod
排錯crash pod:
kubectl debug POD_NAME --fork

離線配置:
--image:可自定義排錯工具容器鏡像,改為私有鏡像倉庫,默認為nicolaka/netshoot:latest
--agent-image:在agentless模式下,自定義debug-agent鏡像,默認為aylei/debug-agent:latest。在daemon-set模式下,直接將debug-agent daemonset pod template修改為私有倉庫鏡像即可
配置文件:
~/.kube/debug-config,通過配置文件修改默認參數,免去使用命令時設置flag。
# debug agent listening port(outside container)
default to 10027
agentPort: 10027

whether using agentless mode
default to false
agentless: true
namespace of debug-agent pod, used in agentless mode
default to 'default'
agentPodNamespace: default
prefix of debug-agent pod, used in agentless mode
default to 'debug-agent-pod'
agentPodNamePrefix: debug-agent-pod
image of debug-agent pod, used in agentless mode
default to 'aylei/debug-agent:latest'
agentImage: aylei/debug-agent:latest

daemonset name of the debug-agent, used in port-forward
default to 'debug-agent'
debugAgentDaemonset: debug-agent
daemonset namespace of the debug-agent, used in port-forwad
default to 'default'
debugAgentNamespace: kube-system
whether using port-forward when connecting debug-agent
default false
portForward: true
image of the debug container
default as showed
image: nicolaka/netshoot:latest
start command of the debug container
default ['bash']
command:
- '/bin/bash'
- '-l'

對於沒有安裝yum ,apt-get 的鏡像可以掛載 centos 的sidecar 鏡像, 再進行操作, 如安裝 redis 命令, 再使用redis-cli 命令
kubectl-debug POD_NAME --image centos --port-forward --daemonset-ns=default --daemonset-name=debug-agent
[root@mall-order-provider-6b8665fd67-w74lb /]# yum install -y redis

參考文檔:
https://aleiwu.com/post/kubectl-debug-intro/

https://github.com/aylei/kubectl-debug/blob/master/docs/zh-cn.md

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM