排錯概覽

Kubernetes 集群以及應用排錯的一般方法,主要包括

你可以使用 kube-copilot 藉助 OpenAI 來幫你自動排查集群中的問題並通過自然語言的方式與集群進行交互。

在排錯過程中,kubectl 是最重要的工具,通常也是定位錯誤的起點。這裏也列出一些常用的命令,在後續的各種排錯過程中都會經常用到。

查看 Pod 狀態以及運行節點

kubectl get pods -o wide
kubectl -n kube-system get pods -o wide

查看 Pod 事件

kubectl describe pod <pod-name>

查看 Node 狀態

kubectl get nodes
kubectl describe node <node-name>

kube-apiserver 日誌

PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

以上命令操作假設控制平面以 Kubernetes 靜態 Pod 的形式來運行。如果 kube-apiserver 是用 systemd 管理的,則需要登錄到 master 節點上,然後使用 journalctl -u kube-apiserver 查看其日誌。

kube-controller-manager 日誌

PODNAME=$(kubectl -n kube-system get pod -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

以上命令操作假設控制平面以 Kubernetes 靜態 Pod 的形式來運行。如果 kube-controller-manager 是用 systemd 管理的,則需要登錄到 master 節點上,然後使用 journalctl -u kube-controller-manager 查看其日誌。

kube-scheduler 日誌

PODNAME=$(kubectl -n kube-system get pod -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100

以上命令操作假設控制平面以 Kubernetes 靜態 Pod 的形式來運行。如果 kube-scheduler 是用 systemd 管理的,則需要登錄到 master 節點上,然後使用 journalctl -u kube-scheduler 查看其日誌。

kube-dns 日誌

kube-dns 通常以 Addon 的方式部署,每個 Pod 包含三個容器,最關鍵的是 kubedns 容器的日誌:

PODNAME=$(kubectl -n kube-system get pod -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME -c kubedns

Kubelet 日誌

Kubelet 通常以 systemd 管理。查看 Kubelet 日誌需要首先 SSH 登錄到 Node 上,推薦使用 kubectl-node-shell 插件而不是爲每個節點分配公網 IP 地址。比如:

curl -LO https://github.com/kvaps/kubectl-node-shell/raw/master/kubectl-node_shell
chmod +x ./kubectl-node_shell
sudo mv ./kubectl-node_shell /usr/local/bin/kubectl-node_shell

kubectl node-shell <node>
journalctl -l -u kubelet

Kube-proxy 日誌

Kube-proxy 通常以 DaemonSet 的方式部署,可以直接用 kubectl 查詢其日誌

$ kubectl -n kube-system get pod -l component=kube-proxy
NAME               READY     STATUS    RESTARTS   AGE
kube-proxy-42zpn   1/1       Running   0          1d
kube-proxy-7gd4p   1/1       Running   0          3d
kube-proxy-87dbs   1/1       Running   0          4d
$ kubectl -n kube-system logs kube-proxy-42zpn

參考文檔

Last updated