コンテナを監視する

Amazon ECSやKubernetesなど、コンテナオーケストレーションプラットフォームにおけるコンテナの監視にはmackerel-container-agentが利用できます。

特徴

mackerel-container-agentにはつぎのような特徴があります。

  • コンテナオーケストレーションプラットフォームを対象とした専用の監視エージェントです
  • Dockerイメージで提供します
  • タスク(ECS)やPod(Kubernetes)を監視します
  • タスク/Podのサイドカーとして実行します
  • タスク/Podをホストとして扱い、サービス、ロールを割り当てることが可能です
  • エージェント終了時に自動退役します

以下に挙げるものはmackerel-container-agentにおいて監視対象外となります。

  • コンテナホストの監視
    • コンテナホストのCPUやメモリ、ネットワークなど
  • コンテナオーケストレーションプラットフォーム自体の監視
    • ノードやタスク, Pod数など
  • サポートするコンテナオーケストレーションプラットフォーム以外のコンテナの監視

課金に関する注意事項

mackerel-container-agentを利用すると、1つのタスクやPodに対して1つのホストがMackerelに登録されます。有料プランの場合は課金が発生しますのでご注意ください。詳しくはFAQ・ホスト数の計算方法についてをご覧ください

サポートするコンテナオーケストレーションプラットフォーム

mackerel-container-agentでサポートするコンテナオーケストレーションプラットフォームはつぎのとおりです。

  • Amazon Elastic Container Service(ECS)
    • EC2起動タイプ
    • Fargate起動タイプ
    • Windowsコンテナは対象外となります
  • Kubernetes

セットアップ

mackerel-container-agentのセットアップ手順です。 各コンテナオーケストレーションプラットフォームごとに手順が異なります。

mackerel-container-agent v0.1.0以降では、下記の手順は非推奨となります。 ご注意ください。

取得メトリック

mackerel-container-agentで取得するメトリックはつぎのとおりです。 コンテナオーケストレーションプラットフォームによって取得内容が異なる場合があります。

メトリック 説明 メトリック名
CPU Usage コンテナごとのCPU使用量(1コア=100%) container.cpu.<container_name>.usage
CPU Limit コンテナごとのCPU Limit(1コア=100%)。
Kubernetesではコンテナごとの resources.limits.cpu の値。定義がない場合はホストのコア数。
ECS, FargateではタスクCPU。定義がない場合はホストのCPUコア数。
container.cpu.<container_name>.limit
Memory Usage コンテナごとのメモリ使用量 container.memory.<container_name>.usage
Memory Limit コンテナごとのMemory Limit。
Kubernetesではコンテナごとの resources.limits.memory の値。定義がない場合はホストの搭載メモリ量。
ECS, Fargateではコンテナのメモリ制限。定義がない場合はタスクメモリ。コンテナ、メモリともに定義がない場合はホストの搭載メモリ量。
container.memory.<container_name>.limit
Interface Rx タスク/Podのインターフェースごとの受信バイト数。
ECS(default, bridgeネットワークモード)ではコンテナごとのインターフェースの受信バイト数。
interface.<container_name>.rxBytes.delta
Interface Tx タスク/Podのインターフェースごとの送信バイト数。
ECS(default, bridgeネットワークモード)ではコンテナごとのインターフェースの送信バイト数。
interface.<container_name>.txBytes.delta

ロールメトリックについて

ロールグラフではCPU, MemoryともにタスクやPodに属するコンテナのメトリックの合計値を表示します。

取得メタデータ

mackerel-container-agentでは各コンテナオーケストレーションプラットフォームの情報を取得し、ホストメタデータとして登録します。

  • ECS, Fargate
    • クラスタ名, ARN, タスクリソースリミット, コンテナ名, DockerID など
  • Kubernetes
    • Pod名, 名前空間, ラベル, コンテナ名, コンテナリソースリミット など

エージェントの設定

エージェントの設定は環境変数、設定ファイルで行います。 プラグインを使わない場合は環境変数の設定のみでエージェントを利用できます。

環境変数による設定

