Kubernetes节点组无法扩容:Pod达上限但资源未耗尽
我来帮你拆解这个问题:你遇到的核心矛盾是单节点的Pod数量已经达到了Kubernetes的调度上限,但集群自动扩缩容(Cluster Autoscaler)并没有触发节点扩容,哪怕CPU、内存资源还很充足。咱们一步步理清楚原因和解决办法:
为什么会出现这个情况?
从你给出的信息里能找到几个关键线索:
- 节点Pod配额已用尽:你的
t3.medium节点的Allocatable.pods值是17,而当前运行中的Pod刚好是17个(看kubectl get po -A的Running列表),新的test-db-dev/db01-0自然挤不进去,所以报0/1 nodes are available: 1 Too many pods。这个Pod数量配额是Kubernetes根据实例类型、CNI插件等预设的,和CPU/内存是独立的资源维度。 - Cluster Autoscaler的触发逻辑:默认情况下,CA是基于Pod的CPU/内存资源请求来判断是否需要扩容的。但你大部分Pod都没设置资源请求(看节点资源分配统计里的Requests都是0),加上这次的Pending Pod大概率也没设置资源请求,CA可能没把这种"Pod数量满了"的情况识别为需要扩容的触发条件。
- CA运行或配置问题:虽然你设置了节点组
max_size=2,但如果CA本身没正常运行、权限不足,或者没正确识别你的节点组标签,也会导致扩容失败。
解决步骤
1. 先确认Pending Pod的资源配置
先看看这个卡住的Pod有没有设置资源请求:
kubectl describe po db01-0 -n test-db-dev
如果它的Resources.Requests下CPU和内存都是0,那CA确实可能忽略这个扩容信号——因为CA默认优先响应有明确资源需求的Pod。
2. 检查Cluster Autoscaler的运行状态
去kube-system命名空间看看CA的Pod是否正常运行,有没有报错日志:
kubectl logs -f deployment/cluster-autoscaler -n kube-system
常见的问题比如:CA没有访问EC2 API的权限、节点组的标签和CA配置的匹配不上,或者CA版本太旧不支持识别"Too many pods"的调度错误。
3. 调整CA配置(如果需要)
如果你的业务场景就是有很多无资源请求的Pod,需要CA在Pod数量满时触发扩容,可以修改CA的启动参数,添加或调整:
--ignore-pod-requests=false
另外确保CA的启动参数里包含了正确的节点组标签选择器,比如针对EKS节点组,通常会有--node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<你的集群名>这样的配置,保证CA能管理你的test_nodes-dev节点组。
4. 手动验证扩容逻辑
如果暂时找不到CA的问题,可以先手动扩容节点组到2个节点,验证Pod是否能正常调度:
# 用eksctl的例子,如果你用其他工具(比如terraform)对应调整即可 eksctl scale nodegroup --cluster=<你的集群名> --name=test_nodes-dev --nodes=2
如果手动扩容后Pod能正常Running,说明问题确实出在CA的自动触发逻辑上,而不是节点组本身的配置问题。
额外小贴士
- 每个EC2实例类型的Pod上限是有官方推荐值的,t3.medium默认是17,你可以通过修改Kubelet的
--max-pods参数调高,但不建议超过官方上限,避免节点因Pod过多出现资源过载。 - 尽量给所有Pod设置合理的CPU/内存请求和限制,这不仅能让CA更准确地触发扩容,还能避免单个Pod耗尽节点资源影响其他服务。
内容的提问来源于stack exchange,提问作者user630702

