Dockerホスト、コンテナ、コンテナサービスの監視

物理サーバー、仮想マシン、コンテナー、コンテナー内で動作するサービスのメトリックスストレージ、視覚化、アラートを提供できるオープンソースのセルフホスト監視ソリューションを探していました。 Elastic Beats、Graphite、およびPrometheusをテストした後、私はPrometheusに決めました。 まず、多次元メトリックとシンプルなクエリ言語のサポートに魅了されました。 グラフィックイメージと通知に同じ言語を使用する機能により、監視タスクが大幅に簡素化されます。 Prometheusはブラックボックステストとホワイトボックステストの両方を実行します。つまり、インフラストラクチャをテストし、アプリケーションの内部状態を監視することもできます。









なぜ選択がプロメテウスにかかったのか









プロメテウスのエコシステムは巨大です。 つまり、データベース、MQ、HTTPサーバーから、IoTやIPMIなどのハードウェア関連システムまで、さまざまなシステムのメトリックエクスポーターを見つけることができます。 ホワイトボックステストも優れたカバレッジを備えています。 Go、Java、Python、Ruby、.NET、PHP、およびその他のプログラミング言語用のPrometheusクライアントライブラリがあります。







Prometheusとdockerを使い始める



Prometheusスタックを試してみたい場合は、GitHubのdockpromリポジトリをご覧ください。 監視ソリューションの開始点としてdockpromを使用できます。 これにより、Prometheus、Grafana、cAdvisor、NodeExporter、AlertManagerの1つのコマンドでスタック全体を管理できます。













設置



dockpromリポジトリをdockerホストにコピーし、dockpromディレクトリに移動して、compose upを実行します。







$ git clone https://github.com/stefanprodan/dockprom $ cd dockprom $ docker-compose up -d
      
      





コンテナ:









Gafanaが認証をサポートしている場合、PrometheusおよびAlertManagerサービスにはこの機能がありません。 PrometheusおよびAlertManagerの基本認証を使用すると、ポートマッピングをdocker-composeファイルから削除し、NGINXをリバースプロキシサーバーとして使用できます。







Grafanaをインストールする



http://<host-ip>:3000



に移動し、 adminユーザー名とchangemeパスワードを使用してログインします。 Grafana UIを使用するか、 user.configファイルを変更することにより、パスワードを変更できます。







Grafanaメニューから[データソース]を選択し、[データソースの追加]をクリックします。 Prometheusコンテナーをデータソースとして追加するには、次の値を使用します。









Grafanaディレクトリからコントロールパネルテンプレートをインポートできるようになりました。 Grafanaメニューから[コントロールパネル]を選択し、[インポート]をクリックします。







Dockerコントロールパネル

Dockerコントロールパネル







ドッカーコントロールパネルには、サーバーのリソースの使用を監視するための主要な指標が表示されます。









Dockerコンテナーコントロールパネル

Dockerコンテナーコントロールパネル







Dockerコンテナーコントロールパネルには、使用済みコンテナーを監視するための主要なメトリックが表示されます。









パネルには、監視スタックの一部であるコンテナは表示されません。







監視サービスコントロールパネル

監視サービスコントロールパネル







監視サービスコントロールパネルには、監視スタックを構成するコンテナを監視するための主要なメトリックが表示されます。









メモリのローカルストレージフラグメントをアタッチすることにより、Prometheusのメモリ使用量を制御できます。 docker-compose.ymlでフラグメントの最大値を変更できます。 storage.local.memory-chunks



値を100,000に設定すると、10個のコンテナーを監視する場合、Prometheusは約2 GBのRAMを使用します。







通知の定義



3つの通知構成ファイルをインストールしました。









HTTP POSTリクエストを使用して、通知ルールを変更し、リロードできます。







 curl -X POST http://<host-ip>:9090/-/reload
      
      





監視サービス通知



