You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:如何基于网络带宽实现AWS EKS集群节点自动扩缩容

基于网络负载的EKS节点自动扩缩容方案

一、先解决Metrics Server部署问题

Metrics Server是K8s指标采集的基础,先确保其正常运行:

  • 部署官方稳定版本:
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    
  • 验证运行状态:
    kubectl get pods -n kube-system | grep metrics-server
    kubectl top nodes
    
    若出现证书验证失败,可临时在components.yaml的metrics-server容器参数中添加--kubelet-insecure-tls(生产环境建议配置合法证书)。

二、采集节点网络指标

EKS原生指标不包含网络数据,需额外部署采集工具:

方式1:Prometheus + Node Exporter(集群内指标采集)

用Helm部署Prometheus生态栈,自动采集节点网络指标:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring --create-namespace

Node Exporter会采集节点的网络收发总字节数(指标名:node_network_receive_bytes_total、node_network_transmit_bytes_total),通过PromQL可计算每秒带宽速率:

rate(node_network_receive_bytes_total[1m])  # 每秒接收带宽
rate(node_network_transmit_bytes_total[1m]) # 每秒发送带宽

方式2:AWS CloudWatch Container Insights(云原生指标采集)

启用CloudWatch自动采集EKS节点网络指标:

eksctl utils install-vpc-controllers --cluster <你的集群名> --approve
eksctl enable insight --cluster <你的集群名> --region <你的区域>

在CloudWatch控制台可直接查看节点的NetworkIn、NetworkOut指标,无需额外维护集群内工具。

三、实现基于网络阈值的节点扩缩容

方案1:K8s自定义指标 + Cluster Autoscaler

通过Prometheus Adapter将网络指标暴露给K8s API,再配置Cluster Autoscaler基于自定义指标扩缩:

  1. 部署Prometheus Adapter:
    helm install prometheus-adapter prometheus-community/prometheus-adapter -n monitoring \
      --set prometheus.url=http://prometheus-prometheus.monitoring.svc.cluster.local \
      --set prometheus.port=9090
    
  2. 配置指标转换规则(创建ConfigMap):
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: prometheus-adapter-config
      namespace: monitoring
    data:
      config.yaml: |-
        rules:
        - seriesQuery: 'node_network_receive_bytes_total{job="node-exporter"}'
          resources:
            overrides:
              node: {resource: "node"}
          name:
            matches: "^(.*)_bytes_total$"
            as: "${1}_bytes_per_second"
          metricsQuery: 'rate(<<.Series>>[1m])'
    
  3. 重启Adapter生效:
    kubectl rollout restart deployment prometheus-adapter -n monitoring
    
  4. 验证自定义指标:
    kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/nodes/*/node_network_receive_bytes_per_second"
    
  5. 修改Cluster Autoscaler配置,添加自定义指标阈值:
    kubectl edit deployment cluster-autoscaler -n kube-system
    
    在容器args中添加(示例阈值,需根据T3.2xlarge带宽上限调整):
    --scale-down-unneeded-time=10m
    --scale-down-delay-after-add=5m
    --custom-metrics=node_network_receive_bytes_per_second:80%:90%
    

方案2:AWS Auto Scaling Group + CloudWatch告警(更简单的云原生方案)

直接基于CloudWatch指标配置节点组对应的ASG扩缩容策略:

  1. 在CloudWatch中创建两个告警:
    • 扩容告警:当节点组平均NetworkIn带宽超过80%(T3.2xlarge最大带宽5Gbps)持续5分钟
    • 缩容告警:当节点组平均NetworkIn带宽低于30%持续10分钟
  2. 给ASG关联扩缩容策略:
    • 扩容策略:每次新增1台节点,冷却时间5分钟
    • 缩容策略:每次减少1台节点,冷却时间10分钟
  3. 禁用Cluster Autoscaler的自动扩缩逻辑,避免冲突。

四、验证与调优

  • 压力测试:用wrk、locust等工具模拟用户请求,观察节点带宽达到阈值时是否触发扩缩
  • 阈值调优:根据实际业务流量调整带宽阈值、扩缩步长(比如每次扩2台),避免频繁扩缩
  • 监控:用Grafana(Prometheus方案)或CloudWatch Dashboard监控网络指标与扩缩事件

内容的提问来源于stack exchange,提问作者Boonya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:25:17