Mackerelチームのコンテナ開発における戦略とこれから / 190722-cndt2019

87425b9ed1c97009802d66c6aebbfcdb?s=47 Hayato Imai
July 22, 2019
1.2k

Mackerelチームのコンテナ開発における戦略とこれから / 190722-cndt2019

87425b9ed1c97009802d66c6aebbfcdb?s=128

Hayato Imai

July 22, 2019
Tweet

Transcript

  1. Mackerelチームの
 コンテナ開発における戦略とこれから
 CloudNative Days Tokyo 2019


  2. • 今井隼人(id:hayajo_77/@hayajo) • 株式会社はてな(2017/11〜) • Mackerelチーム • SRE 自己紹介
 https://developer.hatenastaff.com/entry/2019/06/10/120000

  3. Mackerel?


  4. None
  5. None
  6. None
  7. コンテナ?


  8. コンテナはOSリソースを隔離・制限したプロセス


  9. VM VM Container Container Container VM Container Runtime Process Process

    Process Guest OS Hypervisor Hardware
  10. None
  11. 今日のゴール


  12. • Mackerelのコンテナ対応への取り組みを知ってもらう ◦ ファーストリリースのゴールはどこか ◦ ゴールを達成するために選択したこと ◦ これからの取り組み 今日のゴール


  13. 話すこと
 • コンテナ対応の開発経緯 • コンテナ対応の概要 • コンテナ監視のこれから

  14. 話さないこと
 • コンテナ対応の利用手順 • コンテナ監視のプラクティス

  15. 早わかりMackerel


  16. Mackerelのアーキテクチャ


  17. コンポーネント
 • mackerel-agent • mackerel-plugin • mackerel

  18. mackerel-agent
 • ホスト情報や定期的に計測されるメトリックをmackerelに送信するプログラ ム ◦ ホスト情報の収集 ◦ OSメトリックの収集 ◦ プラグインの実行とメトリックの収集

    ◦ mackerelへメトリックを投稿 • ホストにインストールして利用する
  19. mackerel-plugin
 • アプリケーション固有のメトリックを収集してmackerel-agent向けの形式に 変換するプログラム • mackerel-agentから定期的に実行される • mackerel-agentと同じホストにインストールして利用する • 公式プラグインだけでなく多くのプラグインが公開されている

  20. mackerel
 • Mackerelサービス本体 ◦ メトリックの保存 ◦ ダッシュボードの提供 ◦ メトリックの監視 ◦

    アラート管理 ◦ クラウドサービス(AWS, Azure)インテグレーション ◦ URL外形監視 • ウェブブラウザやAPIアクセス、mkrコマンドなどで利用する
  21. HOST mackerel-agent mackerel-plugin OS Application CloudService

  22. Mackerelのメトリック


  23. メトリックの種類
 • システムメトリック • カスタムメトリック • サービスメトリック

  24. システムメトリック
 • エージェントが自動的に収集するメトリック • ロードアベレージ、CPU使用率、メモリ使用量、ネットワーク送受信量など

  25. カスタムメトリック
 • プラグインやMackerel本体によるクラウドサービスインテグレーションで収 集するメトリック • アプリケーション固有のメトリックやクラウドサービスに関するメトリックなど • ホスト退役後、一定期間で非表示となる

  26. サービスメトリック
 • エージェントを介さずにMackerelのAPIから投稿するメトリックやMackerel 本体による外形監視のメトリック • PV数やサービスのKPI、レスポンスタイムなど

  27. HOST mackerel-agent mackerel-plugin OS Application カスタムメトリック システムメトリック カスタムメトリック サービスメトリック CloudService

  28. Mackerelのサービス/ロール


  29. サービス/ロール
 • サービス ◦ サービス単位でホストをグループ化 ◦ 「はてなブログ」「はてなブックマーク」 • ロール ◦

    サービスにおける役割単位でホストをグループ化 ◦ 「アプリケーションサーバ」「データベースサーバ」
  30. ロールグラフ


  31. これまでのMackerelにおけるコンテナ監視


  32. これまでのコンテナ監視
 • Dockerプラグイン • ECSプラグイン • ECSインテグレーション

  33. Dockerプラグイン
 • Dockerコンテナを監視するプラグイン • Docker APIからメトリック取得 • Dockerで動く各コンテナのCPU使用率、メモリ使用量、IO使用量を監視 • ホストのカスタムメトリックとして登録

  34. Dockerプラグイン
 HOST mackerel-agent docker-plugin カスタムメトリック docker docker

  35. ECSプラグイン
 • Amazon ECSを監視するプラグイン • Amazon CloudWatchからメトリックを取得 • 指定したECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク数を 監視

    ◦ ECSタスクやコンテナ単位の監視ではないので注意 • ホストのカスタムメトリックとして登録
  36. ECSプラグイン
 HOST mackerel-agent aws-ecs-plugin カスタムメトリック

  37. ECSインテグレーション
 • Amazon ECSを監視するAWSインテグレーション ◦ エージェント不要。Mackerel本体が定期的にメトリックを取得。 • Amazon CloudWatchからメトリックを取得 •

    実行しているECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク 数を監視 • 1 ECSクラスタ/ホスト(マイクロホスト)とし、カスタムメトリックとして登録
  38. ECSインテグレーション
 カスタムメトリック

  39. Mackerelにおけるコンテナ監視の課題


  40. コンテナ同士の関連性
 • DockerプラグインではTask/Podの情報は扱わない • ECS Task, Kubernetes Podのようなコンテナの論理的グループを扱うこと ができない

  41. アプリケーション監視
 • コンテナは環境によってIPアドレス、公開Port、ファイルシステムパスなど が動的に割り当てられる • コンテナで動くアプリケーション固有のメトリック取得にはこれらを解決する ためにプラグインの作り込みが必要

  42. コンテナのメトリックの扱い
 • コンテナのメトリックはカスタムメトリック • ホスト退役後に一定期間で非表示となってしまう

  43. サービス/ロールの設定
 • コンテナはMackerelにおいてホストとして扱われない • 同じ役割をもつコンテナにサービス/ロールを設定して系として監視できな い

  44. コンテナをホストのように扱いたい!


  45. Mackerelコンテナエージェントをリリース


  46. None
  47. ファーストリリースのゴール


  48. ターゲット
 • コンテナオーケストレーションツール・サービスを使ってアプリケーションを 稼働させているユーザー ◦ Amazon ECS(EC2、Fargate)、Kubernetes ◦ オーケストレーションツール・サービス以外でのコンテナ活用は用途が 多岐にわたり、それぞれのユースケースはニッチなのでスコープ外

  49. やること
 • ECS Task/Kubernetes Podをホストとして扱う ◦ “Mackerelではシステムを構成する最小単位をホストとして扱う” • 既存のプラグインを利用可能とする •

    コンテナの基本的なメトリックをシステムメトリックとして登録する • ロールの割当を可能とする • Fargateのようなコンテナネイティブな開発・運用に対応する
  50. やらないこと
 
 
 • コンテナをホストしているノードの監視 ◦ mackerel-agentで監視することを想定 ◦ Fargateのようなコンテナネイティブなサービスでは監視不要 •

    クラスタの監視 ◦ ECSはAWSインテグレーションで監視することを想定 ◦ Kubernetesは運用知見が不足
  51. HOW


  52. Mackerelコンテナエージェント
 • Task/Podのサイドカーコンテナとしてデプロイ • クラスタが提供するAPIからコンテナのメトリックを取得 • アプリケーション固有のメトリックはこれまで同様プラグインを実行して収集 する • 1

    Task/Podにつき1マイクロホストとしてカウント ◦ 30メトリック/マイクロホスト
  53. サイドカーコンテナ?
 • 主となるコンテナを拡張・補助するようなコンテナ ◦ ログ、プロキシ、モニタリングなど ◦ 必要な機能をサイドカーで足していく • コンテナ間でファイルシステムの一部やネットワークなどのリソースを共有 する

    • スコープが限定され実装がシンプル
  54. Task/Pod Container mackerel-container-agent mackerel-plugin Cluster API カスタムメトリック システムメトリック Container Container

  55. Host(Container Instance/Node) mackerel-agentとmackerel-container-agent
 Task/Pod Task/Pod Task/Pod

  56. 完成


  57. ホスト一覧画面


  58. ホスト詳細画面


  59. ロールグラフ


  60. 技術詳細


  61. ECS Taskの監視


  62. ECSのAPI
 • ecs-agentが提供するAPI • Introspection API ◦ コンテナインスタンスやタスクのメタデータを提供 • Task

    Metadata Endpoint version2/3 ◦ タスクのメタデータやコンテナのメトリックを提供
  63. MackerelコンテナエージェントとECSのAPI
 • パブリックベータ時は起動タイプ、ネットワークモードによってそれぞれ異な るAPIを利用していた ◦ EC2(bridge/host): Introspection API + Docker

    API + cgroupfs ◦ EC2(awsvpc): Task Metadata Endpoint version 3 ◦ Fargate(awsvpc): Task Metadata Endpoint version 2 • 正式リリースではTask Metadata Endpoint version3に統一 ◦ Amazon ECS コンテナエージェント バージョン1.26.1以降 ◦ AWS Fargate プラットフォームバージョン 1.3.0以降
  64. bridge Taskネットワーキング
 • ネットワークモードによってメトリックの取得方法が異なる host awsvpc

  65. Kubernetes Podの監視


  66. kubelet API
 • kubeletが提供するAPI • Podのメタデータやメトリック、ログの取得、コマンドのローカル実行のため のAPI • kubelet port(10250/HTTPS)とread-only

    port(10255/HTTP)でLISTEN ◦ readonly-portが無効な環境もある
  67. kubelet APIのAuthN/AuthZ
 • kubelet APIでは認証・認可を設定できる • 認証(Authentication) ◦ 匿名アクセス、クライアント証明書認証、トークン認証 •

    認可(Authorization) ◦ AlwaysAllow、WebHook, RBACなど
  68. Mackerelコンテナエージェントとkubelet API
 • デフォルトではreadonly-portにアクセス • 設定でkubelet portに切り替え可能 ◦ トークン認証をサポート ◦

    “nodes/proxy”, “nodes/stas”, “nodes/spec” へのGETアクセス許可 が必要
  69. e.g. RBAC設定例
 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: mackerel-container-agent-clusterrole

    rules: - apiGroups: - "" resources: - nodes/proxy - nodes/stats - nodes/spec verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: sample-clusterrolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: mackerel-container-agent-clusterrole subjects: - kind: ServiceAccount name: sample-serviceaccount namespace: default
  70. Mackerelコンテナエージェントの課題


  71. カスタムメトリックの表示期間
 • Task/Podが退役するとカスタムメトリックは一 定期間で非表示となる 
 ◦ プラグインで取得したメトリック 
 ◦ Task/Podのシステムメトリックは退役後

    も残るので、ロールグラフによる傾向の 把握は可能
 • 時系列データベースの強化を検討 
 Task/Pod Task/Pod RETIRE
  72. デプロイ
 • Task/Podごとにコンテナエージェントの定義が 必要
 • CDKライブラリやMutatingAdmissionWebhookな ど、デプロイが楽になるようなツールの提供を検 討 Task/Pod Def

    FOO - App FOO - mackerel-container-agent Task/Pod App FOO Task/Pod App BAR Task/Pod App FOO Task/Pod App BAR Task/Pod Def BAR - App BAR - mackerel-container-agent
  73. リソース消費
 • “観察者効果は気にしない ” Mike Julian. 入門 監視. 松浦隼人訳. オライリー・ジャパン,

    2019, 5p • とはいえTask/Podの高集積環境では小さなオー バーヘッドでも気になるかも • DaemonSet型エージェントの提供を検討 HOST
  74. Mackerelのコンテナ監視のこれから


  75. Observabilityの向上
 • Mackerelはメトリックベースの監視サービス
 • 外部のプロファイリング、トレーシング、ロギング関連ツール・サービスとの 連携を検討

  76. チームとしてコンテナクラスタ運用の理解を深める
 • コンテナクラスタ運用のキャッチアップを目的として自前のKubernetesクラ スタを導入
 ◦ 運用に課題があり現在は撤退
 ◦ しかしコンテナクラスタ運用におけるMackerelのドッグフーディングは 必須
 •

    マネージドKubernetesへの移行によるリトライを段階的に進行中

  77. None
  78. まとめ


  79. まとめ
 • ECS Task/Kubernetes Podを監視するコンテナ専用エージェントをリリース
 • Kubernetesクラスタの監視は次フェーズ以降
 • コンテナエージェントの課題解決に向けて開発をすすめる
 •

    コンテナクラスタ運用の知見を深めてコンテナモニタリングのプラクティスを 提供していきたい

  80. curl -sIL mackerel.io | grep career