ターゲットの1つ(node-exporterとcAdvisor)が30秒以上応答しない場合、通知を有効にします。







 ALERT monitor_service_down IF up == 0 FOR 30s LABELS { severity = "critical" } ANNOTATIONS { summary = "Monitor service non-operational", description = "{{ $labels.instance }} service is down.", }
      
      





Dockerホスト通知



DockerホストCPUが30秒以上にわたって高負荷になっている場合、通知を有効にします。







 ALERT high_cpu_load IF node_load1 > 1.5 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Server under high load", description = "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.", }
      
      





CPUコアの数と一致するように負荷しきい値を変更します。







Dockerホストのメモリがいっぱいの場合、通知を有効にします。







 ALERT high_memory_load IF (sum(node_memory_MemTotal) - sum(node_memory_MemFree + node_memory_Buffers + node_memory_Cached) ) / sum(node_memory_MemTotal) * 100 > 85 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Server memory is almost full", description = "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.", }
      
      





Dockerホストストレージがいっぱいの場合、通知を有効にします。







 ALERT hight_storage_load IF (node_filesystem_size{fstype="aufs"} - node_filesystem_free{fstype="aufs"}) / node_filesystem_size{fstype="aufs"} * 100 > 85 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Server storage is almost full", description = "Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.", }
      
      





Dockerコンテナー通知



コンテナが30秒以内に応答しない場合は、通知を有効にします







 ALERT jenkins_down IF absent(container_memory_usage_bytes{name="jenkins"}) FOR 30s LABELS { severity = "critical" } ANNOTATIONS { summary= "Jenkins down", description= "Jenkins container is down for more than 30 seconds." }
      
      





コンテナがCPUコアの10%を30秒以上使用している場合、通知を有効にします。







  ALERT jenkins_high_cpu IF sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu{mode="system"}) * 100 > 10 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary= "Jenkins high CPU usage", description= "Jenkins CPU usage is {{ humanize $value}}%." }
      
      





コンテナーが1.2 GBを超えるRAMを30秒間使用する場合、通知を有効にします。







 ALERT jenkins_high_memory IF sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Jenkins high memory usage", description = "Jenkins memory consumption is at {{ humanize $value}}.", }
      
      





通知を設定する



AlertManagerは、Prometheusサーバーに通知を送信します。 AlertManagerは、webhookインターフェースを使用して、電子メール、プッシュオーバー、Slack、HipChatなどのシステムを介して通知を送信できます。







ここで、通知を表示またはオフにできます: http://<host-ip>:9093









通知の受信は、alertmanager / config.ymlファイルで設定できます。







Slackから通知を受信するには、アプリケーションページで[送信ネットワークバインディング]を選択して統合を構成する必要があります。







api_urlフィールドにSlack Webhook URLをコピーし、Slackチャネルを定義します。







 route: receiver: 'slack' receivers: - name: 'slack' slack_configs: - send_resolved: true text: "{{ .CommonAnnotations.description }}" username: 'Prometheus' channel: '#<channel>' api_url: 'https://hooks.slack.com/services/<webhook-id>'
      
      





システム拡張の監視



複数のdockerホストをカバーするには、Grafana Dockpromコントロールパネルを展開します。さらにホストを制御するには、各ホストにエクスポーターノードとcAdvisorコンテナーを配置し、読み取り用のPrometheusサーバーを指定する必要があります。







データセンター/ゾーンを介してPrometheusスタックを有効にし、統合機能を使用して、インフラストラクチャの一般的な概要となるPrometheusプログラムの特定のコピーのすべてのメトリックを結合する必要があります。 したがって、ゾーンまたはゾーンの結合に関係するプロメテウスプログラムのコピーが失敗した場合、監視システムは残りのゾーンで利用可能になります。







各ゾーンで2つの同一のサーバーを実行することにより、Prometheusの復元力を高めることもできます。 複数のサーバーがAlertmanagerに通知を送信する場合、Alertmanagerは重複排除を実行するため、これにより冗長データが表示されることはありません。








All Articles