使用 Prometheus 和 sacloud/autoscaler 来尝试实现自动调整规模的 Sakura Cloud

简述

这一次,我轻轻地尝试了一下樱花云的自动扩展功能,所以这次想通过Prometheus的警报来触发实例的垂直自动扩展。

前提 tí)

インスタンスは3つ

sacloud/autoscaler(coreとinputs)を動かすインスタンス
1Core1GBの一番小さいインスタンスで作っておく。
PrometheusのServerとAlertManagerを動かすインスタンス
1Core1GBの一番小さいインスタンスで作っておく。
垂直オートスケールさせるインスタンス
名前は target01 にしておく。
1Core1GBの一番小さいインスタンスで作っておく。

みんな同じローカルネットワークにいる
さくらのクラウドのAPIキーはget済み
各インスタンスでDockerが使えるようになっている

整体形象

可能大致如此。

pic1.jpg

在想要垂直自动扩展的实例上运行 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

如果弹出框以类似于以下设置的名称显示,则为好的。

スクリーンショット 2021-07-03 12.07.05.png

进行自动缩放!

    1. 请在樱云的控制面板中打开服务器列表。

 

    使用ssh登录到需要自动缩放的服务器,然后通过以下命令给CPU施加负载。
yes > /dev/null &
yes > /dev/null &

不久之后,当负载平均值超过2时,将执行自动伸缩操作并增加实例的大小。在控制面板的服务器列表中观察自动伸缩的情况是一件有趣的事情。

结束。

广告
将在 10 秒后关闭
bannerAds