咨询:如何基于网络带宽实现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 nodescomponents.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基于自定义指标扩缩:
- 部署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 - 配置指标转换规则(创建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])' - 重启Adapter生效:
kubectl rollout restart deployment prometheus-adapter -n monitoring - 验证自定义指标:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/nodes/*/node_network_receive_bytes_per_second" - 修改Cluster Autoscaler配置,添加自定义指标阈值:
在容器kubectl edit deployment cluster-autoscaler -n kube-systemargs中添加(示例阈值,需根据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扩缩容策略:
- 在CloudWatch中创建两个告警:
- 扩容告警:当节点组平均
NetworkIn带宽超过80%(T3.2xlarge最大带宽5Gbps)持续5分钟 - 缩容告警:当节点组平均
NetworkIn带宽低于30%持续10分钟
- 扩容告警:当节点组平均
- 给ASG关联扩缩容策略:
- 扩容策略:每次新增1台节点,冷却时间5分钟
- 缩容策略:每次减少1台节点,冷却时间10分钟
- 禁用Cluster Autoscaler的自动扩缩逻辑,避免冲突。
四、验证与调优
- 压力测试:用wrk、locust等工具模拟用户请求,观察节点带宽达到阈值时是否触发扩缩
- 阈值调优:根据实际业务流量调整带宽阈值、扩缩步长(比如每次扩2台),避免频繁扩缩
- 监控:用Grafana(Prometheus方案)或CloudWatch Dashboard监控网络指标与扩缩事件
内容的提问来源于stack exchange,提问作者Boonya
相关产品推荐
相关产品推荐

