节点扩缩容
节点扩缩容是 Kubernetes 集群管理的重要功能,允许根据工作负载需求动态调整集群节点数量。这包括节点的手动扩缩容和自动扩缩容两种方式。
节点扩缩容架构
graph TB
subgraph "K8s_集群"
subgraph "Master_节点"
API[API_Server]
SCHED[Scheduler]
CM[Controller_Manager]
end
subgraph "Worker_节点组"
NODE1[Worker_Node_1]
NODE2[Worker_Node_2]
NODE3[Worker_Node_3]
NODEn[Worker_Node_N]
end
subgraph "扩缩容控制器"
HPA[Horizontal_Pod_Autoscaler]
VPA[Vertical_Pod_Autoscaler]
CA[Cluster_Autoscaler]
end
end
API --> SCHED
API --> CM
API --> NODE1
API --> NODE2
API --> NODE3
API --> NODEn
HPA --> NODE1
CA --> NODE1
CA --> NODE2
CA --> NODE3
CA --> NODEn
扩缩容类型
手动扩缩容
通过 kubectl 命令或云平台控制台手动调整节点数量
自动扩缩容
通过 Cluster Autoscaler 自动调整节点数量
手动节点扩缩容
手动扩缩容适用于可预测的工作负载变化或计划性扩容。
# 查看当前节点
kubectl get nodes
# 标记节点不可调度(缩容前)
kubectl cordon <node-name>
# 驱逐节点上的 Pod
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 删除节点
kubectl delete node <node-name>
# 添加新节点(使用 kubeadm)
kubeadm join <control-plane-host>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
自动节点扩缩容 (Cluster Autoscaler)
Cluster Autoscaler 根据 Pod 调度需求自动调整集群节点数量。
# Cluster Autoscaler 部署示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: cluster-autoscaler
template:
metadata:
labels:
app: cluster-autoscaler
spec:
containers:
- name: cluster-autoscaler
image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.21.0
command:
- ./cluster-autoscaler
- --v=4
- --stderrthreshold=info
- --cloud-provider=aws
- --skip-nodes-with-local-storage=false
- --expander=least-waste
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<CLUSTER-NAME>
扩缩容策略对比
| 策略 | 适用场景 | 优势 | 挑战 |
|---|---|---|---|
| 手动扩缩容 | 计划性扩容、维护操作 | 精确控制、可预测 | 需要人工干预、响应慢 |
| 自动扩缩容 | 动态工作负载、突发流量 | 自动响应、节省成本 | 配置复杂、可能过度扩容 |
| 定时扩缩容 | 规律性变化的工作负载 | 成本效益高 | 需要准确预测工作负载模式 |
节点扩缩容最佳实践
扩容前准备
- 检查集群资源使用情况
- 确认新节点类型和配置
- 验证节点就绪时间
- 规划 Pod 调度策略
缩容注意事项
- 确保 Pod 可以安全迁移
- 检查节点污点和容忍
- 验证 Pod 亲和性设置
- 监控应用健康状况