叢集疑難排解
此文件關於叢集疑難排解;我們假設您已排除您的應用程式是您所遇到問題的根本原因。請參閱應用程式疑難排解指南以取得應用程式偵錯的提示。您也可以造訪疑難排解概觀文件以取得更多資訊。
如需疑難排解 kubectl,請參閱疑難排解 kubectl。
列出您的叢集
在您的叢集中偵錯的第一件事是您的節點是否都已正確註冊。
執行以下命令
kubectl get nodes
並驗證您預期看到的所有節點都存在,且它們都處於 Ready
狀態。
若要取得關於您叢集整體健康狀態的詳細資訊,您可以執行
kubectl cluster-info dump
範例:偵錯故障/無法連線的節點
有時在偵錯時,查看節點的狀態可能很有用,例如,因為您注意到在節點上執行的 Pod 的奇怪行為,或找出 Pod 無法排程到節點上的原因。如同 Pod,您可以使用 kubectl describe node
和 kubectl get node -o yaml
來檢索關於節點的詳細資訊。例如,以下是當節點故障時(與網路斷線,或 kubelet 死亡且無法重新啟動等)您會看到的內容。請注意顯示節點 NotReady 的事件,並注意 Pod 不再執行(它們在 NotReady 狀態五分鐘後被驅逐)。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-worker-1 NotReady <none> 1h v1.23.3
kubernetes-node-bols Ready <none> 1h v1.23.3
kubernetes-node-st6x Ready <none> 1h v1.23.3
kubernetes-node-unaj Ready <none> 1h v1.23.3
kubectl describe node kube-worker-1
Name: kube-worker-1
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=kube-worker-1
kubernetes.io/os=linux
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Thu, 17 Feb 2022 16:46:30 -0500
Taints: node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unreachable:NoSchedule
Unschedulable: false
Lease:
HolderIdentity: kube-worker-1
AcquireTime: <unset>
RenewTime: Thu, 17 Feb 2022 17:13:09 -0500
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Thu, 17 Feb 2022 17:09:13 -0500 Thu, 17 Feb 2022 17:09:13 -0500 WeaveIsUp Weave pod has set this
MemoryPressure Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status.
DiskPressure Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status.
PIDPressure Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status.
Ready Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status.
Addresses:
InternalIP: 192.168.0.113
Hostname: kube-worker-1
Capacity:
cpu: 2
ephemeral-storage: 15372232Ki
hugepages-2Mi: 0
memory: 2025188Ki
pods: 110
Allocatable:
cpu: 2
ephemeral-storage: 14167048988
hugepages-2Mi: 0
memory: 1922788Ki
pods: 110
System Info:
Machine ID: 9384e2927f544209b5d7b67474bbf92b
System UUID: aa829ca9-73d7-064d-9019-df07404ad448
Boot ID: 5a295a03-aaca-4340-af20-1327fa5dab5c
Kernel Version: 5.13.0-28-generic
OS Image: Ubuntu 21.10
Operating System: linux
Architecture: amd64
Container Runtime Version: containerd://1.5.9
Kubelet Version: v1.23.3
Kube-Proxy Version: v1.23.3
Non-terminated Pods: (4 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default nginx-deployment-67d4bdd6f5-cx2nz 500m (25%) 500m (25%) 128Mi (6%) 128Mi (6%) 23m
default nginx-deployment-67d4bdd6f5-w6kd7 500m (25%) 500m (25%) 128Mi (6%) 128Mi (6%) 23m
kube-system kube-proxy-dnxbz 0 (0%) 0 (0%) 0 (0%) 0 (0%) 28m
kube-system weave-net-gjxxp 100m (5%) 0 (0%) 200Mi (10%) 0 (0%) 28m
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 1100m (55%) 1 (50%)
memory 456Mi (24%) 256Mi (13%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
Events:
...
kubectl get node kube-worker-1 -o yaml
apiVersion: v1
kind: Node
metadata:
annotations:
kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.sock
node.alpha.kubernetes.io/ttl: "0"
volumes.kubernetes.io/controller-managed-attach-detach: "true"
creationTimestamp: "2022-02-17T21:46:30Z"
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
kubernetes.io/arch: amd64
kubernetes.io/hostname: kube-worker-1
kubernetes.io/os: linux
name: kube-worker-1
resourceVersion: "4026"
uid: 98efe7cb-2978-4a0b-842a-1a7bf12c05f8
spec: {}
status:
addresses:
- address: 192.168.0.113
type: InternalIP
- address: kube-worker-1
type: Hostname
allocatable:
cpu: "2"
ephemeral-storage: "14167048988"
hugepages-2Mi: "0"
memory: 1922788Ki
pods: "110"
capacity:
cpu: "2"
ephemeral-storage: 15372232Ki
hugepages-2Mi: "0"
memory: 2025188Ki
pods: "110"
conditions:
- lastHeartbeatTime: "2022-02-17T22:20:32Z"
lastTransitionTime: "2022-02-17T22:20:32Z"
message: Weave pod has set this
reason: WeaveIsUp
status: "False"
type: NetworkUnavailable
- lastHeartbeatTime: "2022-02-17T22:20:15Z"
lastTransitionTime: "2022-02-17T22:13:25Z"
message: kubelet has sufficient memory available
reason: KubeletHasSufficientMemory
status: "False"
type: MemoryPressure
- lastHeartbeatTime: "2022-02-17T22:20:15Z"
lastTransitionTime: "2022-02-17T22:13:25Z"
message: kubelet has no disk pressure
reason: KubeletHasNoDiskPressure
status: "False"
type: DiskPressure
- lastHeartbeatTime: "2022-02-17T22:20:15Z"
lastTransitionTime: "2022-02-17T22:13:25Z"
message: kubelet has sufficient PID available
reason: KubeletHasSufficientPID
status: "False"
type: PIDPressure
- lastHeartbeatTime: "2022-02-17T22:20:15Z"
lastTransitionTime: "2022-02-17T22:15:15Z"
message: kubelet is posting ready status
reason: KubeletReady
status: "True"
type: Ready
daemonEndpoints:
kubeletEndpoint:
Port: 10250
nodeInfo:
architecture: amd64
bootID: 22333234-7a6b-44d4-9ce1-67e31dc7e369
containerRuntimeVersion: containerd://1.5.9
kernelVersion: 5.13.0-28-generic
kubeProxyVersion: v1.23.3
kubeletVersion: v1.23.3
machineID: 9384e2927f544209b5d7b67474bbf92b
operatingSystem: linux
osImage: Ubuntu 21.10
systemUUID: aa829ca9-73d7-064d-9019-df07404ad448
查看日誌
目前,深入挖掘叢集需要登入相關機器。以下是相關日誌檔案的位置。在基於 systemd 的系統上,您可能需要使用 journalctl
而不是檢查日誌檔案。
控制平面節點
/var/log/kube-apiserver.log
- API 伺服器,負責提供 API/var/log/kube-scheduler.log
- 排程器,負責制定排程決策/var/log/kube-controller-manager.log
- 一個元件,執行大多數 Kubernetes 內建控制器,除了排程(kube-scheduler 處理排程)之外。
工作節點
/var/log/kubelet.log
- 來自 kubelet 的日誌,負責在節點上執行容器/var/log/kube-proxy.log
- 來自kube-proxy
的日誌,負責將流量導向服務端點
叢集故障模式
這是一個不完整的可能出錯事項列表,以及如何調整您的叢集設定以減輕問題。
促成原因
- VM(s) 關機
- 叢集內或叢集與使用者之間的網路分割
- Kubernetes 軟體中的崩潰
- 持久儲存的資料遺失或不可用(例如 GCE PD 或 AWS EBS 磁碟區)
- 操作員錯誤,例如,錯誤設定的 Kubernetes 軟體或應用程式軟體
特定情境
- API 伺服器 VM 關機或 apiserver 崩潰
- 結果
- 無法停止、更新或啟動新的 pod、服務、複寫控制器
- 現有的 pod 和服務應繼續正常運作,除非它們依賴 Kubernetes API
- 結果
- API 伺服器後端儲存遺失
- 結果
- kube-apiserver 元件無法成功啟動並變得健康
- kubelet 將無法連線到它,但將繼續執行相同的 pod 並提供相同的服務 Proxy
- 重新啟動 apiserver 之前,必須手動復原或重新建立 apiserver 狀態
- 結果
- 支援服務(節點控制器、複寫控制器管理器、排程器等)VM 關機或崩潰
- 目前這些與 apiserver 共置,它們的不可用性與 apiserver 有類似的後果
- 未來,這些也將被複寫,可能不會共置
- 它們沒有自己的持久狀態
- 個別節點(VM 或實體機器)關機
- 結果
- 該節點上的 pod 停止執行
- 結果
- 網路分割
- 結果
- 分割區 A 認為分割區 B 中的節點已關閉;分割區 B 認為 apiserver 已關閉。(假設 master VM 最終位於分割區 A 中。)
- 結果
- Kubelet 軟體故障
- 結果
- 崩潰的 kubelet 無法在節點上啟動新的 pod
- kubelet 可能會刪除 pod,也可能不會
- 節點標記為不健康
- 複寫控制器在其他地方啟動新的 pod
- 結果
- 叢集操作員錯誤
- 結果
- pod、服務等遺失
- apiserver 後端儲存遺失
- 使用者無法讀取 API
- 等等。
- 結果
緩解措施
動作:針對 IaaS VM 使用 IaaS 提供者的自動 VM 重新啟動功能
- 緩解:Apiserver VM 關機或 apiserver 崩潰
- 緩解:支援服務 VM 關機或崩潰
動作:針對具有 apiserver+etcd 的 VM 使用 IaaS 提供者可靠的儲存(例如 GCE PD 或 AWS EBS 磁碟區)
- 緩解:Apiserver 後端儲存遺失
動作:使用高可用性組態
- 緩解:控制平面節點關機或控制平面元件(排程器、API 伺服器、控制器管理器)崩潰
- 將容許一個或多個同時發生的節點或元件故障
- 緩解:API 伺服器後端儲存(即 etcd 的資料目錄)遺失
- 假設 HA(高可用性)etcd 組態
- 緩解:控制平面節點關機或控制平面元件(排程器、API 伺服器、控制器管理器)崩潰
動作:定期快照 apiserver PD/EBS 磁碟區
- 緩解:Apiserver 後端儲存遺失
- 緩解:某些操作員錯誤案例
- 緩解:某些 Kubernetes 軟體故障案例
動作:在 pod 前方使用複寫控制器與服務
- 緩解:節點關機
- 緩解:Kubelet 軟體故障
動作:應用程式(容器)設計為容許非預期的重新啟動
- 緩解:節點關機
- 緩解:Kubelet 軟體故障
下一步
- 瞭解資源指標管線中可用的指標
- 探索用於監控資源使用量的其他工具
- 使用 Node Problem Detector 來監控節點健康狀況
- 使用
kubectl debug node
來偵錯 Kubernetes 節點 - 使用
crictl
來偵錯 Kubernetes 節點 - 取得更多關於 Kubernetes 稽核 的資訊
- 使用
telepresence
來在本機端開發及偵錯服務