K8s中Pod處于Pending狀態(tài)的八種原因分析
在生產(chǎn)環(huán)境中遇到Pod卡在Pending狀態(tài),就像外賣小哥找不到配送地址一樣讓人焦慮。作為踩坑無(wú)數(shù)的老司機(jī),今天帶大家拆解這個(gè)經(jīng)典問(wèn)題的排查思路,附贈(zèng)真實(shí)戰(zhàn)場(chǎng)經(jīng)驗(yàn)。(配圖:一個(gè)卡在加載狀態(tài)的Pod圖標(biāo))
一、資源不足:最經(jīng)典的"堵車"場(chǎng)景
典型癥狀:kubectl describe顯示"0/3 nodes are available: 3 Insufficient cpu, 2 Insufficient memory"
深層原因:
- 節(jié)點(diǎn)資源耗盡(真實(shí)案例:某次促銷活動(dòng)忘記擴(kuò)容,節(jié)點(diǎn)CPU利用率達(dá)98%)
- Pod資源請(qǐng)求過(guò)高(常見(jiàn)于新人配置requests=limits)
排查武器庫(kù):
kubectl top nodes # 查看節(jié)點(diǎn)資源水位 kubectl describe node <節(jié)點(diǎn)名> | grep -A 10 Allocated # 查看具體分配情況
生存指南:
- 緊急擴(kuò)容:
kubectl scale deploy/<名稱> --replicas=0
先止血 - 合理配置:遵循黃金法則 - requests=limits的80%
- 自動(dòng)擴(kuò)縮容:安裝cluster-autoscaler實(shí)現(xiàn)節(jié)點(diǎn)自動(dòng)伸縮
二、調(diào)度約束:K8S版的"落花有意流水無(wú)情"
高階踩坑現(xiàn)場(chǎng):
- nodeSelector選了不存在的標(biāo)簽
- 親和性設(shè)置過(guò)于嚴(yán)格(反例:必須調(diào)度到SSD+GPU節(jié)點(diǎn))
- 節(jié)點(diǎn)污點(diǎn)未配置容忍(生產(chǎn)環(huán)境常見(jiàn):專用GPU節(jié)點(diǎn))
診斷秘籍:
kubectl get nodes --show-labels | grep <關(guān)鍵標(biāo)簽> kubectl describe pod | grep -i 'affinity' # 查看親和性配置
避坑姿勢(shì):
tolerations: # 污點(diǎn)容忍配置示例 - key: "gpu" operator: "Exists" effect: "NoSchedule"
三、存儲(chǔ)依賴:等待永久的約會(huì)
經(jīng)典連環(huán)坑:
- PVC找不到匹配的PV(尤其StatefulSet場(chǎng)景)
- StorageClass配置錯(cuò)誤(測(cè)試環(huán)境用local-path,生產(chǎn)用ceph)
- 云盤配額不足(AWS EBS類型選錯(cuò))
排查三連擊:
kubectl get pvc kubectl describe storageclass aws ec2 describe-volumes --region <區(qū)域> # 云平臺(tái)檢查
實(shí)戰(zhàn)技巧:
- 預(yù)創(chuàng)建PV池應(yīng)對(duì)突發(fā)流量
- 使用動(dòng)態(tài)供應(yīng)StorageClass
- 監(jiān)控云平臺(tái)配額:
aws service-quotas get-service-quota --service-code ec2 --quota-code L-XXXX
四、鏡像問(wèn)題:你以為的下載不是下載
隱蔽陷阱:
- 私有倉(cāng)庫(kù)認(rèn)證失?。╧ubelet報(bào)x509證書錯(cuò)誤)
- 鏡像tag不存在(latest標(biāo)簽被覆蓋)
- 國(guó)內(nèi)拉取gcr.io鏡像超時(shí)
診斷組合拳:
kubectl describe pod | grep -i 'image' docker pull <鏡像地址> # 在節(jié)點(diǎn)上手動(dòng)測(cè)試 journalctl -u kubelet | grep -i 'image' # 查看kubelet日志
救命方案:
imagePullSecrets: # 私有倉(cāng)庫(kù)認(rèn)證配置 - name: regcred
五、配額限制:看不見(jiàn)的天花板
多維限制矩陣:
- Namespace資源配額(ResourceQuota)
- Service配額(AWS的NLB數(shù)量限制)
- RBAC權(quán)限不足(ServiceAccount無(wú)create權(quán)限)
排查工具箱:
kubectl describe quota -n <命名空間> aws service-quotas list-service-quotas --service-code ec2 # 檢查云配額
破局之道:
apiVersion: v1 kind: ResourceQuota metadata: name: team-quota spec: hard: requests.cpu: "20" requests.memory: 100Gi
六、網(wǎng)絡(luò)暗礁:沉默的殺手
高危場(chǎng)景:
- 網(wǎng)絡(luò)插件異常(Calico的IP池耗盡)
- 安全組配置錯(cuò)誤(AWS節(jié)點(diǎn)間端口未開放)
- CNI配置沖突(多網(wǎng)絡(luò)插件混用)
診斷七傷拳:
kubectl get pods -n kube-system # 檢查網(wǎng)絡(luò)組件狀態(tài) calicoctl ipam show --show-blocks # Calico IP地址檢查 telnet <節(jié)點(diǎn)IP> 10250 # 檢查節(jié)點(diǎn)間通信
終極防御:
- 定期清理IP池:
calicoctl ipam release --ip=<廢棄IP>
- 使用網(wǎng)絡(luò)策略白名單
- 啟用NetworkPolicy審計(jì)
七、系統(tǒng)級(jí)異常:底層的暴擊
魔鬼藏在細(xì)節(jié)里:
- kube-scheduler進(jìn)程崩潰
- 節(jié)點(diǎn)磁盤inode耗盡
- 內(nèi)核版本不兼容(尤其使用ebpf網(wǎng)絡(luò)插件時(shí))
深度檢測(cè):
systemctl status kube-scheduler # 調(diào)度器狀態(tài) df -i # 檢查inode使用 uname -r # 核對(duì)內(nèi)核版本
生存法則:
- 部署kube-scheduler的多實(shí)例
- 啟用節(jié)點(diǎn)自動(dòng)修復(fù)功能
- 定期內(nèi)核漏洞掃描
八、冷門陷阱:那些年我們踩過(guò)的神坑
奇葩問(wèn)題集錦:
- 時(shí)區(qū)設(shè)置導(dǎo)致cronjob異常
- 節(jié)點(diǎn)時(shí)間不同步引發(fā)證書驗(yàn)證失敗
- kube-proxy的conntrack表溢出
診斷冷兵器:
chronyc tracking # 檢查時(shí)間同步 cat /proc/sys/net/netfilter/nf_conntrack_max # 連接追蹤表大小
防御矩陣:
- 全集群NTP時(shí)間同步
- 調(diào)整conntrack參數(shù):
sysctl -w net.netfilter.nf_conntrack_max=1048576
終極排查路線圖(思維導(dǎo)圖見(jiàn)文末)
- 看事件:
kubectl describe pod <名稱>
- 查調(diào)度:
kubectl get events --field-selector involvedObject.kind=Pod
- 核配置:
kubectl get pod <名稱> -o yaml
- 檢資源:
kubectl top
系列命令 - 追日志:kubelet和容器運(yùn)行時(shí)日志
- 測(cè)網(wǎng)絡(luò):節(jié)點(diǎn)間通信測(cè)試
- 審配額:云平臺(tái)和K8S雙重檢查
武器庫(kù)升級(jí):
- 可視化工具:Lens、K9s
- 日志系統(tǒng):ELK+Filebeat
- 監(jiān)控體系:Prometheus+Alertmanager+Grafana黃金組合
寫給開發(fā)者的生存建議:
- 給每個(gè)Pod配置合理的requests/limits
- 重要服務(wù)添加PreStopHook實(shí)現(xiàn)優(yōu)雅終止
- 生產(chǎn)環(huán)境Always指定鏡像tag
- 使用PDB(PodDisruptionBudget)防止意外驅(qū)逐
- 定期進(jìn)行混沌工程演練
記住:Pending不是錯(cuò)誤,而是K8S在說(shuō)"我盡力了,但..."。掌握這套排查心法,下次遇到問(wèn)題時(shí)你就能淡定地說(shuō):"讓子彈飛一會(huì)兒,我先看看調(diào)度日志。"
到此這篇關(guān)于K8s中Pod處于Pending狀態(tài)的八種原因的文章就介紹到這了,更多相關(guān)K8s中Pod處于Pending狀態(tài)的八種原因內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
K8S部署Kafka界面管理工具(kafkamanager)方法詳解
這篇文章主要介紹了K8S部署Kafka界面管理工具(kafkamanager)方法詳解,需要的朋友可以參考下2022-01-01常見(jiàn)Kubernetes kubectl命令使用詳解
這篇文章主要為大家介紹了常見(jiàn)Kubernetes kubectl命令使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)
這篇文章主要給大家介紹了關(guān)于阿里云kubernetes查找鏡像中jar包的方法,也就是在docker查看鏡像中的jar,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09安裝ingress-nginx遇到的一些坑實(shí)戰(zhàn)記錄
ingress是kubernetes集群對(duì)外暴露服務(wù)的一種方式,下面這篇文章主要給大家介紹了關(guān)于安裝ingress-nginx遇到的一些坑,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11