Mackerel で ECS をどこまでモニタリングできるのかMackerel Meetup #11 Tokyo2018.02.05@kakakakakku
View Slide
吉田慶章 @kakakakakku- 株式会社マクアケ- インフラ, サーバサイド, 認定スクラムマスター, 技術広報など- 趣味は「ブログを書くまで寝ないこと」- http://kakakakakku.hatenablog.com/- 「アウトプット芸人」と呼ばれることも\意識高い系/
去年のアウトプット紹介- 登壇 : 14回 (月1回以上)- ブログ : 77記事 (週1記事以上)
今日伝えたかったことなぜ「食べる, 寝る」は習慣化できるのに「ブログを書く」は習慣化できないのか?
Mackerel & Makuake- もともと Zabbix を使っていた- 2016年6月に Mackerel を導入した- 現在は Mackerel メインで, 一部 Zabbix も併用している
使ってる plugins / check-plugins (一部)- mackerel-plugin-nginx- mackerel-plugin-php-fpm- mackerel-plugin-php-opcache- mackerel-plugin-fluentd- mackerel-plugin-aws-ses- mackerel-plugin-aws-ecs- mackerel-plugin-docker- check-procs- プロセス監視- check-log- ログ監視- check-ntpoffset- NTP オフセット監視
ローリングデプロイをするときに mkr でホストをメンテナンスにmkr : ステータス変更$ mkr update --status maintenanceELBEC2EC2EC2
mkr : ダッシュボード管理$ mkr dashboards generate dashboards/xxx.yml$ git pushダッシュボード定義を Infrastructure as Code 化mkr dashboards pullもあると助かる‼
mkr : 監視ルール管理監視ルールを Infrastructure as Code 化 + CI$ mkr monitors pull$ git push Trigger$ mkr monitors diff
mackerel-agent v0.49.0 以降, 推奨- Docker ホストをモニタリングする場合, 大量のメトリクスを取得してしまう- dm-* ( デバイスマッパー )- veth* ( バーチャルイーサネット )- メトリクス数が 200 を超えると, ホスト1台に換算されてしまう- されていた- mackerel-agent v0.49.0 で修正された
と, ここまでは普通
ECS( Amazon Elastic Container Service )どうやってモニタリングしてますか?
\2/5 19:35 コンテナサポート発表/ちょwwwww
DockerECS コンテナインスタンスALB( 動的ポートマッピング )ECS サービスDockerECSクラスタECS コンテナインスタンスECSタスクECSタスク構成サンプル= 今回の前提
DockerECS コンテナインスタンスALB( 動的ポートマッピング )ECS サービスDockerECSクラスタECS コンテナインスタンスECSタスクECSタスクモニタリングしたくなる箇所mackerel-plugin-gostatsで取得できるメトリクスなど
どうしよう
ECS クラスタmackerel-plugin-aws-ecs- CPUReservation- CPUUtilization- MemoryReservation- MemoryUtilizationECS クラスタ CloudWatch インスタンス2017.12.23 にリリースされた plugin去年まではCloudWatch を見ていた
- mackerel-plugin-aws-ecs は plugin-registry 経由でインストールする- plugin-registry はプラグインを集約する場所- 今後のプラグインは mackerel-agent-plugins には依存しない- オレオレプラグインなどは plugin-registry を利用せずにインストールできる mackerel-plugin-aws-ecs$ mkr plugin install mackerelio/mackerel-plugin-aws-ecsGemfile のように Mkrfile とか作れたら便利かも
plugin-registrybob/mackerel-plugin-bobalice/mackerel-plugin-alicemackerelio/plugin-registrymackerel-plugin-bob.jsonmackerel-plugin-alice.jsonJSON を登録するJSON を登録する
話を ECS に戻すと...
ECS コンテナインスタンス + ECS タスク- 戦略は大きく2種類ある- 1. mackerel-agent コンテナをコンテナインスタンスごとに起動する- タスク配置制約 を One Task Per Host (distinctInstance) にする- 2. コンテナインスタンスに mackerel-agent をインストールする- 普通に EC2 にインストールするのと同じ- CloudWatch でも ECS タスクのメトリクスは取得できない
ECS コンテナインスタンス + ECS タスク1. mackerel-agent コンテナをコンテナインスタンスごとに起動するDockerECS コンテナインスタンスDockerECS コンテナインスタンスECSタスクECSタスク動的ポートマッピングだと,mackerel-agent コンテナ からECS タスク内部のメトリクス(mackerel-plugins を使う系)を取得できず, 断念
ECS コンテナインスタンス + ECS タスク2. コンテナインスタンスに mackerel-agent をインストールするDockerECS コンテナインスタンスDockerECS コンテナインスタンスECSタスクECSタスクcloud-init (User Data) 経由でmackerel-agent をインストールし,「カスタムメトリクス取得スクリプト」も配置している
#!/bin/shif [ "${MACKEREL_AGENT_PLUGIN_META}" != "1" ];thenfor PORT in $(docker ps --format=‘{{.Ports}}’--filter name=xxxxx | cut -f1 -d- | cut -f2 -d:); do/usr/bin/mackerel-plugin-gostats -port ${PORT} -path=/stats-metric-key-prefix=gostats.${PORT}doneelse/usr/bin/mackerel-plugin-gostats -metric-key-prefix=gostats.#fiカスタムメトリクス取得スクリプト( 今回は mackerel-plugin-gostats をサンプルにした )docker ps の結果からポートを取得するカスタムメトリクスのプレフィックスにポートを付与するメタ情報シェル芸
タスク単位 (ポート) で取得できるようになったgostats.32769.memory.memory_sysgostats.32772.memory.memory_sysgostats.32773.memory.memory_sys
次に, ダッシュボードを考えるロールグラフだと ポート部分をワイルドカードにして グラフ表示をすることができない
アドバンスクエリで頑張るhttps://mackerel.io/embed/orgs/xxx/advanced-graph?query=role('yyy:xxx', 'custom.gostats.*.memory.memory_sys')&title=custom.gostats.*.memory.memory_sys&period=1w
DockerECS コンテナインスタンスALB( 動的ポートマッピング )ECS サービスDockerECSクラスタECS コンテナインスタンスECSタスクECSタスク整理するとこうなる
運用してるけど...- オートスケールで ECS コンテナインスタンスが消えることもある- ダッシュボードもアドバンスクエリで頑張るしかない- 絶対にもっと良い方法があるはず- 「コンテナサポート」の詳細を聞かせてください‼
おまけ
Fargate 登場でどう変わる ?今後の話として
AWS FargateFargate の特徴は, コンテナインスタンスの管理から解放されることと,awsvpc ネットワーキングモード前提になったこと ( = 動的 IP マッピング )どうやって ECS タスクをモニタリングしよう?
例えば...?メトリクス取得コンテナ(簡易エージェント)メトリクス取得コンテナ(簡易エージェント)メトリクス取得コンテナ(簡易エージェント)稼働中の NIC 情報を取得インスタンスmackerel-plugin-ecs-task-metrics( ちなみに, Fargate だけじゃなくて, 通常の ECS でも使えて, メリットがある )http 経由
紹介したアーキテクチャは, 既に id:okzk が実装済今日会場に来てます✋MackerelでのECSのタスクのメトリクスの2018年版http://okzk.hatenablog.com/entry/2018/01/28/223245
そもそも?
シンプルに考えるとタスクごとに mackerel-agent コンテナを link するだけで良いはずDockerECS コンテナインスタンスDockerECS コンテナインスタンスECSタスクECSタスクでも「タスク = ホスト」として課金されるのは厳しいので,コンテナ特化の課金体系が欲しい
まとめ
まとめ- Makuake では Mackerel を活用している- plugins / mkr など- Mackerel で ECS (クラスタ, コンテナインスタンス, タスク) をモニタリングできる- plugins だけじゃなく, 多少のシェル芸なども必要- 今後は Fargate 前提の仕組みも考える必要がある- と思ってたけど, 当日まさかの「コンテナサポート」発表(期待)