変数名 説明
MACKEREL_APIKEY エージェントがMackerelサービスとの通信の際に用いる API キーを指定します。
MACKEREL_APIBASE Mackerel APIのエンドポイントを指定します (デフォルト: https://api.mackerelio.com/)。
MACKEREL_ROLES タスク、Podへサービス、ロールを設定できます。,区切りで複数の指定が可能です。(例: service1:role1,service2:role2
MACKEREL_DISPLAY_NAME ホストの管理名を指定します。
MACKEREL_MEMO ホストのメモを指定します。
MACKEREL_AGENT_CONFIG エージェントの設定ファイルを設定できます。こちらの詳細は後述します。
MACKEREL_AGENT_CONFIG_POLLING_DURATION_MINUTES エージェントの設定ファイルの変更を検知するために取得する間隔を分で指定します。
MACKEREL_IGNORE_CONTAINER 監視を除外するコンテナの名前を正規表現で設定します。
MACKEREL_HOST_STATUS_ON_START 設定すると、エージェント起動時にホストのステータスを指定した値に変更します。 有効な値は "standby", "working", "maintenance", "poweroff" のいずれかです。
HTTP_PROXY エージェントがコンテナ外部への通信に利用する HTTP Proxy を設定します。http probe (後述)の proxy とは別の設定となるので注意してください。
HTTPS_PROXY エージェントがコンテナ外部への通信に利用する HTTPS Proxy を設定します。http probe (後述)の proxy とは別の設定となるので注意してください。

設定ファイルによる設定

エージェントの設定ファイルのファイルパスは環境変数 MACKEREL_AGENT_CONFIG で設定します。 MACKEREL_AGENT_CONFIG の指定がない場合はデフォルト設定で動作します。

MACKEREL_AGENT_CONFIG に指定可能なパスは次の通りです。

  • ファイルパス: /etc/mackerel/mackerel.yaml
  • HTTP/HTTPS: https://example.com/mackerel/conf/mackerel.yaml
  • Amazon S3: s3://bucket/mackerel/conf/mackerel.yaml

設定ファイルはYAML形式で記述します。以下は設定ファイルの例です。

apikey: "YOUR_MACKEREL_APIKEY"
roles:
  - "My-Service:app"
  - "Another-Service:db"
ignoreContainer: '\Amackerel-container-agent\z'

デフォルトでは、設定ファイルは起動時に一度だけ読み込まれます。 MACKEREL_AGENT_CONFIG_POLLING_DURATION_MINUTES を設定することで、定期的に設定ファイルを取得して、変更を検知して適用します。

設定項目

項目名 説明
apikey エージェントがMackerelサービスとの通信の際に用いる API キーを指定します。
apibase Mackerel APIのエンドポイントです (デフォルト: https://api.mackerelio.com/)。
roles タスク、Podへサービス、ロールを設定できます。
display_name ホストの管理名を指定します。
memo ホストのメモを指定します。
ignoreContainer 監視を除外するコンテナの名前を正規表現で設定します。
root mackerel-container-agentのルートディレクトリを指定できます (デフォルト: /var/tmp/mackerel-container-agent)。
plugin.metrics 任意のメトリックの取得、投稿するプラグインを設定できます。こちらの詳細は後述します。
plugin.checks 任意のチェック監視を実行、その結果を投稿するプラグインを設定できます。こちらの詳細は後述します。
readinessProbe Readiness Probeを設定できます。こちらの詳細は後述します。

設定の優先順位

環境変数、設定ファイルで同じ項目が定義されていた場合、設定ファイルの値を優先 します。ご注意ください。

プラグインの利用

メトリックプラグイン、チェックプラグインが利用可能です。

また、mackerel-container-agentでは公式プラグインを同梱したDockerイメージも公開しています。 pluginslatest に、vX.Y.Z-pluginsvX.Y.Z にプラグインを同梱したイメージとなります。

こちらのイメージに同梱されているプラグインは下記を参照してください。

同梱されてるプラグイン以外を利用する場合は、mackerel/mackerel-container-agentをベースイメージとして、利用したいプラグインをインストールしたイメージを用意してください。

利用可能なプラグイン設定

mackerel-container-agentで利用可能な設定は以下のとおりです。

メトリックプラグインの設定項目 (plugin.metrics)

  • command: エージェントが定期的に実行するコマンドです (必須項目)。
  • user: コマンドの実行ユーザーです。指定がない場合はmackerel-container-agentの実行ユーザーとなります。
  • env: コマンドに渡す環境変数です。
  • timeoutSeconds: コマンドのタイムアウト時間を秒で指定します。デフォルト値は30秒です。

チェックプラグインの設定項目 (plugin.checks)

  • command: エージェントが定期的に実行するコマンドです (必須項目)。
  • user: コマンドの実行ユーザーです。指定がない場合はmackerel-container-agentの実行ユーザーとなります。
  • env: コマンドに渡す環境変数です。
  • timeoutSeconds: コマンドのタイムアウト時間を秒で指定します。デフォルト値は30秒です。
  • memo: チェック監視に対してメモを設定できます。ここで指定した文字列は、アラート通知・アラート詳細画面・ホスト詳細ページで確認できます。

プラグイン設定例

以下はプラグインの設定例です。

plugin:
  metrics:
    mysql:
      command: mackerel-plugin-mysql

    redis6379:
      command: mackerel-plugin-redis -port=6379 -timeout=5 -metric-key-prefix=redis6379
      timeoutSeconds: 50

    sample:
      command: ruby /usr/local/bin/sample-plugin.rb
      user: "sample-user"
      env:
        FOO: "FOO BAR"
        QUX: 'QUX QUUX'

  checks:
    procs:
      command: "check-procs --pattern=/usr/sbin/sshd --warning-under=1"
      user: "sample-user"
      env:
        FOO: FOO BAR
      timeoutSeconds: 45
      memo: "check procs memo"

Readiness Probeの設定

エージェントの起動時に、アプリケーションが正常に起動しているかの確認を行えます。この確認が成功した後に、ホストが作成されます。

mackerel-container-agentで設定できるReadiness Probeは以下の三種類です。いずれか一つのみ設定可能です。

  • exec probe
    • コマンドを実行して、正常終了するかを確認します
  • http probe
    • HTTPリクエストを送信して、正常に応答するかを確認します
  • tcp probe
    • TCPによる接続ができるかを確認します

共通の設定項目 (readinessProbe)

  • timeoutSeconds: コマンドやHTTPリクエストのタイムアウト時間を秒で指定します。デフォルト値は1秒です。
  • initialDelaySeconds: エージェントが起動してからprobeのチェックを行うまでの時間を秒で指定します。デフォルト値は0秒です。
  • periodSeconds: probeのチェックを行う間隔を秒で指定します。デフォルト値は10秒です。

exec probe

コマンドを実行し、終了ステータスが0のときに正常と判断します。

exec probeの設定項目 (readinessProbe.exec)

  • command: 実行するコマンドを設定します (必須項目)。
  • user: コマンドの実行ユーザーです。指定がない場合はmackerel-container-agentの実行ユーザーとなります。
  • env: コマンドに渡す環境変数です。

設定例

readinessProbe:
  exec:
    command: cat /tmp/healthy
readinessProbe:
  exec:
    command: cat /tmp/healthy
    user: "sample-user"
    env:
      FOO: "FOO BAR"
  initialDelaySeconds: 10
  timeoutSeconds: 5
  periodSeconds: 3

http probe

HTTPリクエストを送信し、200番台または300番台のステータスのときに正常と判断します。

http probeの設定項目 (readinessProbe.http)

  • path: リクエスト先のパスを指定します (必須項目)。
  • scheme: URI schemeを指定します。デフォルト値はhttpです。
  • method: リクエストのメソッドを指定します。デフォルト値はGETです。
  • host: リクエスト先のホストを指定します。デフォルト値はlocalhostです。
  • port: リクエスト先のポートを指定します。デフォルト値は80です。
  • headers: リクエストヘッダを指定します。
  • proxy: HTTPプロキシのURLを指定します。

設定例

readinessProbe:
  http:
    path: /healthy
    port: 8000
readinessProbe:
  http:
    scheme: http
    method: PUT
    path: /healthy
    headers:
      - name: X-Custom-Header
        value: test
    proxy: "https://proxy.example.com:8080"
  initialDelaySeconds: 10
  timeoutSeconds: 5
  periodSeconds: 10

tcp probe

TCPの接続ができれば正常と判断します。

tcp probeの設定項目 (readinessProbe.tcp)

  • port: リクエスト先のポートを指定します (必須項目)。
  • host: リクエスト先のホストを指定します。

設定例

readinessProbe:
  tcp:
    port: 53
readinessProbe:
  tcp:
    port: 443
    host: example.com
  initialDelaySeconds: 10
  timeoutSeconds: 5
  periodSeconds: 10

監視

コンテナを監視するためには、以下のメトリック監視を用います。監視する必要がないコンテナによってアラートが発報されてしまう場合は、環境変数 MACKEREL_IGNORE_CONTAINER または設定ファイルの ignoreContainer で除外設定を行ってください。

  • CPU: Container CPU %
    • コンテナごとのCPU使用率 (container.cpu.<container_name>.usage / container.cpu.<container_name>.limit) の最大を監視します。
  • Memory: Container Memory %
    • コンテナごとのMemory使用率 (container.memory.<container_name>.usage / container.memory.<container_name>.limit) の最大を監視します。
  • interface: interface.<container_name>.rxBytes.delta, interface.<container_name>.txBytes.delta
    • ネットワークインターフェースの転送量を監視します。