一、引言
在Kubernetes集群中,节点扩容是确保系统弹性和高可用性的关键机制。了解节点扩容的触发机制和最佳实践,对于保障业务稳定性和资源利用率至关重要。本文将深入探讨Kubernetes节点扩容的核心概念、配置方法和生产环境最佳实践。
二、SCQA分析框架
情境(Situation)
- 业务流量波动大,需要自动调整资源
- 手动扩容无法及时响应业务变化
- 需要平衡资源利用率和成本
冲突(Complication)
- 扩容不及时会导致Pod调度失败
- 过度扩容会增加成本
- 需要在响应速度和成本之间找到平衡
问题(Question)
- 节点扩容是如何触发的?
- 扩容的初始状态是什么?
- 如何配置自动扩缩容?
- 如何优化扩容策略?
答案(Answer)
- 通过Cluster Autoscaler自动触发
- 初始状态是集群运行在最小节点数
- 配置HPA/VPA和Cluster Autoscaler
- 优化扩容阈值和冷却时间
三、扩容触发机制
3.1 触发方式对比
| 触发方式 | 触发条件 | 响应速度 | 适用场景 |
|---|---|---|---|
| 自动扩容 | Pod调度失败 | 快速 | 业务高峰期 |
| 手动扩容 | 运维人员操作 | 较慢 | 计划性扩容 |
| 定时扩容 | 时间触发 | 可预测 | 周期性业务 |
3.2 自动扩容工作原理
Cluster Autoscaler工作流程:
┌─────────────────────────────────────────────────────────────────┐
│ Cluster Autoscaler工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 监控Pod状态 │
│ │ │
│ ▼ │
│ 2. 检测Pending Pod │
│ │ │
│ ▼ │
│ 3. 判断是否可调度到现有节点 │
│ │ │
│ ├── 是 → 继续监控 │
│ │ │
│ └── 否 → 触发扩容 │
│ │ │
│ ▼ │
│ 4. 计算需要新增的节点数 │
│ │ │
│ ▼ │
│ 5. 调用云提供商API创建节点 │
│ │ │
│ ▼ │
│ 6. 等待节点加入集群 │
│ │ │
│ ▼ │
│ 7. 调度Pending Pod到新节点 │
│ │
└─────────────────────────────────────────────────────────────────┘
3.3 初始状态分析
集群初始状态:
# 初始节点状态
kubectl get nodes
# 输出示例
NAME STATUS ROLES AGE VERSION
node-01 Ready worker 30d v1.28.0
node-02 Ready worker 30d v1.28.0
node-03 Ready worker 30d v1.28.0
# 初始资源使用
kubectl top nodes
# 输出示例
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node-01 700m 70% 3.5Gi 65%
node-02 680m 68% 3.2Gi 60%
node-03 720m 72% 3.8Gi 70%
四、自动扩缩容配置
4.1 Horizontal Pod Autoscaler (HPA)
基本配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 75
基于自定义指标的HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa-custom
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 3
maxReplicas: 20
metrics:
- type: Pods
pods:
metric:
name: requests-per-second
target:
type: AverageValue
averageValue: 100
4.2 Vertical Pod Autoscaler (VPA)
VPA配置:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "*"
minAllowed:
cpu: "100m"
memory: "256Mi"
maxAllowed:
cpu: "1"
memory: "2Gi"
4.3 Cluster Autoscaler
Cluster Autoscaler配置:
apiVersion: autoscaling/v1
kind: ClusterAutoscaler
metadata:
name: cluster-autoscaler
spec:
scaleDownDelayAfterAdd: 10m
scaleDownDelayAfterDelete: 10m
scaleDownDelayAfterFailure: 3m
scaleDownUnneededTime: 10m
minNodeCount: 3
maxNodeCount: 10
skipNodesWithLocalStorage: false
skipNodesWithSystemPods: true
部署Cluster Autoscaler:
# 创建ServiceAccount
kubectl create serviceaccount cluster-autoscaler -n kube-system
# 创建ClusterRoleBinding
kubectl create clusterrolebinding cluster-autoscaler \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:cluster-autoscaler
# 部署Cluster Autoscaler
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
五、扩容策略优化
5.1 阈值配置
CPU和内存阈值:
# HPA阈值配置
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU使用率超过70%触发扩容
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 75 # 内存使用率超过75%触发扩容
5.2 冷却时间配置
Cluster Autoscaler冷却时间:
spec:
scaleDownDelayAfterAdd: 10m # 扩容后10分钟内不缩容
scaleDownDelayAfterDelete: 10m # 删除节点后10分钟内不缩容
scaleDownDelayAfterFailure: 3m # 扩容失败后3分钟内不重试
scaleDownUnneededTime: 10m # 节点空闲10分钟后缩容
5.3 节点组配置
多节点组策略:
# 节点组配置示例
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: my-cluster
nodeGroups:
- name: spot-nodes
minSize: 2
maxSize: 10
instancesDistribution:
instanceTypes: ["c5.large", "c5.xlarge", "c5.2xlarge"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 3
- name: ondemand-nodes
minSize: 2
maxSize: 5
instancesDistribution:
instanceTypes: ["c5.xlarge"]
onDemandBaseCapacity: 2
onDemandPercentageAboveBaseCapacity: 100
六、监控和告警
6.1 扩容指标监控
Prometheus监控规则:
groups:
- name: cluster-autoscaler
rules:
- record: cluster_autoscaler_nodes_count
expr: count(kube_node_info)
- record: cluster_autoscaler_pending_pods
expr: sum(kube_pod_status_phase{phase="Pending"})
- record: cluster_autoscaler_node_utilization_cpu
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
- record: cluster_autoscaler_node_utilization_memory
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
告警规则:
groups:
- name: cluster-autoscaler-alerts
rules:
- alert: HighPendingPods
expr: sum(kube_pod_status_phase{phase="Pending"}) > 5
for: 5m
labels:
severity: warning
annotations:
summary: "Pending Pod数量过多"
- alert: NodeScalingFailure
expr: cluster_autoscaler_scaling_operations_total{result="error"} > 0
for: 1m
labels:
severity: critical
annotations:
summary: "节点扩容失败"
- alert: HighNodeUtilization
expr: avg(cluster_autoscaler_node_utilization_cpu) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "节点CPU使用率过高"
6.2 扩容事件追踪
查看扩容事件:
# 查看Cluster Autoscaler日志
kubectl logs -n kube-system -l app=cluster-autoscaler -f
# 查看节点事件
kubectl get events -A | grep -E "Scaling|Node"
七、最佳实践总结
7.1 配置最佳实践
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| HPA CPU阈值 | 60-70% | 平衡响应速度和稳定性 |
| HPA内存阈值 | 70-75% | 内存通常比CPU更慢释放 |
| CA最小节点数 | 根据业务需求 | 保证最小服务能力 |
| CA最大节点数 | 合理上限 | 控制成本 |
| 冷却时间 | 10-15分钟 | 避免频繁扩缩容 |
7.2 扩容策略最佳实践
1. 使用混合节点组:
- 按需节点保证稳定性
- Spot节点降低成本
2. 配置节点亲和性:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-group
operator: In
values:
- production
3. 预留资源:
# kubelet配置
--kube-reserved=cpu=100m,memory=512Mi
--system-reserved=cpu=200m,memory=1Gi
7.3 故障排查
常见问题: | 问题 | 原因 | 解决方案 | |:——|:——|:——| | Pod一直Pending | 资源不足 | 检查CA配置,手动扩容 | | 扩容失败 | 云提供商限制 | 检查配额和权限 | | 缩容不触发 | 冷却时间过长 | 调整冷却时间配置 | | 节点无法加入 | 网络问题 | 检查网络配置 |
八、总结
核心要点
- 触发机制:Cluster Autoscaler检测Pending Pod触发扩容
- 初始状态:集群运行在最小节点数,资源使用率正常
- 配置组件:HPA负责Pod水平伸缩,CA负责节点伸缩
- 优化策略:合理配置阈值和冷却时间
最佳实践清单
- ✅ 配置HPA实现Pod自动伸缩
- ✅ 部署Cluster Autoscaler实现节点自动伸缩
- ✅ 配置合理的阈值和冷却时间
- ✅ 使用混合节点组降低成本
- ✅ 建立完善的监控和告警体系
本文对应的面试题:节点扩容是怎么触发的?最开始是什么情况?
附录:工具推荐
自动扩缩容工具:
- Horizontal Pod Autoscaler:Pod水平伸缩
- Vertical Pod Autoscaler:Pod垂直伸缩
- Cluster Autoscaler:节点自动伸缩
监控工具:
- Prometheus:指标收集
- Grafana:可视化
- Alertmanager:告警管理
云提供商工具:
- AWS Auto Scaling:EC2自动扩缩容
- Azure VM Scale Sets:Azure虚拟机伸缩
- GCP Instance Groups:GCP实例组伸缩
文档信息
- 本文作者:soveran zhong
- 本文链接:https://blog.clockwingsoar.cn/2026/07/07/kubernetes-node-scaling-best-practices/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)