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 前提の仕組みも考える必要がある - と思ってたけど, 当日まさかの「コンテナサポート」発表(期待)