Skip to content

根据带宽情况动态添加/删除阿里云共享带宽内的EIP,坚决不让阿里云多挣我司一分钱!!!

License

Notifications You must be signed in to change notification settings

p-program/common-bandwidth-auto-switch

Repository files navigation

wtfpl Build Status

common-bandwidth-auto-switch

why

阿里云增强型95付费的共享带宽,保底200Mbps,最低消费200*0.2=40Mbps,经过我计算,我觉得在40~50Mbps时使用比较合理.

由于2020年春节+武汉冠状肺炎的严重影响,网站流量急剧减少.所以我把所有的IP都纳入了共享带宽.

2020-03-05 13:20 星期四,百度在爬我们站点,带宽瞬间达到200Mbps.

原本我想把EIP脱离共享带宽,结果那天下午我刚睡醒,智商只有平时10%,没看清楚电脑屏幕,错误地移除了EIP绑定的SLB,造成了网站无法访问.

痛定思痛,我决定,开发一个自动管理调整共享带宽EIP池的程序让他在

  1. 流量低峰时把EIP纳入共享带宽,节约流量费用;
  2. 带宽高峰时让EIP移出共享带宽,提高带宽利用率.

最终最大程度地优化费用支出.

feature

当前共享带宽 > 期望值(maxBandwidth)时,自动把高带宽的EIP移除出共享带宽

当前共享带宽 < 期望值((maxBandwidth+minBandwidth)/2)时,自动把高带宽的EIP添加入共享带宽

核心算法是动态规划

带宽达到均衡态之后,你就会发现这个程序一点卵用都没有,基本不会触发什么伸缩。

usage

RAM授权

用到的接口:

vpc
DescribeEipMonitorData
DescribeEipAddresses

cms
DescribeCommonBandwidthPackages
AddCommonBandwidthPackageIp
RemoveCommonBandwidthPackageIp

cms
DescribeMetricList

由于需要操作VPC和共享带宽,这类都属于高危操作,RAM授权记得弄好。

如果你对授权不敏感,可以直接添加下列权限

  1. AliyunVPCFullAccess
  2. AliyunEIPFullAccess
  3. AliyunCloudMonitorFullAccess
  4. AliyunCommonBandwidthPackageFullAccess

配置文件

参照 config-example.yaml 修改 config.yaml 配置文件.

cp config-example.yaml config.yaml
vi config.yaml

docker/docker-compose

# docker
docker run -it \
-v /root/common-bandwidth-auto-switch/config.yaml:/app/config/config.yaml \
zeusro/common-bandwidth-auto-switch:latest
# docker-compose
docker-compose up

kubernetes

例子使用了 Kubernetes 的 CronJob + Configmap 的方式部署

kubectl create configmap cbwp-config --from-file=config.yaml=config.yaml

kubectl apply -f deploy/kubernetes/cronjob.yaml

配置的加载顺序为:先读取 config.yaml , config.yaml不存在再读取 config-example.yaml文件.

rm -rf /

kubectl delete cronjob common-bandwidth-auto-switch
kubectl delete configmap cbwp-config

todo(NEVER DO)

  1. 阻塞,周期性运行,再加上健康检查
  2. 多实例运行

About

根据带宽情况动态添加/删除阿里云共享带宽内的EIP,坚决不让阿里云多挣我司一分钱!!!

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published