使用 Prometheus 和 sacloud/autoscaler 来尝试实现自动调整规模的 Sakura Cloud
简述
这一次,我轻轻地尝试了一下樱花云的自动扩展功能,所以这次想通过Prometheus的警报来触发实例的垂直自动扩展。
前提 tí)
インスタンスは3つ
sacloud/autoscaler(coreとinputs)を動かすインスタンス
1Core1GBの一番小さいインスタンスで作っておく。
PrometheusのServerとAlertManagerを動かすインスタンス
1Core1GBの一番小さいインスタンスで作っておく。
垂直オートスケールさせるインスタンス
名前は target01 にしておく。
1Core1GBの一番小さいインスタンスで作っておく。
みんな同じローカルネットワークにいる
さくらのクラウドのAPIキーはget済み
各インスタンスでDockerが使えるようになっている
整体形象
可能大致如此。

在想要垂直自动扩展的实例上运行 Prometheus 的 node_exporter。
方便易行。
sudo docker container run --restart always --name node_exporter -p 9100:9100 prom/node-exporter
如果没有”restart always”,自动缩放将在重新启动后停止容器,导致Prometheus服务器无法获取实例信息。
准备运行sacloud/autoscaler。
编写 sacloud/autoscaler 的配置文件
在运行sacloud/autoscaler的实例上写入。将文件名设为autoscaler.yaml。
这是关于将位于is1b区域的target01实例按照所记录在plans中的某个模式进行扩展或缩小的内容。
# 操作対象のリソースの定義
resources:
tmkgrp:
resources:
# サーバ(垂直スケール)
- type: Server
selector:
names: ["target01"]
zone: "is1b"
plans:
- core: 1
memory: 1
- core: 2
memory: 4
- core: 4
memory: 8
option:
shutdown_force: true
autoscaler:
cooldown: 50 # デフォルト: 6000(10分)
sakuracloud:
token: "himitsu"
secret : "superhimitsu"
运行sacloud/autoscaler。
在前一个操作中生成的yaml文件所在的目录中,执行以下两个命令来运行 Core 和 Inputs 容器。
sudo docker run -d --rm --name autoscaler -w /work -v ${PWD}/:/work ghcr.io/sacloud/autoscaler:v0.0.1 server start
sudo docker run -d --name alertmanager --rm -p 8080:8080 -w /work -v ${PWD}/:/work ghcr.io/sacloud/autoscaler:v0.0.1 inputs alertmanager
准备运行普罗米修斯
在运行Prometheus的实例上进行工作。
在home目录下创建一个目录。
首先创建以下名称的目录并更改权限。
-
- alertmanager_data
-
- prometheus_data
-
- 作ったディレクトリのパーミッションを777にする
-
- デフォルトの権限だとコンテナにマウントした時に permission denied になる。
-
- PrometheusのDockerfileを見るとnobody ってユーザで動いているみたいなので、
-
- 777にしなくてもnobodyってユーザがアクセスできるようにすれば大丈夫。
- でも、今回は何も考えてないので777にする。
接下来,创建以下名称的目录。无需更改权限。
- prometheus_config
撰写Prometheus的配置
编写服务器的配置文件。
在我们创建的prometheus_config目录下,用名为prometheus.yml的文件来写入代码。
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.1.20:9093 # alertmanagetが動くインスタンスのIPとポート番号
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "/etc/prometheus/first_rules.yml" # 後の工程で作るyaml。どういった条件でアラートを上げるかを書く。
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["192.168.1.21:9100"] # node_exporterが動くインスタンスのIPとポート番号
将要将哪些内容纳入警报中的信息写入YAML文件中。
在创建的prometheus_config目录中以first_rules.yml的名字进行编写。
当1分钟内的负载平均值大于2或小于0.5时,发出警报。
groups:
- name: cpuAve # 名前何でもいい。
rules:
- alert: loadAverageMoreThan2 # 名前なんでもいい。
expr: node_load1 > 2 # alertを上げる条件。node_loadの部分は他にも色々ある。
# for: <期間>
labels:
CPU: plzup
annotations:
MyBigFat: "Annotation"
- alert: loadAverageLessThan0.5 # 名前なんでもいい。
expr: node_load1 < 0.5
# for: <期間>
labels:
CPU: plzdown
annotations:
MyBigFat: "Annotation"
写Alertmanager的配置
在创建的prometheus_config目录中,用名称为alertmanager.yml的文件进行编辑。
其中一些值需要与前一步创建的first_rules.yml文件保持一致。
route:
receiver: ordinaly # routesに定義されていないalertが来た場合に実行するreceiver。
routes:
- match: # CPUってラベルの値がplzupだったらupupupって名前のreceiversのアクションをする
CPU: plzup
receiver: upupup
- match: # CPUってラベルの値がplzdownだったらdowndowndownって名前のreceiversのアクションをする
CPU: plzdown
receiver: downdowndown
receivers:
- name: ordinaly
#webhook_configs:
# - url: "http://127.0.0.1:5001"
- name: upupup
webhook_configs:
- url: "http://192.168.1.10:8080/up?resource-group-name=tmkgrp"
- name: downdowndown
webhook_configs:
- url: "http://192.168.1.10:8080/down?resource-group-name=tmkgrp"
点燃普罗米修斯之火!
执行以下两个命令。
sudo docker run -d --rm --name prometheus -p 9090:9090 -v /home/ubuntu/prometheus_data/:/prometheus -v /home/ubuntu/prometheus_config/prometheus.yml:/etc/prometheus/prometheus.yml -v /home/ubuntu/prometheus_config/first_rules.yml:/etc/prometheus/first_rules.yml prom/prometheus
sudo docker run -d --rm --name alertmanager -p 9093:9093 -v /home/ubuntu/prometheus_config/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /home/ubuntu/alertmanager_data:/alertmanager prom/alertmanager
我来看看Prometheus的Web界面。
尝试使用浏览器访问运行Prometheus的实例的9090端口。
例如:http://192.168.1.20:9090/alerts
如果弹出框以类似于以下设置的名称显示,则为好的。

进行自动缩放!
-
- 请在樱云的控制面板中打开服务器列表。
- 使用ssh登录到需要自动缩放的服务器,然后通过以下命令给CPU施加负载。
yes > /dev/null &
yes > /dev/null &
不久之后,当负载平均值超过2时,将执行自动伸缩操作并增加实例的大小。在控制面板的服务器列表中观察自动伸缩的情况是一件有趣的事情。
结束。