在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 部署)

自建集群需手动操作节点的添加/移除,步骤较繁琐。

  • 扩容(新增节点)

    1. 准备新节点(操作系统、容器运行时、网络等需与现有节点一致)。
    2. 在新节点上安装 kubeletkubeadmkubectl
    3. 在控制平面节点生成加入集群的令牌(若令牌过期,重新生成):
      # 在控制平面执行,获取加入命令
      kubeadm token create --print-join-command
      # 输出示例:kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
      
    4. 在新节点上执行上述 join 命令,加入集群。
    5. (可选)若新节点需要承担工作负载,确保其标签和污点配置正确(无 NoSchedule 污点):
      # 查看节点污点
      kubectl describe node <new-node-name> | grep Taint
      # 移除污点(若有)
      kubectl taint nodes <new-node-name> key:NoSchedule-
      
  • 缩容(移除节点)
    需安全排空节点(避免 Pod 丢失),再删除节点:

    1. 标记节点为不可调度(防止新 Pod 调度到该节点):
      kubectl cordon <node-name>
      
    2. 排空节点(驱逐运行中的 Pod 到其他节点,忽略 DaemonSet,等待 30 秒超时):
      kubectl drain <node-name> --ignore-daemonsets --timeout=30s
      
      若有 Pod 无法驱逐(如使用本地存储),可加 --force 强制排空(谨慎使用,可能导致数据丢失)。
    3. 从集群中删除节点:
      kubectl delete node <node-name>
      
    4. 在物理机/虚拟机层面销毁该节点。

2. 云厂商托管集群(如 EKS、GKE、AKS)

云厂商通常提供 节点组(Node Group) 管理节点,支持手动或自动扩缩容,操作更简单。

  • 手动扩缩容

    • 通过云厂商控制台(如 AWS EKS 控制台、GCP GKE 控制台)找到对应的节点组,直接修改“期望节点数”。
    • 或通过命令行工具(如 eksctlgcloud):
      # 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 等)。

三、扩缩容注意事项

  1. Pod 扩缩容

    • 确保集群有足够的节点资源(CPU、内存)容纳扩容后的 Pod,否则会出现 Pending 状态。
    • 有状态应用(StatefulSet)扩缩容需注意数据持久化(如 PV 分配)和顺序性(缩容从最高序号开始)。
  2. 节点扩缩容

    • 扩容时确保新节点网络与现有集群互通(如同一 VPC、安全组规则允许 Kubernetes 端口通信)。
    • 缩容时务必先排空节点,避免运行中的 Pod 被强制终止(尤其是有状态应用)。
    • 自动扩缩容需合理设置阈值(如 HPA 的 CPU 目标值、CA 的节点资源利用率阈值),避免频繁扩缩容(“抖动”)。

总结

  • Pod 扩缩容:通过 kubectl scale 手动调整,或 HPA 基于指标自动调整,适用于应对应用流量变化。
  • 节点扩缩容:自建集群需手动添加/移除节点;云托管集群通过节点组简化操作;Cluster Autoscaler 实现节点全自动扩缩容,适用于动态集群资源需求。

根据实际场景选择合适的方式,平衡资源利用率和应用可用性。

posted @ 2025-08-08 09:52  天道酬勤zjh  阅读(174)  评论(0)    收藏  举报