K8s診斷工具 kubectl debug

2022-07-25 19:12:14 字數 4433 閱讀 8676

kubectl-debug是乙個簡單的 kubectl 外掛程式, 能夠幫助你便捷地進行 kubernetes 上的 pod 排障診斷. 背後做的事情很簡單: 在執行中的 pod 上額外起乙個新容器, 並將新容器加入到目標容器的pid,network,user以及ipcnamespace 中, 這時我們就可以在新容器中直接用netstat,tcpdump這些熟悉的工具來解決問題了, 而舊容器可以保持最小化, 不需要預裝任何額外的排障工具.

kubectl-debug 包含兩部分:

kubectl-debug:命令列工具;

debug-agent:部署在k8s的node上,用於啟動關聯排錯工具容器

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

我們知道,容器本質上是帶有 cgroup 資源限制和 namespace 隔離的一組程序。因此,我們只要啟動乙個程序,並且讓這個程序加入到目標容器的各種 namespace 中,這個程序就能 「進入容器內部」(注意引號),與容器中的程序」看到」相同的根檔案系統、虛擬網絡卡、程序空間了——這也正是docker execkubectl 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命令背後是這樣的:

步驟分別是:

外掛程式查詢 apiserver:demo-pod 是否存在,所在節點是什麼

apiserver 返回 demo-pod 所在所在節點

外掛程式請求在目標節點上建立debug agentpod

kubelet 建立debug agentpod

外掛程式發現debug agent已經 ready,發起 debug 請求(長連線)

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

簡單使用(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上,會始終占用資源,對於排錯除錯頻率不高的環境造成資源浪費;

假如 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

參考文件:

容器編排工具k8s

如何實踐 1 搜尋kubunetes online kubernetes playground katacoda pod k8s最小排程單位 docker pause 二個容器 deployments 維持pod一定數量 service 解決deploytemnets內部之間的乙個負載均衡 dns解...

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...

k8s 多租戶 k8s 基礎介紹

備註 1 每乙個pod裡執行著乙個特殊的容器 pause容器,其他容器都是業務容器,這些業務容器共享pause容器的網路棧和volume 邏輯卷 掛載卷。因此他們之間的通訊和資料交換更為高效。2 k8s設計了pod物件,將每個服務程序包裝到相應的pod中,使其成為pod中執行的乙個容器 contai...