Mackerel で ECS をどこまでモニタリングできるのか / Monitoring ECS with Mackerel
by
Yoshiaki Yoshida
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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 前提の仕組みも考える必要がある - と思ってたけど, 当日まさかの「コンテナサポート」発表(期待)