Kubernetes 部署十大錯(cuò)誤:原因、修復(fù)方法及技巧
當(dāng)你的Kubernetes部署失敗時(shí),感覺就像大海撈針。一個(gè)小小的錯(cuò)誤——缺少字段、鏡像名稱輸入錯(cuò)誤或內(nèi)存不足——都可能導(dǎo)致一切停頓。這時(shí)候你會(huì)驚訝地發(fā)現(xiàn),高達(dá) 80% 的 Kubernetes 安全和穩(wěn)定性問題的根本原因都是配置錯(cuò)誤。
了解 Kubernetes 部署錯(cuò)誤發(fā)生的原因以及如何進(jìn)行故障排除。無論你遇到的是 CrashLoopBackOff、Pod 卡住還是 YAML ,我都會(huì)為你講解 10 個(gè)常見問題,并為您提供一些簡(jiǎn)單的預(yù)防方法。
文章概要
Kubernetes 部署錯(cuò)誤發(fā)生的原因:3 個(gè)關(guān)鍵原因
Kubernetes 部署十大錯(cuò)誤及故障排除方法
通用故障排除框架
預(yù)防未來錯(cuò)誤的專業(yè)技巧
總結(jié):提前解決 Kubernetes 部署問題
Kubernetes 部署錯(cuò)誤發(fā)生的原因:3 個(gè)關(guān)鍵原因
Kubernetes 可以幫助您在容器中運(yùn)行應(yīng)用程序,但即使是設(shè)置過程中的小錯(cuò)誤也可能導(dǎo)致大問題。大多數(shù)問題的發(fā)生是因?yàn)榕渲貌徽_或集群資源不足。讓我們來看看部署失敗的幾個(gè)常見原因。
1、聲明式配置出錯(cuò)
Kubernetes 使用YAML 文件來定義應(yīng)用程序的外觀。這被稱為聲明式配置。但是,如果該文件中出現(xiàn)哪怕是一個(gè)小錯(cuò)誤(例如拼寫錯(cuò)誤、縮進(jìn)錯(cuò)誤或缺少字段),您的應(yīng)用程序都將無法正確部署。
此外,有時(shí)文件是有效的 YAML,但對(duì) Kubernetes 無效。例如,您可能忘記設(shè)置副本數(shù)量,或者指向尚不存在的服務(wù)。這些小錯(cuò)誤可能很難發(fā)現(xiàn),但一旦發(fā)現(xiàn)就很容易修復(fù)。
2、圖像和資源限制
容器鏡像是 Kubernetes 運(yùn)行的應(yīng)用程序。如果鏡像名稱錯(cuò)誤或未推送到鏡像倉庫,Kubernetes 就無法拉取鏡像,您的應(yīng)用程序也無法啟動(dòng)。另一個(gè)常見問題是未為您的Pod設(shè)置足夠的 CPU 或內(nèi)存。如果 Pod 請(qǐng)求的資源超過可用資源,Kubernetes 可能會(huì)延遲它或?qū)⑵浔3衷凇按幚怼睜顟B(tài)。
3、節(jié)點(diǎn)和集群級(jí)問題
有時(shí)問題不在于您的應(yīng)用,而在于集群本身。如果節(jié)點(diǎn)已滿、離線或出現(xiàn)問題,您的應(yīng)用可能無處可運(yùn)行。集群的網(wǎng)絡(luò)或存儲(chǔ)設(shè)置也可能存在問題。例如,Pod 可能無法連接到其他服務(wù),或者由于存儲(chǔ)不可用而崩潰。
Kubernetes 部署十大錯(cuò)誤及故障排除方法
當(dāng)Kubernetes 部署出現(xiàn)問題時(shí),一開始可能會(huì)讓人感到困惑。但很多錯(cuò)誤很常見,而且原因明確。以下列出了 10 個(gè)最常見的錯(cuò)誤,并介紹了相應(yīng)的解決方法。
1、CrashLoopBackOff
此錯(cuò)誤意味著 Pod 啟動(dòng)后崩潰,然后反復(fù)嘗試重啟。通常情況下,容器內(nèi)的應(yīng)用程序啟動(dòng)后立即失敗時(shí)就會(huì)發(fā)生這種情況。
如何排除故障:
- 運(yùn)行kubectl logs <pod-name>來查看應(yīng)用程序崩潰的原因。
- 檢查您的啟動(dòng)命令或環(huán)境變量。
- 確保所有必需的文件、服務(wù)或依賴項(xiàng)均可用。
2、ImagePullBackOff / ErrImagePull
當(dāng) Kubernetes 無法下載你的容器鏡像時(shí),就會(huì)出現(xiàn)這些錯(cuò)誤。這可能是因?yàn)殓R像名稱錯(cuò)誤、鏡像倉庫需要登錄或鏡像不存在。
如何排除故障:
- 檢查 YAML 文件中的圖像名稱和標(biāo)簽。
- 確保圖像已推送到容器注冊(cè)表。
- 如果是私人注冊(cè)表,請(qǐng)?zhí)砑佑行У膱D像拉取機(jī)密。
3、OOMKilled
OOM 代表內(nèi)存不足。此錯(cuò)誤表示您的容器使用的內(nèi)存超出了允許的上限,因此已被系統(tǒng)關(guān)閉。
如何排除故障:
- 增加部署文件中的內(nèi)存限制。
- 優(yōu)化您的應(yīng)用程序以使用更少的內(nèi)存。
- 使用kubectl describe pod <pod-name>檢查內(nèi)存限制和使用情況。
4、CreateContainerConfigError
此錯(cuò)誤表示您的 Pod 設(shè)置存在錯(cuò)誤。可能是 Secret、配置映射或卷設(shè)置錯(cuò)誤。
如何排除故障:
- 使用kubectl describe pod <pod-name>查看詳細(xì)的錯(cuò)誤消息。
- 檢查YAML中是否引用了機(jī)密、配置映射或卷。
- 確保路徑和鍵正確。
5、節(jié)點(diǎn)未就緒
此錯(cuò)誤表示集群中的某個(gè)節(jié)點(diǎn)無法運(yùn)行 Pod。該節(jié)點(diǎn)可能已關(guān)閉或斷開連接。
如何排除故障:
- 使用kubectl get nodes檢查節(jié)點(diǎn)狀態(tài)。
- 查看kubectl describe node <node-name>了解更多信息。
- 根據(jù)問題重新啟動(dòng)或修復(fù)節(jié)點(diǎn)。
6、Pod 卡在 Pending 狀態(tài)
處于“Pending”狀態(tài)的 Pod 尚未啟動(dòng)。這通常意味著資源(CPU 或內(nèi)存)不足,或者卷不可用。
如何排除故障:
- 運(yùn)行kubectl describe pod <pod-name>來找出它待處理的原因。
- 檢查您的集群是否有足夠的可用資源。
- 確保存儲(chǔ)卷或節(jié)點(diǎn)選擇器正確。
7、調(diào)度失敗
此錯(cuò)誤表示 Kubernetes 找不到符合 Pod 要求的節(jié)點(diǎn)。它通常與資源限制或調(diào)度規(guī)則有關(guān)。
如何排除故障:
- 使用kubectl describe pod <pod-name>查看調(diào)度詳細(xì)信息。
- 減少 pod 規(guī)范中的 CPU 或內(nèi)存請(qǐng)求。
- 檢查您是否正在使用任何可能阻止調(diào)度的節(jié)點(diǎn)選擇器或污點(diǎn)。
8、容器無法運(yùn)行
這意味著容器根本啟動(dòng)失敗。可能是因?yàn)槿肟邳c(diǎn)命令錯(cuò)誤,或者容器沒有所需的權(quán)限。
如何排除故障:
- 使用kubectl logs <pod-name>或 describe pod 查看錯(cuò)誤。
- 確保 YAML 中的命令和參數(shù)正確。
- 檢查是否有丟失的文件、損壞的權(quán)限或所需的訪問權(quán)限。
9、退出代碼 1 / 125
這些退出代碼表示您的應(yīng)用啟動(dòng)后立即失敗。代碼 1 通常表示一般錯(cuò)誤。代碼 125 可能表示容器命令在應(yīng)用運(yùn)行之前就失敗了。
如何排除故障:
- 使用kubectl logs <pod-name>查看錯(cuò)誤輸出。
- 仔細(xì)檢查您的輸入命令、環(huán)境變量和依賴項(xiàng)。
- 嘗試使用 docker run 在本地運(yùn)行該鏡像來測(cè)試它。
10、處于初始化/等待循環(huán)的 Pod
有時(shí),Pod 會(huì)停留在“Init”或“Waiting”狀態(tài)太久。這是因?yàn)?Init 容器或主容器無法正常啟動(dòng)。
如何排除故障:
- 使用kubectl describe pod <pod-name>來檢查是什么阻礙了事情的發(fā)生。
- 確保初始化容器成功完成。
- 檢查圖像名稱、卷掛載和啟動(dòng)腳本。
通用故障排除框架
當(dāng) Kubernetes 出現(xiàn)問題時(shí),遵循循序漸進(jìn)的方法會(huì)很有幫助。與其猜測(cè),不如使用 Kubernetes 內(nèi)置的工具來找出問題所在。
以下是指導(dǎo)您進(jìn)行故障排除的簡(jiǎn)單框架:
Step | What it helps with | Tool or command |
kubectl describe | See pod status, events and error messages | kubectl describe pod <pod-name> |
Check events and logs | Understand what Kubernetes is doing and app behavior | kubectl get events, kubectl logs |
Dry run | Catch YAML errors before they affect the cluster | kubectl apply –dry-run=client |
Resource monitoring | Identify memory / CPU problems | kubectl top pod or dashboard tools |
Health probes | Ensure apps are working and ready to receive traffic | Liveness and readiness probes in YAML |
1、kubectl describe
kubectl describe命令可以全面分析 Pod、節(jié)點(diǎn)或其他資源的運(yùn)行情況。它會(huì)顯示當(dāng)前狀態(tài)、任何錯(cuò)誤消息以及相關(guān)事件。這應(yīng)該是您獲取問題線索的第一站。
2、檢查事件和日志
事件會(huì)告訴你 Kubernetes 一直在嘗試做什么,例如調(diào)度 Pod 或拉取鏡像。日志會(huì)顯示你的應(yīng)用或容器的實(shí)際操作。使用kubectl get events可以查看全局,使用kubectl logs <pod-name>可以查看容器內(nèi)部情況。
3、使用 Dry Run 驗(yàn)證 YAML
YAML 文件中的小錯(cuò)誤或格式錯(cuò)誤可能會(huì)導(dǎo)致大問題。在應(yīng)用配置之前,請(qǐng)使用kubectl apply –dry-run=client -f <file>.yaml檢查配置。這有助于盡早發(fā)現(xiàn)錯(cuò)誤,而無需更改集群中的任何內(nèi)容。
4、監(jiān)控資源使用情況
使用kubectl top或指標(biāo)儀表板等工具檢查 Pod 的CPU 和內(nèi)存使用情況。如果 Pod 資源不足(或請(qǐng)求過多),它們可能會(huì)崩潰、卡住或被系統(tǒng)終止。
5、使用探測(cè)和健康檢查
存活和就緒探測(cè)可幫助 Kubernetes 了解您的應(yīng)用何時(shí)處于健康狀態(tài)并準(zhǔn)備好處理流量。如果缺少這些探測(cè)或設(shè)置不正確,Pod 可能會(huì)頻繁重啟或在就緒之前接收流量。添加適當(dāng)?shù)慕】禉z查可以讓您的應(yīng)用更加穩(wěn)定。
預(yù)防未來錯(cuò)誤的專業(yè)技巧
修復(fù)常見的 Kubernetes 問題后,下一步就是防止它們?cè)俅伟l(fā)生。養(yǎng)成一些好習(xí)慣,可以大大有助于確保部署順利進(jìn)行,避免壓力。
1、自動(dòng)化 Linting 和驗(yàn)證
在部署之前,使用工具檢查 YAML 文件中是否存在錯(cuò)誤。Linter 可以發(fā)現(xiàn)字段缺失、格式錯(cuò)誤或無效值。在CI/CD 流水線中自動(dòng)執(zhí)行此步驟,有助于您在問題影響生產(chǎn)環(huán)境之前及早發(fā)現(xiàn)它們。
用于 YAML 代碼檢查和驗(yàn)證的有用工具:
- Kubeval
- kube-linter
- Datree
- kubectl –dry-run
2、明智地使用資源請(qǐng)求和限制
始終為容器設(shè)置 CPU 和內(nèi)存請(qǐng)求及限制。這有助于 Kubernetes 正確調(diào)度您的 Pod,并保護(hù)集群免受單個(gè) Pod 使用過多資源的影響。但不要猜測(cè)——從小處著手,并根據(jù)實(shí)際使用情況進(jìn)行調(diào)整。
設(shè)置資源請(qǐng)求和限制的提示:
- 從較小的默認(rèn)值開始(例如,100m CPU,128Mi 內(nèi)存)并監(jiān)視使用情況。
- 使用kubectl top pod或 metrics dashboards 查看實(shí)際資源消耗。
- 設(shè)置請(qǐng)求(所需的最小值)和限制(允許的最大值)。
- 避免將限制設(shè)置得太低,因?yàn)檫@可能會(huì)導(dǎo)致您的應(yīng)用崩潰或重啟。
3、實(shí)施可觀察性工具
添加工具,讓您實(shí)時(shí)查看集群的運(yùn)行情況。儀表板和監(jiān)控解決方案可幫助您更快地發(fā)現(xiàn)問題,并更輕松地了解整體性能。
Kubernetes 的熱門可觀察性工具:
- Prometheus + Grafana
- Kube 狀態(tài)指標(biāo)
- Loki 用于日志聚合
- Jaeger 用于追蹤
- Datadog、New Relic或 Dynatrace 提供一體化監(jiān)控
總結(jié):提前解決 Kubernetes 部署問題
Kubernetes 中的部署錯(cuò)誤會(huì)降低團(tuán)隊(duì)效率、浪費(fèi)資源并導(dǎo)致不必要的停機(jī)。因此,了解常見問題并知道如何修復(fù)或預(yù)防這些問題,對(duì)于任何使用容器和集群的人來說都是一項(xiàng)寶貴的技能。
通過使用能夠及早發(fā)現(xiàn)問題的工具、設(shè)置智能資源限制并密切關(guān)注環(huán)境,您可以提前避免大多數(shù)問題。在清理舊部署或損壞的部署時(shí),以正確的方式進(jìn)行同樣重要。
參考資料
- https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
- https://lumigo.io/kubernetes-troubleshooting/kubernetes-imagepullbackoff/
- https://lumigo.io/kubernetes-troubleshooting/kubernetes-oomkilled-error-how-to-fix-and-tips-for-preventing-it/
- https://sysdig.com/blog/kubernetes-createcontainerconfigerror-createcontainererror/
- https://lumigo.io/kubernetes-troubleshooting/kubernetes-node-not-ready-error-and-how-to-fix-it/
- https://kubernetes.io/docs/tasks/debug/debug-application/debug-pods/
- https://www.kubernet.dev/resolving-kubernetes-failedscheduling-errors-a-comprehensive-guide/
- https://kubernetes.io/docs/tasks/debug/debug-application/determine-reason-pod-failure/
- https://komodor.com/learn/exit-codes-in-containers-and-kubernetes-the-complete-guide/
- https://kubernetes.io/docs/tasks/debug/debug-application/debug-init-containers/http://
作者丨Sunny Yadav
來源丨網(wǎng)址:https://thenewstack.io/top-10-kubernetes-deployment-errors-causes-and-fixes-and-tips/
























