Azure Kubernetes Service Pod Pending:CPU资源不足问题排查求助
核心问题定位
你的Standard_D2ds_v5节点单台是2vCPU,AKS会预留约0.4vCPU给系统组件,单节点实际可分配给Pod的CPU约1.6vCPU。每个带Istio Sidecar的Pod包含2个容器,按你设置的LimitRange默认请求250m/容器计算,单Pod总CPU请求是500m。40个Pod的总请求是20vCPU,而当前5个节点的总可分配CPU仅约8vCPU,CPU请求总和远超集群总可用资源,这就是导致Pod Pending的根本原因。
排查步骤
确认节点资源分配状态
执行命令查看每个节点的可分配资源和已分配资源:kubectl describe nodes重点关注
Allocatable和Allocated resources部分,能直观看到CPU资源已被占满。统计所有Pod的CPU请求总和
用以下命令列出所有Pod的CPU请求:kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name}{"\t"}{.spec.containers[*].resources.requests.cpu}{"\n"}{end}'手动统计总和,对比节点总可分配CPU,验证是否超量。
检查节点自动扩缩容状态
你的Linux节点池最大可扩到6个实例,当前只有4个在提供服务?执行以下命令确认扩缩容是否正常触发:# 查看HPA状态 kubectl get hpa -A # 查看节点池配置与状态 az aks nodepool list --resource-group <你的资源组名> --cluster-name <你的AKS集群名> -o table排查是否因为扩缩容阈值未达标(比如CPU使用率未到触发值)或延迟导致未扩容。
解决方案
降低Pod的CPU请求配置
修改LimitRange,降低默认CPU请求/限制,比如调整为100m请求、300m限制,这样单Pod总请求降到200m,40个Pod总请求8vCPU,适配5个节点的容量:apiVersion: v1 kind: LimitRange metadata: name: cpu-limit-range namespace: kube-system spec: limits: - default: cpu: "300m" defaultRequest: cpu: "100m" type: Container --- apiVersion: v1 kind: LimitRange metadata: name: cpu-limit-range namespace: default spec: limits: - default: cpu: "300m" defaultRequest: cpu: "100m" type: Container同时手动更新现有Deployment的资源配置,确保新启动的Pod生效。
强制扩容节点池到最大实例数
如果自动扩缩容未触发,手动扩容Linux节点池到6个实例,增加总可用CPU资源:az aks nodepool scale --resource-group <资源组名> --cluster-name <AKS集群名> --name <Linux节点池名> --node-count 6单独配置Istio Sidecar资源
避免Sidecar和业务容器共用默认资源配置,通过Istio的ConfigMap单独设置Sidecar的资源请求/限制:apiVersion: v1 kind: ConfigMap metadata: name: istio-sidecar-injector namespace: istio-system data: config: | policy: enabled templates: - sidecar injectors: sidecar: injectedAnnotations: sidecar.istio.io/inject: "true" template: | spec: containers: - name: istio-proxy resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "300m" memory: "256Mi"
后续优化建议
- 配置HPA(水平Pod自动扩缩容)和Cluster Autoscaler的告警规则,提前感知资源不足风险。
- 定期清理闲置Pod或调整低优先级Pod的资源配置,释放集群资源。
内容的提问来源于stack exchange,提问作者Nayden Van

