Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Mackerelチームのコンテナ開発における戦略とこれから / 190722-cndt2019
Hayato Imai
July 22, 2019
1
1.3k
Mackerelチームのコンテナ開発における戦略とこれから / 190722-cndt2019
Hayato Imai
July 22, 2019
Tweet
Share
More Decks by Hayato Imai
See All by Hayato Imai
hayajo
2
920
hayajo
19
7.1k
hayajo
0
2.4k
hayajo
6
1.1k
hayajo
1
3.8k
hayajo
16
9.4k
hayajo
0
250
hayajo
1
2.9k
hayajo
3
1.7k
Featured
See All Featured
lara
15
2.7k
philhawksworth
190
17k
frogandcode
128
20k
jakevdp
775
200k
samlambert
237
10k
qrush
285
19k
sachag
446
36k
notwaldorf
17
1.8k
hannesfritz
28
950
mongodb
23
3.9k
holman
447
130k
ufuk
56
5.4k
Transcript
Mackerelチームの コンテナ開発における戦略とこれから CloudNative Days Tokyo 2019
• 今井隼人(id:hayajo_77/@hayajo) • 株式会社はてな(2017/11〜) • Mackerelチーム • SRE 自己紹介 https://developer.hatenastaff.com/entry/2019/06/10/120000
Mackerel?
None
None
None
コンテナ?
コンテナはOSリソースを隔離・制限したプロセス
VM VM Container Container Container VM Container Runtime Process Process
Process Guest OS Hypervisor Hardware
None
今日のゴール
• 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コマンドなどで利用する
HOST mackerel-agent mackerel-plugin OS Application CloudService
Mackerelのメトリック
メトリックの種類 • システムメトリック • カスタムメトリック • サービスメトリック
システムメトリック • エージェントが自動的に収集するメトリック • ロードアベレージ、CPU使用率、メモリ使用量、ネットワーク送受信量など
カスタムメトリック • プラグインやMackerel本体によるクラウドサービスインテグレーションで収 集するメトリック • アプリケーション固有のメトリックやクラウドサービスに関するメトリックなど • ホスト退役後、一定期間で非表示となる
サービスメトリック • エージェントを介さずにMackerelのAPIから投稿するメトリックやMackerel 本体による外形監視のメトリック • PV数やサービスのKPI、レスポンスタイムなど
HOST mackerel-agent mackerel-plugin OS Application カスタムメトリック システムメトリック カスタムメトリック サービスメトリック CloudService
Mackerelのサービス/ロール
サービス/ロール • サービス ◦ サービス単位でホストをグループ化 ◦ 「はてなブログ」「はてなブックマーク」 • ロール ◦
サービスにおける役割単位でホストをグループ化 ◦ 「アプリケーションサーバ」「データベースサーバ」
ロールグラフ
これまでのMackerelにおけるコンテナ監視
これまでのコンテナ監視 • Dockerプラグイン • ECSプラグイン • ECSインテグレーション
Dockerプラグイン • Dockerコンテナを監視するプラグイン • Docker APIからメトリック取得 • Dockerで動く各コンテナのCPU使用率、メモリ使用量、IO使用量を監視 • ホストのカスタムメトリックとして登録
Dockerプラグイン HOST mackerel-agent docker-plugin カスタムメトリック docker docker
ECSプラグイン • Amazon ECSを監視するプラグイン • Amazon CloudWatchからメトリックを取得 • 指定したECSクラスタ/サービスのCPU使用率、メモリ使用量、タスク数を 監視
◦ ECSタスクやコンテナ単位の監視ではないので注意 • ホストのカスタムメトリックとして登録
ECSプラグイン HOST mackerel-agent aws-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コンテナエージェントをリリース
None
ファーストリリースのゴール
ターゲット • コンテナオーケストレーションツール・サービスを使ってアプリケーションを 稼働させているユーザー ◦ 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/Pod Container mackerel-container-agent mackerel-plugin Cluster API カスタムメトリック システムメトリック Container Container
Host(Container Instance/Node) mackerel-agentとmackerel-container-agent Task/Pod Task/Pod Task/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以降
bridge Taskネットワーキング • ネットワークモードによってメトリックの取得方法が異なる 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/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
Mackerelコンテナエージェントの課題
カスタムメトリックの表示期間 • Task/Podが退役するとカスタムメトリックは一 定期間で非表示となる ◦ プラグインで取得したメトリック ◦ Task/Podのシステムメトリックは退役後
も残るので、ロールグラフによる傾向の 把握は可能 • 時系列データベースの強化を検討 Task/Pod Task/Pod RETIRE
デプロイ • 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
リソース消費 • “観察者効果は気にしない ” Mike Julian. 入門 監視. 松浦隼人訳. オライリー・ジャパン,
2019, 5p • とはいえTask/Podの高集積環境では小さなオー バーヘッドでも気になるかも • DaemonSet型エージェントの提供を検討 HOST
Mackerelのコンテナ監視のこれから
Observabilityの向上 • Mackerelはメトリックベースの監視サービス • 外部のプロファイリング、トレーシング、ロギング関連ツール・サービスとの 連携を検討
チームとしてコンテナクラスタ運用の理解を深める • コンテナクラスタ運用のキャッチアップを目的として自前のKubernetesクラ スタを導入 ◦ 運用に課題があり現在は撤退 ◦ しかしコンテナクラスタ運用におけるMackerelのドッグフーディングは 必須 •
マネージドKubernetesへの移行によるリトライを段階的に進行中
None
まとめ
まとめ • ECS Task/Kubernetes Podを監視するコンテナ専用エージェントをリリース • Kubernetesクラスタの監視は次フェーズ以降 • コンテナエージェントの課題解決に向けて開発をすすめる •
コンテナクラスタ運用の知見を深めてコンテナモニタリングのプラクティスを 提供していきたい
curl -sIL mackerel.io | grep career