![為什麼安裝後伺服器重新啟動時,kubernetes 元件會進入崩潰循環退避?](https://rvso.com/image/789287/%E7%82%BA%E4%BB%80%E9%BA%BC%E5%AE%89%E8%A3%9D%E5%BE%8C%E4%BC%BA%E6%9C%8D%E5%99%A8%E9%87%8D%E6%96%B0%E5%95%9F%E5%8B%95%E6%99%82%EF%BC%8Ckubernetes%20%E5%85%83%E4%BB%B6%E6%9C%83%E9%80%B2%E5%85%A5%E5%B4%A9%E6%BD%B0%E5%BE%AA%E7%92%B0%E9%80%80%E9%81%BF%EF%BC%9F.png)
我已經使用 kubeadm 在單節點伺服器上安裝了 kubernetes。我發現透過按特定順序執行安裝,一切都會正常運作。這包括主要的 kube 系統元件(api 伺服器、代理程式、調度程序、etcd 等),它們首先啟動並運行(coredns 除外),然後使用 helm 安裝 cilium CNI 插件進行網路連接(導致 coredns 工作)。
安裝完成後,我就可以成功安裝和使用其他服務,例如 NVIDIA 的 GPU Operator 和 kubeflow。然而,在執行重新啟動後,我發現不同的元件進入崩潰循環退避狀態。
我認為這與不同資源的初始化順序以及各種不同超時的長度有關。有沒有辦法設定不同元件在啟動時啟動的順序?或可能配置適當的預設逾時或 pod 崩潰行為?
這裡可能會發生骨牌效應,其中一個組件崩潰導致另一個組件崩潰,然後導致回退時間不斷增加,最終導致群集無響應。
有關更多信息,我保留了 iptables 規則,以便在啟動時應用它們。此外,通常所有主要元件都會進入運行狀態,除了 kube 調度程式處於崩潰循環退避狀態。然後其他組件也開始崩潰,這似乎是多米諾骨牌效應。
到目前為止,我主要嘗試更新 /etc/kubernetes/manifests/ 下的清單文件,以對 kubernetes 系統 Pod 使用各種不同的超時和 failureThresholds,但是,這似乎並沒有解決問題。我可以透過先停止 kubelet 服務並銷毀所有正在運行的 pod/容器,然後重新啟動 kubelet 來複製伺服器重新啟動行為。
答案1
事實證明這個問題和這個GitHub中描述的問題非常相似問題。基本上沒有為我的containerd CRI運行時指定SystemdCgroup = true
選項(這是nvidia
容器運作時而不是預設的runc
),pod 會不斷莫名其妙地崩潰。發生這種情況是由於違反了 cgroup 的單寫入器規則,因為管理 cgroup 的預設驅動程式cgroupfs
不能與systemd
.您可以看到文件了解更多詳情。它還包括 CRI 插件配置的完整規範這裡。
其他相關的容器資源有: