【K8s任務】調試運行中的 Pod


參考:https://kubernetes.io/zh/docs/tasks/debug-application-cluster/debug-running-pod/

檢查 Pod 的日志

首先,查看受到影響的容器的日志:

kubectl logs ${POD_NAME} ${CONTAINER_NAME}

如果你的容器之前崩潰過,你可以通過下面命令訪問之前容器的崩潰日志:

kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}

使用容器 exec 進行調試

如果 容器鏡像 包含調試程序, 比如從 Linux 和 Windows 操作系統基礎鏡像構建的鏡像,你可以使用 kubectl exec 命令 在特定的容器中運行一些命令:

kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}

說明: -c ${CONTAINER_NAME} 是可選擇的。如果Pod中僅包含一個容器,就可以忽略它。

例如,要查看正在運行的 Cassandra pod中的日志,可以運行:

kubectl exec cassandra -- cat /var/log/cassandra/system.log

你可以在 kubectl exec 命令后面加上 -i 和 -t 來運行一個連接到你的終端的 Shell,比如:

kubectl exec -it cassandra -- sh

使用臨時調試容器來進行調試

FEATURE STATE: Kubernetes v1.18 [alpha]

當由於容器崩潰或容器鏡像不包含調試程序(例如無發行版鏡像等) 而導致 kubectl exec 無法運行時,臨時容器對於排除交互式故障很有用。 從 'v1.18' 版本開始,'kubectl' 有一個可以創建用於調試的臨時容器的 alpha 命令。

使用臨時容器來調試的例子

說明: 本示例需要你的集群已經開啟 EphemeralContainers 特性門控, kubectl 版本為 v1.18 或者更高。

你可以使用 kubectl debug 命令來給正在運行中的 Pod 增加一個臨時容器。 首先,像示例一樣創建一個 pod:

kubectl run ephemeral-demo --image=k8s.gcr.io/pause:3.1 --restart=Never

說明: 本節示例中使用 pause 容器鏡像,因為它不包含調試程序,但是這個方法適用於所有容器鏡像。

如果你嘗試使用 kubectl exec 來創建一個 shell,你將會看到一個錯誤,因為這個容器鏡像中沒有 shell。

kubectl exec -it ephemeral-demo -- sh

OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown

你可以改為使用 kubectl debug 添加調試容器。 如果你指定 -i 或者 --interactive 參數,kubectl 將自動掛接到臨時容器的控制台。

kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo

Defaulting debug container name to debugger-8xzrl.
If you don't see a command prompt, try pressing enter.
/ #

此命令添加一個新的 busybox 容器並將其掛接到該容器。--target 參數指定另一個容器的進程命名空間。 這是必需的,因為 kubectl run 不能在它創建的pod中啟用 共享進程命名空間。

說明: 容器運行時必須支持--target參數。 如果不支持,則臨時容器可能不會啟動,或者可能使用隔離的進程命名空間啟動。

你可以使用 kubectl describe 查看新創建的臨時容器的狀態:

kubectl describe pod ephemeral-demo

...
Ephemeral Containers:
  debugger-8xzrl:
    Container ID:   docker://b888f9adfd15bd5739fefaa39e1df4dd3c617b9902082b1cfdc29c4028ffb2eb
    Image:          busybox
    Image ID:       docker-pullable://busybox@sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 12 Feb 2020 14:25:42 +0100
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:         <none>
...

使用 kubectl delete 來移除已經結束掉的 Pod:

kubectl delete pod ephemeral-demo

在節點上通過 shell 來調試

如果這些方法都不起作用,你可以找到運行 Pod 的主機並通過 SSH 進入該主機, 但是如果使用 Kubernetes API 中的工具,則通常不需要這樣做。 因此,如果你發現自己需要使用 ssh 進入主機,請在GitHub 上提交功能請求, 以描述你的用例以及這些工具不足的原因。


免責聲明!

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



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