$30 off During Our Annual Pro Sale. View Details »

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

Hayato Imai
July 22, 2019
1.6k

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

Hayato Imai

July 22, 2019
Tweet

More Decks by Hayato Imai

Transcript

  1. Mackerelチームの

    コンテナ開発における戦略とこれから

    CloudNative Days Tokyo 2019


    View Slide

  2. ● 今井隼人(id:hayajo_77/@hayajo)
    ● 株式会社はてな(2017/11〜)
    ● Mackerelチーム
    ● SRE
    自己紹介

    https://developer.hatenastaff.com/entry/2019/06/10/120000

    View Slide

  3. Mackerel?


    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. コンテナ?


    View Slide

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


    View Slide

  9. VM VM
    Container
    Container
    Container
    VM
    Container
    Runtime
    Process
    Process
    Process
    Guest OS
    Hypervisor
    Hardware

    View Slide

  10. View Slide

  11. 今日のゴール


    View Slide

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


    View Slide

  13. 話すこと

    ● コンテナ対応の開発経緯
    ● コンテナ対応の概要
    ● コンテナ監視のこれから

    View Slide

  14. 話さないこと

    ● コンテナ対応の利用手順
    ● コンテナ監視のプラクティス

    View Slide

  15. 早わかりMackerel


    View Slide

  16. Mackerelのアーキテクチャ


    View Slide

  17. コンポーネント

    ● mackerel-agent
    ● mackerel-plugin
    ● mackerel

    View Slide

  18. mackerel-agent

    ● ホスト情報や定期的に計測されるメトリックをmackerelに送信するプログラ

    ○ ホスト情報の収集
    ○ OSメトリックの収集
    ○ プラグインの実行とメトリックの収集
    ○ mackerelへメトリックを投稿
    ● ホストにインストールして利用する

    View Slide

  19. mackerel-plugin

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

    View Slide

  20. mackerel

    ● Mackerelサービス本体
    ○ メトリックの保存
    ○ ダッシュボードの提供
    ○ メトリックの監視
    ○ アラート管理
    ○ クラウドサービス(AWS, Azure)インテグレーション
    ○ URL外形監視
    ● ウェブブラウザやAPIアクセス、mkrコマンドなどで利用する

    View Slide

  21. HOST
    mackerel-agent
    mackerel-plugin
    OS
    Application
    CloudService

    View Slide

  22. Mackerelのメトリック


    View Slide

  23. メトリックの種類

    ● システムメトリック
    ● カスタムメトリック
    ● サービスメトリック

    View Slide

  24. システムメトリック

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

    View Slide

  25. カスタムメトリック

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

    View Slide

  26. サービスメトリック

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

    View Slide

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

    View Slide

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


    View Slide

  29. サービス/ロール

    ● サービス
    ○ サービス単位でホストをグループ化
    ○ 「はてなブログ」「はてなブックマーク」
    ● ロール
    ○ サービスにおける役割単位でホストをグループ化
    ○ 「アプリケーションサーバ」「データベースサーバ」

    View Slide

  30. ロールグラフ


    View Slide

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


    View Slide

  32. これまでのコンテナ監視

    ● Dockerプラグイン
    ● ECSプラグイン
    ● ECSインテグレーション

    View Slide

  33. Dockerプラグイン

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

    View Slide

  34. Dockerプラグイン

    HOST
    mackerel-agent
    docker-plugin
    カスタムメトリック
    docker docker

    View Slide

  35. ECSプラグイン

    ● Amazon ECSを監視するプラグイン
    ● Amazon CloudWatchからメトリックを取得
    ● 指定したECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク数を
    監視
    ○ ECSタスクやコンテナ単位の監視ではないので注意
    ● ホストのカスタムメトリックとして登録

    View Slide

  36. ECSプラグイン

    HOST
    mackerel-agent
    aws-ecs-plugin
    カスタムメトリック

    View Slide

  37. ECSインテグレーション

    ● Amazon ECSを監視するAWSインテグレーション
    ○ エージェント不要。Mackerel本体が定期的にメトリックを取得。
    ● Amazon CloudWatchからメトリックを取得
    ● 実行しているECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク
    数を監視
    ● 1 ECSクラスタ/ホスト(マイクロホスト)とし、カスタムメトリックとして登録

    View Slide

  38. ECSインテグレーション

    カスタムメトリック

    View Slide

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


    View Slide

  40. コンテナ同士の関連性

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

    View Slide

  41. アプリケーション監視

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

    View Slide

  42. コンテナのメトリックの扱い

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

    View Slide

  43. サービス/ロールの設定

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

    View Slide

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


    View Slide

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


    View Slide

  46. View Slide

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


    View Slide

  48. ターゲット

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

    View Slide

  49. やること

    ● ECS Task/Kubernetes Podをホストとして扱う
    ○ “Mackerelではシステムを構成する最小単位をホストとして扱う”
    ● 既存のプラグインを利用可能とする
    ● コンテナの基本的なメトリックをシステムメトリックとして登録する
    ● ロールの割当を可能とする
    ● Fargateのようなコンテナネイティブな開発・運用に対応する

    View Slide

  50. やらないこと



    ● コンテナをホストしているノードの監視
    ○ mackerel-agentで監視することを想定
    ○ Fargateのようなコンテナネイティブなサービスでは監視不要
    ● クラスタの監視
    ○ ECSはAWSインテグレーションで監視することを想定
    ○ Kubernetesは運用知見が不足

    View Slide

  51. HOW


    View Slide

  52. Mackerelコンテナエージェント

    ● Task/Podのサイドカーコンテナとしてデプロイ
    ● クラスタが提供するAPIからコンテナのメトリックを取得
    ● アプリケーション固有のメトリックはこれまで同様プラグインを実行して収集
    する
    ● 1 Task/Podにつき1マイクロホストとしてカウント
    ○ 30メトリック/マイクロホスト

    View Slide

  53. サイドカーコンテナ?

    ● 主となるコンテナを拡張・補助するようなコンテナ
    ○ ログ、プロキシ、モニタリングなど
    ○ 必要な機能をサイドカーで足していく
    ● コンテナ間でファイルシステムの一部やネットワークなどのリソースを共有
    する
    ● スコープが限定され実装がシンプル

    View Slide

  54. Task/Pod
    Container
    mackerel-container-agent
    mackerel-plugin
    Cluster API
    カスタムメトリック
    システムメトリック
    Container
    Container

    View Slide

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

    Task/Pod Task/Pod
    Task/Pod

    View Slide

  56. 完成


    View Slide

  57. ホスト一覧画面


    View Slide

  58. ホスト詳細画面


    View Slide

  59. ロールグラフ


    View Slide

  60. 技術詳細


    View Slide

  61. ECS Taskの監視


    View Slide

  62. ECSのAPI

    ● ecs-agentが提供するAPI
    ● Introspection API
    ○ コンテナインスタンスやタスクのメタデータを提供
    ● Task Metadata Endpoint version2/3
    ○ タスクのメタデータやコンテナのメトリックを提供

    View Slide

  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以降

    View Slide

  64. bridge
    Taskネットワーキング

    ● ネットワークモードによってメトリックの取得方法が異なる
    host awsvpc

    View Slide

  65. Kubernetes Podの監視


    View Slide

  66. kubelet API

    ● kubeletが提供するAPI
    ● Podのメタデータやメトリック、ログの取得、コマンドのローカル実行のため
    のAPI
    ● kubelet port(10250/HTTPS)とread-only port(10255/HTTP)でLISTEN
    ○ readonly-portが無効な環境もある

    View Slide

  67. kubelet APIのAuthN/AuthZ

    ● kubelet APIでは認証・認可を設定できる
    ● 認証(Authentication)
    ○ 匿名アクセス、クライアント証明書認証、トークン認証
    ● 認可(Authorization)
    ○ AlwaysAllow、WebHook, RBACなど

    View Slide

  68. Mackerelコンテナエージェントとkubelet API

    ● デフォルトではreadonly-portにアクセス
    ● 設定でkubelet portに切り替え可能
    ○ トークン認証をサポート
    ○ “nodes/proxy”, “nodes/stas”, “nodes/spec” へのGETアクセス許可
    が必要

    View Slide

  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

    View Slide

  70. Mackerelコンテナエージェントの課題


    View Slide

  71. カスタムメトリックの表示期間

    ● Task/Podが退役するとカスタムメトリックは一
    定期間で非表示となる 

    ○ プラグインで取得したメトリック 

    ○ Task/Podのシステムメトリックは退役後
    も残るので、ロールグラフによる傾向の
    把握は可能

    ● 時系列データベースの強化を検討 

    Task/Pod
    Task/Pod
    RETIRE

    View Slide

  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

    View Slide

  73. リソース消費

    ● “観察者効果は気にしない ”
    Mike Julian. 入門 監視. 松浦隼人訳. オライリー・ジャパン,
    2019, 5p
    ● とはいえTask/Podの高集積環境では小さなオー
    バーヘッドでも気になるかも
    ● DaemonSet型エージェントの提供を検討
    HOST

    View Slide

  74. Mackerelのコンテナ監視のこれから


    View Slide

  75. Observabilityの向上

    ● Mackerelはメトリックベースの監視サービス

    ● 外部のプロファイリング、トレーシング、ロギング関連ツール・サービスとの
    連携を検討

    View Slide

  76. チームとしてコンテナクラスタ運用の理解を深める

    ● コンテナクラスタ運用のキャッチアップを目的として自前のKubernetesクラ
    スタを導入

    ○ 運用に課題があり現在は撤退

    ○ しかしコンテナクラスタ運用におけるMackerelのドッグフーディングは
    必須

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


    View Slide

  77. View Slide

  78. まとめ


    View Slide

  79. まとめ

    ● ECS Task/Kubernetes Podを監視するコンテナ専用エージェントをリリース

    ● Kubernetesクラスタの監視は次フェーズ以降

    ● コンテナエージェントの課題解決に向けて開発をすすめる

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


    View Slide

  80. curl -sIL mackerel.io | grep career

    View Slide