叢集疑難排解

偵錯常見的叢集問題。

此文件關於叢集疑難排解;我們假設您已排除您的應用程式是您所遇到問題的根本原因。請參閱應用程式疑難排解指南以取得應用程式偵錯的提示。您也可以造訪疑難排解概觀文件以取得更多資訊。

如需疑難排解 kubectl,請參閱疑難排解 kubectl

列出您的叢集

在您的叢集中偵錯的第一件事是您的節點是否都已正確註冊。

執行以下命令

kubectl get nodes

並驗證您預期看到的所有節點都存在,且它們都處於 Ready 狀態。

若要取得關於您叢集整體健康狀態的詳細資訊,您可以執行

kubectl cluster-info dump

範例:偵錯故障/無法連線的節點

有時在偵錯時,查看節點的狀態可能很有用,例如,因為您注意到在節點上執行的 Pod 的奇怪行為,或找出 Pod 無法排程到節點上的原因。如同 Pod,您可以使用 kubectl describe nodekubectl 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 組態
  • 動作:定期快照 apiserver PD/EBS 磁碟區

    • 緩解:Apiserver 後端儲存遺失
    • 緩解:某些操作員錯誤案例
    • 緩解:某些 Kubernetes 軟體故障案例
  • 動作:在 pod 前方使用複寫控制器與服務

    • 緩解:節點關機
    • 緩解:Kubelet 軟體故障
  • 動作:應用程式(容器)設計為容許非預期的重新啟動

    • 緩解:節點關機
    • 緩解:Kubelet 軟體故障

下一步

上次修改時間為 2024 年 3 月 7 日下午 4:54 PST:AppArmor v1.30 文件更新 (4f11f83a45)