Mackerel で ECS をどこまでモニタリングできるのか / Monitoring ECS with Mackerel
by
Yoshiaki Yoshida
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Mackerel で ECS を どこまでモニタリングできるのか Mackerel Meetup #11 Tokyo 2018.02.05 @kakakakakku
Slide 2
Slide 2 text
吉田慶章 @kakakakakku - 株式会社マクアケ - インフラ, サーバサイド, 認定スクラムマスター, 技術広報など - 趣味は「ブログを書くまで寝ないこと」 - http://kakakakakku.hatenablog.com/ - 「アウトプット芸人」と呼ばれることも \意識高い系/
Slide 3
Slide 3 text
去年のアウトプット紹介 - 登壇 : 14回 (月1回以上) - ブログ : 77記事 (週1記事以上)
Slide 4
Slide 4 text
今日伝えたかったこと なぜ「食べる, 寝る」は習慣化できるのに 「ブログを書く」は習慣化できないのか?
Slide 5
Slide 5 text
Mackerel & Makuake - もともと Zabbix を使っていた - 2016年6月に Mackerel を導入した - 現在は Mackerel メインで, 一部 Zabbix も併用している
Slide 6
Slide 6 text
使ってる 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 オフセット監視
Slide 7
Slide 7 text
ローリングデプロイをするときに mkr でホストをメンテナンスに mkr : ステータス変更 $ mkr update --status maintenance ELB EC2 EC2 EC2
Slide 8
Slide 8 text
mkr : ダッシュボード管理 $ mkr dashboards generate dashboards/xxx.yml $ git push ダッシュボード定義を Infrastructure as Code 化 mkr dashboards pull もあると助かる‼
Slide 9
Slide 9 text
mkr : 監視ルール管理 監視ルールを Infrastructure as Code 化 + CI $ mkr monitors pull $ git push Trigger $ mkr monitors diff
Slide 10
Slide 10 text
mackerel-agent v0.49.0 以降, 推奨 - Docker ホストをモニタリングする場合, 大量のメトリクスを取得してしまう - dm-* ( デバイスマッパー ) - veth* ( バーチャルイーサネット ) - メトリクス数が 200 を超えると, ホスト1台に換算されてしまう - されていた - mackerel-agent v0.49.0 で修正された
Slide 11
Slide 11 text
と, ここまでは普通
Slide 12
Slide 12 text
ECS ( Amazon Elastic Container Service ) どうやって モニタリングしてますか?
Slide 13
Slide 13 text
\2/5 19:35 コンテナサポート発表/ ちょwwwww
Slide 14
Slide 14 text
Docker ECS コンテナ インスタンス ALB ( 動的ポートマッピング ) ECS サービス Docker ECS クラスタ ECS コンテナ インスタンス ECS タスク ECS タスク 構成サンプル = 今回の前提
Slide 15
Slide 15 text
Docker ECS コンテナ インスタンス ALB ( 動的ポートマッピング ) ECS サービス Docker ECS クラスタ ECS コンテナ インスタンス ECS タスク ECS タスク モニタリングしたくなる箇所 mackerel- plugin-gostats で取得できる メトリクスなど
Slide 16
Slide 16 text
どうしよう
Slide 17
Slide 17 text
ECS クラスタ mackerel-plugin-aws-ecs - CPUReservation - CPUUtilization - MemoryReservation - MemoryUtilization ECS クラスタ CloudWatch インスタンス 2017.12.23 に リリースされた plugin 去年までは CloudWatch を見ていた
Slide 18
Slide 18 text
- mackerel-plugin-aws-ecs は plugin-registry 経由でインストールする - plugin-registry はプラグインを集約する場所 - 今後のプラグインは mackerel-agent-plugins には依存しない - オレオレプラグインなどは plugin-registry を利用せずにインストールできる mackerel-plugin-aws-ecs $ mkr plugin install mackerelio/mackerel-plugin-aws-ecs Gemfile のように Mkrfile とか作れたら便利かも
Slide 19
Slide 19 text
plugin-registry bob/mackerel-plugin-bob alice/mackerel-plugin-alice mackerelio/plugin-registry mackerel-plugin-bob.json mackerel-plugin-alice.json JSON を登録する JSON を登録する
Slide 20
Slide 20 text
話を ECS に戻すと...
Slide 21
Slide 21 text
ECS コンテナインスタンス + ECS タスク - 戦略は大きく2種類ある - 1. mackerel-agent コンテナをコンテナインスタンスごとに起動する - タスク配置制約 を One Task Per Host (distinctInstance) にする - 2. コンテナインスタンスに mackerel-agent をインストールする - 普通に EC2 にインストールするのと同じ - CloudWatch でも ECS タスクのメトリクスは取得できない
Slide 22
Slide 22 text
ECS コンテナインスタンス + ECS タスク 1. mackerel-agent コンテナをコンテナインスタンスごとに起動する Docker ECS コンテナ インスタンス Docker ECS コンテナ インスタンス ECS タスク ECS タスク 動的ポートマッピングだと, mackerel-agent コンテナ から ECS タスク内部のメトリクス (mackerel-plugins を使う系) を取得できず, 断念
Slide 23
Slide 23 text
ECS コンテナインスタンス + ECS タスク 2. コンテナインスタンスに mackerel-agent をインストールする Docker ECS コンテナ インスタンス Docker ECS コンテナ インスタンス ECS タスク ECS タスク cloud-init (User Data) 経由で mackerel-agent をインストールし, 「カスタムメトリクス取得スクリプト」 も配置している
Slide 24
Slide 24 text
#!/bin/sh if [ "${MACKEREL_AGENT_PLUGIN_META}" != "1" ];then for 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} done else /usr/bin/mackerel-plugin-gostats -metric-key-prefix=gostats.# fi カスタムメトリクス取得スクリプト ( 今回は mackerel-plugin-gostats をサンプルにした ) docker ps の結果からポートを取得する カスタムメトリクスの プレフィックスにポートを付与する メタ情報 シェル芸
Slide 25
Slide 25 text
タスク単位 (ポート) で取得できるようになった gostats.32769.memory.memory_sys gostats.32772.memory.memory_sys gostats.32773.memory.memory_sys
Slide 26
Slide 26 text
次に, ダッシュボードを考える ロールグラフだと ポート部分をワイルドカードにして グラフ表示をすることができない
Slide 27
Slide 27 text
アドバンスクエリで頑張る 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
Slide 28
Slide 28 text
Docker ECS コンテナ インスタンス ALB ( 動的ポートマッピング ) ECS サービス Docker ECS クラスタ ECS コンテナ インスタンス ECS タスク ECS タスク 整理するとこうなる
Slide 29
Slide 29 text
運用してるけど... - オートスケールで ECS コンテナインスタンスが消えることもある - ダッシュボードもアドバンスクエリで頑張るしかない - 絶対にもっと良い方法があるはず - 「コンテナサポート」の詳細を聞かせてください‼
Slide 30
Slide 30 text
おまけ
Slide 31
Slide 31 text
Fargate 登場でどう変わる ? 今後の話として
Slide 32
Slide 32 text
AWS Fargate Fargate の特徴は, コンテナインスタンスの管理から解放されることと, awsvpc ネットワーキングモード前提になったこと ( = 動的 IP マッピング ) どうやって ECS タスクをモニタリングしよう?
Slide 33
Slide 33 text
例えば...? メトリクス取得 コンテナ (簡易エージェント) メトリクス取得 コンテナ (簡易エージェント) メトリクス取得 コンテナ (簡易エージェント) 稼働中の NIC 情報を取得 インスタンス mackerel-plugin- ecs-task-metrics ( ちなみに, Fargate だけじゃなくて, 通常の ECS でも使えて, メリットがある ) http 経由
Slide 34
Slide 34 text
紹介したアーキテクチャは, 既に id:okzk が実装済 今日会場に来てます✋ MackerelでのECSのタスクのメトリクスの2018年版 http://okzk.hatenablog.com/entry/2018/01/28/223245
Slide 35
Slide 35 text
そもそも?
Slide 36
Slide 36 text
シンプルに考えると タスクごとに mackerel-agent コンテナを link するだけで良いはず Docker ECS コンテナ インスタンス Docker ECS コンテナ インスタンス ECS タスク ECS タスク でも「タスク = ホスト」として 課金されるのは厳しいので, コンテナ特化の課金体系が欲しい
Slide 37
Slide 37 text
まとめ
Slide 38
Slide 38 text
まとめ - Makuake では Mackerel を活用している - plugins / mkr など - Mackerel で ECS (クラスタ, コンテナインスタンス, タスク) をモニタリングできる - plugins だけじゃなく, 多少のシェル芸なども必要 - 今後は Fargate 前提の仕組みも考える必要がある - と思ってたけど, 当日まさかの「コンテナサポート」発表(期待)