Mackerelチームの コンテナ開発における戦略とこれから CloudNative Days Tokyo 2019
View Slide
● 今井隼人(id:hayajo_77/@hayajo)● 株式会社はてな(2017/11〜)● Mackerelチーム● SRE自己紹介 https://developer.hatenastaff.com/entry/2019/06/10/120000
Mackerel?
コンテナ?
コンテナはOSリソースを隔離・制限したプロセス
VM VMContainerContainerContainerVMContainerRuntimeProcessProcessProcessGuest OSHypervisorHardware
今日のゴール
● Mackerelのコンテナ対応への取り組みを知ってもらう○ ファーストリリースのゴールはどこか○ ゴールを達成するために選択したこと○ これからの取り組み今日のゴール
話すこと ● コンテナ対応の開発経緯● コンテナ対応の概要● コンテナ監視のこれから
話さないこと ● コンテナ対応の利用手順● コンテナ監視のプラクティス
早わかりMackerel
Mackerelのアーキテクチャ
コンポーネント ● mackerel-agent● mackerel-plugin● mackerel
mackerel-agent ● ホスト情報や定期的に計測されるメトリックをmackerelに送信するプログラム○ ホスト情報の収集○ OSメトリックの収集○ プラグインの実行とメトリックの収集○ mackerelへメトリックを投稿● ホストにインストールして利用する
mackerel-plugin ● アプリケーション固有のメトリックを収集してmackerel-agent向けの形式に変換するプログラム● mackerel-agentから定期的に実行される● mackerel-agentと同じホストにインストールして利用する● 公式プラグインだけでなく多くのプラグインが公開されている
mackerel ● Mackerelサービス本体○ メトリックの保存○ ダッシュボードの提供○ メトリックの監視○ アラート管理○ クラウドサービス(AWS, Azure)インテグレーション○ URL外形監視● ウェブブラウザやAPIアクセス、mkrコマンドなどで利用する
HOSTmackerel-agentmackerel-pluginOSApplicationCloudService
Mackerelのメトリック
メトリックの種類 ● システムメトリック● カスタムメトリック● サービスメトリック
システムメトリック ● エージェントが自動的に収集するメトリック● ロードアベレージ、CPU使用率、メモリ使用量、ネットワーク送受信量など
カスタムメトリック ● プラグインやMackerel本体によるクラウドサービスインテグレーションで収集するメトリック● アプリケーション固有のメトリックやクラウドサービスに関するメトリックなど● ホスト退役後、一定期間で非表示となる
サービスメトリック ● エージェントを介さずにMackerelのAPIから投稿するメトリックやMackerel本体による外形監視のメトリック● PV数やサービスのKPI、レスポンスタイムなど
HOSTmackerel-agentmackerel-pluginOSApplicationカスタムメトリックシステムメトリックカスタムメトリックサービスメトリックCloudService
Mackerelのサービス/ロール
サービス/ロール ● サービス○ サービス単位でホストをグループ化○ 「はてなブログ」「はてなブックマーク」● ロール○ サービスにおける役割単位でホストをグループ化○ 「アプリケーションサーバ」「データベースサーバ」
ロールグラフ
これまでのMackerelにおけるコンテナ監視
これまでのコンテナ監視 ● Dockerプラグイン● ECSプラグイン● ECSインテグレーション
Dockerプラグイン ● Dockerコンテナを監視するプラグイン● Docker APIからメトリック取得● Dockerで動く各コンテナのCPU使用率、メモリ使用量、IO使用量を監視● ホストのカスタムメトリックとして登録
Dockerプラグイン HOSTmackerel-agentdocker-pluginカスタムメトリックdocker docker
ECSプラグイン ● Amazon ECSを監視するプラグイン● Amazon CloudWatchからメトリックを取得● 指定したECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク数を監視○ ECSタスクやコンテナ単位の監視ではないので注意● ホストのカスタムメトリックとして登録
ECSプラグイン HOSTmackerel-agentaws-ecs-pluginカスタムメトリック
ECSインテグレーション ● Amazon ECSを監視するAWSインテグレーション○ エージェント不要。Mackerel本体が定期的にメトリックを取得。● Amazon CloudWatchからメトリックを取得● 実行しているECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク数を監視● 1 ECSクラスタ/ホスト(マイクロホスト)とし、カスタムメトリックとして登録
ECSインテグレーション カスタムメトリック
Mackerelにおけるコンテナ監視の課題
コンテナ同士の関連性 ● DockerプラグインではTask/Podの情報は扱わない● ECS Task, Kubernetes Podのようなコンテナの論理的グループを扱うことができない
アプリケーション監視 ● コンテナは環境によってIPアドレス、公開Port、ファイルシステムパスなどが動的に割り当てられる● コンテナで動くアプリケーション固有のメトリック取得にはこれらを解決するためにプラグインの作り込みが必要
コンテナのメトリックの扱い ● コンテナのメトリックはカスタムメトリック● ホスト退役後に一定期間で非表示となってしまう
サービス/ロールの設定 ● コンテナはMackerelにおいてホストとして扱われない● 同じ役割をもつコンテナにサービス/ロールを設定して系として監視できない
コンテナをホストのように扱いたい!
Mackerelコンテナエージェントをリリース
ファーストリリースのゴール
ターゲット ● コンテナオーケストレーションツール・サービスを使ってアプリケーションを稼働させているユーザー○ Amazon ECS(EC2、Fargate)、Kubernetes○ オーケストレーションツール・サービス以外でのコンテナ活用は用途が多岐にわたり、それぞれのユースケースはニッチなのでスコープ外
やること ● ECS Task/Kubernetes Podをホストとして扱う○ “Mackerelではシステムを構成する最小単位をホストとして扱う”● 既存のプラグインを利用可能とする● コンテナの基本的なメトリックをシステムメトリックとして登録する● ロールの割当を可能とする● Fargateのようなコンテナネイティブな開発・運用に対応する
やらないこと ● コンテナをホストしているノードの監視○ mackerel-agentで監視することを想定○ Fargateのようなコンテナネイティブなサービスでは監視不要● クラスタの監視○ ECSはAWSインテグレーションで監視することを想定○ Kubernetesは運用知見が不足
HOW
Mackerelコンテナエージェント ● Task/Podのサイドカーコンテナとしてデプロイ● クラスタが提供するAPIからコンテナのメトリックを取得● アプリケーション固有のメトリックはこれまで同様プラグインを実行して収集する● 1 Task/Podにつき1マイクロホストとしてカウント○ 30メトリック/マイクロホスト
サイドカーコンテナ? ● 主となるコンテナを拡張・補助するようなコンテナ○ ログ、プロキシ、モニタリングなど○ 必要な機能をサイドカーで足していく● コンテナ間でファイルシステムの一部やネットワークなどのリソースを共有する● スコープが限定され実装がシンプル
Task/PodContainermackerel-container-agentmackerel-pluginCluster APIカスタムメトリックシステムメトリックContainerContainer
Host(Container Instance/Node)mackerel-agentとmackerel-container-agent Task/Pod Task/PodTask/Pod
完成
ホスト一覧画面
ホスト詳細画面
技術詳細
ECS Taskの監視
ECSのAPI ● ecs-agentが提供するAPI● Introspection API○ コンテナインスタンスやタスクのメタデータを提供● Task Metadata Endpoint version2/3○ タスクのメタデータやコンテナのメトリックを提供
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以降
bridgeTaskネットワーキング ● ネットワークモードによってメトリックの取得方法が異なるhost awsvpc
Kubernetes Podの監視
kubelet API ● kubeletが提供するAPI● Podのメタデータやメトリック、ログの取得、コマンドのローカル実行のためのAPI● kubelet port(10250/HTTPS)とread-only port(10255/HTTP)でLISTEN○ readonly-portが無効な環境もある
kubelet APIのAuthN/AuthZ ● kubelet APIでは認証・認可を設定できる● 認証(Authentication)○ 匿名アクセス、クライアント証明書認証、トークン認証● 認可(Authorization)○ AlwaysAllow、WebHook, RBACなど
Mackerelコンテナエージェントとkubelet API ● デフォルトではreadonly-portにアクセス● 設定でkubelet portに切り替え可能○ トークン認証をサポート○ “nodes/proxy”, “nodes/stas”, “nodes/spec” へのGETアクセス許可が必要
e.g. RBAC設定例 ---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: mackerel-container-agent-clusterrolerules:- apiGroups:- ""resources:- nodes/proxy- nodes/stats- nodes/specverbs:- get---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: sample-clusterrolebindingroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: mackerel-container-agent-clusterrolesubjects:- kind: ServiceAccountname: sample-serviceaccountnamespace: default
Mackerelコンテナエージェントの課題
カスタムメトリックの表示期間 ● Task/Podが退役するとカスタムメトリックは一定期間で非表示となる ○ プラグインで取得したメトリック ○ Task/Podのシステムメトリックは退役後も残るので、ロールグラフによる傾向の把握は可能 ● 時系列データベースの強化を検討 Task/PodTask/PodRETIRE
デプロイ ● Task/Podごとにコンテナエージェントの定義が必要 ● CDKライブラリやMutatingAdmissionWebhookなど、デプロイが楽になるようなツールの提供を検討Task/Pod Def FOO- App FOO- mackerel-container-agentTask/PodApp FOOTask/PodApp BARTask/PodApp FOOTask/PodApp BARTask/Pod Def BAR- App BAR- mackerel-container-agent
リソース消費 ● “観察者効果は気にしない ”Mike Julian. 入門 監視. 松浦隼人訳. オライリー・ジャパン,2019, 5p● とはいえTask/Podの高集積環境では小さなオーバーヘッドでも気になるかも● DaemonSet型エージェントの提供を検討HOST
Mackerelのコンテナ監視のこれから
Observabilityの向上 ● Mackerelはメトリックベースの監視サービス ● 外部のプロファイリング、トレーシング、ロギング関連ツール・サービスとの連携を検討
チームとしてコンテナクラスタ運用の理解を深める ● コンテナクラスタ運用のキャッチアップを目的として自前のKubernetesクラスタを導入 ○ 運用に課題があり現在は撤退 ○ しかしコンテナクラスタ運用におけるMackerelのドッグフーディングは必須 ● マネージドKubernetesへの移行によるリトライを段階的に進行中
まとめ
まとめ ● ECS Task/Kubernetes Podを監視するコンテナ専用エージェントをリリース ● Kubernetesクラスタの監視は次フェーズ以降 ● コンテナエージェントの課題解決に向けて開発をすすめる ● コンテナクラスタ運用の知見を深めてコンテナモニタリングのプラクティスを提供していきたい
curl -sIL mackerel.io | grep career