在K8S中,如何扩容和缩容K8s集群?
在 Kubernetes 中,“扩容和缩容”通常涉及两个层面:Pod 层面(调整应用副本数)和节点层面(调整集群节点数量)。两者的操作方式和目标不同,以下分别说明:
一、Pod 层面的扩缩容(调整应用副本数)
通过 Kubernetes 控制器(如 Deployment、StatefulSet、ReplicaSet 等)管理的 Pod,可以手动或自动调整副本数量,以应对流量变化。
1. 手动扩缩容(适用于临时调整)
通过 kubectl scale
命令或直接修改控制器的 replicas
字段,手动指定副本数。
-
命令行方式:
针对 Deployment 调整副本数(示例):# 扩容到 5 个副本 kubectl scale deployment <deployment-name> --replicas=5 -n <namespace> # 缩容到 2 个副本 kubectl scale deployment <deployment-name> --replicas=2 -n <namespace>
同样适用于 StatefulSet、ReplicaSet 等:
kubectl scale statefulset <statefulset-name> --replicas=3 -n <namespace>
-
修改配置文件方式:
编辑控制器的 YAML 配置,修改spec.replicas
字段后应用:kubectl edit deployment <deployment-name> -n <namespace> # 在编辑器中修改 spec.replicas: 5,保存退出后自动生效
2. 自动扩缩容(HPA,适用于动态流量)
通过 Horizontal Pod Autoscaler(HPA) 实现基于指标(如 CPU 使用率、内存使用率、自定义指标)的自动扩缩容。
-
前提:
集群需部署 metrics-server(提供资源指标采集),可通过以下命令检查:kubectl get pods -n kube-system | grep metrics-server
若未部署,需先安装(例如使用官方 YAML):
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
-
创建 HPA 配置:
示例:为 Deployment 配置 HPA,基于 CPU 使用率自动扩缩容(最小 2 副本,最大 10 副本,目标 CPU 使用率 70%):# hpa-example.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <hpa-name> namespace: <namespace> spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: <deployment-name> # 关联的 Deployment 名称 minReplicas: 2 # 最小副本数 maxReplicas: 10 # 最大副本数 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 # 目标 CPU 使用率
应用配置:
kubectl apply -f hpa-example.yaml
-
查看 HPA 状态:
kubectl get hpa -n <namespace> # 输出包含当前副本数、目标指标、最小/最大副本数等信息
二、节点层面的扩缩容(调整集群节点数量)
节点扩缩容即增加或减少集群中的节点(物理机/虚拟机),需根据集群部署方式(自建/云托管)选择不同方法。
1. 自建集群(如 kubeadm 部署)
自建集群需手动操作节点的添加/移除,步骤较繁琐。
-
扩容(新增节点):
- 准备新节点(操作系统、容器运行时、网络等需与现有节点一致)。
- 在新节点上安装
kubelet
、kubeadm
、kubectl
。 - 在控制平面节点生成加入集群的令牌(若令牌过期,重新生成):
# 在控制平面执行,获取加入命令 kubeadm token create --print-join-command # 输出示例:kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
- 在新节点上执行上述 join 命令,加入集群。
- (可选)若新节点需要承担工作负载,确保其标签和污点配置正确(无
NoSchedule
污点):# 查看节点污点 kubectl describe node <new-node-name> | grep Taint # 移除污点(若有) kubectl taint nodes <new-node-name> key:NoSchedule-
-
缩容(移除节点):
需安全排空节点(避免 Pod 丢失),再删除节点:- 标记节点为不可调度(防止新 Pod 调度到该节点):
kubectl cordon <node-name>
- 排空节点(驱逐运行中的 Pod 到其他节点,忽略 DaemonSet,等待 30 秒超时):
若有 Pod 无法驱逐(如使用本地存储),可加kubectl drain <node-name> --ignore-daemonsets --timeout=30s
--force
强制排空(谨慎使用,可能导致数据丢失)。 - 从集群中删除节点:
kubectl delete node <node-name>
- 在物理机/虚拟机层面销毁该节点。
- 标记节点为不可调度(防止新 Pod 调度到该节点):
2. 云厂商托管集群(如 EKS、GKE、AKS)
云厂商通常提供 节点组(Node Group) 管理节点,支持手动或自动扩缩容,操作更简单。
-
手动扩缩容:
- 通过云厂商控制台(如 AWS EKS 控制台、GCP GKE 控制台)找到对应的节点组,直接修改“期望节点数”。
- 或通过命令行工具(如
eksctl
、gcloud
):# AWS EKS 示例:调整节点组数量为 3 eksctl scale nodegroup --cluster <cluster-name> --name <nodegroup-name> --nodes 3 # GCP GKE 示例:调整节点池数量为 3 gcloud container node-pools resize <node-pool-name> --num-nodes=3 --cluster=<cluster-name>
-
自动扩缩容(节点自动伸缩):
云厂商节点组支持配置自动扩缩容规则(基于节点资源使用率、Pod 调度队列等):- 在控制台开启“节点自动扩缩容”,设置最小/最大节点数。
- 例如,EKS 节点组可通过
eksctl
配置:eksctl create nodegroup --cluster <cluster-name> --name <nodegroup-name> \ --nodes-min 2 --nodes-max 5 # 最小 2 节点,最大 5 节点
3. 集群自动扩缩器(Cluster Autoscaler,适用于混合环境)
对于自建或云托管集群,可部署 Cluster Autoscaler(CA) 工具,实现节点的自动扩缩容(当 Pod 因资源不足无法调度时自动扩容节点,当节点资源长期闲置时自动缩容)。
- 原理:CA 监控未调度的 Pod,若因节点资源不足无法调度,会触发节点扩容;若节点资源利用率低且可安全移除(Pod 可调度到其他节点),则触发缩容。
- 部署:
- 云托管集群通常内置 CA(需在节点组开启)。
- 自建集群需手动部署 CA,配置与云厂商 API 或基础设施的对接(如对接 OpenStack、VMware 等)。
三、扩缩容注意事项
-
Pod 扩缩容:
- 确保集群有足够的节点资源(CPU、内存)容纳扩容后的 Pod,否则会出现
Pending
状态。 - 有状态应用(StatefulSet)扩缩容需注意数据持久化(如 PV 分配)和顺序性(缩容从最高序号开始)。
- 确保集群有足够的节点资源(CPU、内存)容纳扩容后的 Pod,否则会出现
-
节点扩缩容:
- 扩容时确保新节点网络与现有集群互通(如同一 VPC、安全组规则允许 Kubernetes 端口通信)。
- 缩容时务必先排空节点,避免运行中的 Pod 被强制终止(尤其是有状态应用)。
- 自动扩缩容需合理设置阈值(如 HPA 的 CPU 目标值、CA 的节点资源利用率阈值),避免频繁扩缩容(“抖动”)。
总结
- Pod 扩缩容:通过
kubectl scale
手动调整,或 HPA 基于指标自动调整,适用于应对应用流量变化。 - 节点扩缩容:自建集群需手动添加/移除节点;云托管集群通过节点组简化操作;Cluster Autoscaler 实现节点全自动扩缩容,适用于动态集群资源需求。
根据实际场景选择合适的方式,平衡资源利用率和应用可用性。