Prometheus、AlermanagerによるKubernetes自動伸縮

2507 ワード

これまでKubernetesはcpu使用率ベースの水平pod自動伸縮サポートには良好だったが,カスタムmetricsによるHPAサポートが不十分で使い勝手も悪かった.
以下に、任意のカスタムmetricsをサポートするPrometheusおよびAlertmanagerに基づいてKubernetes Pod自動伸縮を実現するスキームを紹介する.考え方は簡単です.Prometheusが必要な性能指標(例えば、現在のリンクの同時数、現在のcpuの使用率など)を収集し、定義されたアラームルールに基づいてアラームイベントを生成し、アラームイベントをAlertmanagerに渡し、alertmanagerがwebhookをトリガーして最終的なpod伸縮機能を実現します.下図に示すように、
PrometheusのAlert rulesの構成例:
    ALERT HpaTrigger
    IF app_active_task_count > 30
    FOR 30m 
    LABELS {serverity = "page",trigger="hpa",action = "scale-out",value = "{{$value}}", deployment="test", namespace = "{{$labels.namespace}}"}
    ANNOTATIONS {
      summary = "Instance {{$labels.namespace}}: scale-out",
      description = "{{$labels.namespace}} auto scale-out"
    }

上記のルールは、適用されるアクティブなタスク数が30分以上続く場合、過剰なタスク数に対応するために新しいpodを作成する必要があることを示しています.しかし、ここでは水平Pod自動伸縮機能は直接トリガーされず、prometheusはアラームルールに基づいてアラームイベントを生成し、このイベントをalertmanagerに渡し、alertmanagerによってアラームをどのように処理するかを決定します.
Alertmanagerの構成例:
 global:
    route:
      receiver: 'email' #    ,             email   
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 4h
      routes:
      - receiver: 'auto-hpa' # trigger=hpa      auto-hpa
        match:
          trigger: hpa
    receivers:
    - name: 'email'
      email_configs:
      - to: [email protected]
        from: [email protected]
        smarthost: smtpserver:port
        auth_username: "username"
        auth_identity: "username"
        auth_password: "password"
        require_tls: true       
    - name: "auto-hpa"
      webhook_configs:
      - url: 'http://YOUR_WEBHOOK_IP:PORT/hpa' #   webhook url  。
        send_resolved: true

Alertmanagerは、対応するアラートを受信すると、取得した具体的なmetics値(ここでmetric nameはapp_active_task_count)と、アラートルールで定義されたLABELS情報とをjsonデータに統合し、POSTで定義したwebhook urlに送信します.
Webhook Pythonスクリプトの例:
from flask import Flask,request
import json

app = Flask(__name__)

@app.route("/hpa",methods=["POST"])
def hpa():
    content = request.get_json()
    #  content  ,      ,  k8s api    pod       
    #.......
    #.......
     print content

if __name__ == "__main__":
    app.run("0.0.0.0")

ここでは,k 8 s apiを具体的に呼び出してpod伸縮を実現する論理を省略した.Alertmanagerはすべての情報をjson形式postでカスタマイズしたスクリプトを提供してくれました.具体的にどのように処理するかは、ビジネスのニーズ次第です.