Successfully reported this slideshow.
Your SlideShare is downloading. ×

PrometheusによるKubernetes環境の異常検知改善.pptx

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 54 Ad
Advertisement

More Related Content

Recently uploaded (20)

Advertisement

PrometheusによるKubernetes環境の異常検知改善.pptx

  1. 1. 1 PrometheusによるKubernetes環境の異常検知改善 GMOインターネットグループ株式会社 グループ研究開発本部 次世代システム研究室
  2. 2. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 信頼性の向上 • まとめ 2
  3. 3. モチベーション 運用している認証サービスのログイン障害をなくしたい 認証サービスはグループ内で提供しているサービスで共通で使っている 認証サービスが稼働していないと連携サービスも利用できなくなる そのため高い稼働率が求められる 3
  4. 4. • これまでのアプローチ 認証サービスで障害が発生する 認証サービスで障害が発生していることを検知する 開発者にオンコールで通知する 障害箇所を特定して復旧する 以下ごめんなさい活動に続く 4
  5. 5. • 改善の理想形 認証サービスで障害が発生しそうな状況を検知する 開発者にSlackやオンコールで通知する 障害が発生する前に対策する GMO IDで障害が発生する GMO IDで障害が発生していることを検知する 開発者にオンコールで通知する 障害箇所を特定して復旧する 以下ごめんなさい活動に続く 5
  6. 6. • ログイン機能障害のパターン 内部要因 システムリソース不足 システムダウン(クラウド基盤障害) アプリケーションエラー 外部要因 DoS攻撃等 その他 6
  7. 7. • 2年間で発生した障害のログイン機能への影響 7 原因/影響(件数) 影響なし 遅延発生または 一部影響あり ログイン不可 システムリソース不足 0 0 1 システムダウン(クラウド基盤障害) 1 2 3 アプリケーションエラー 8 1 2 DoS攻撃等 0 1 0 その他 1 0 0
  8. 8. • Prometheusによる改善が期待できる障害 8 原因/影響(件数) 影響なし 遅延発生または 一部影響あり ログイン不可 システムリソース不足 0 0 1 システムダウン(クラウド基盤障害) 1 2 3 アプリケーションエラー 8 1 2 DoS攻撃等 0 1 0 その他 1 0 0
  9. 9. • 認証サービスのシステム稼働環境 Z.com Cloud Enterprise(IaaS)上に各環境合わせて約100台のVMで運用 アプリケーションコンテナ管理にKubernetes/Dockerを利用 Kubernetes/Docker環境は自前で構築運用 9 Kubernetes Nagios 認証サービス 外形監視 Munin リソース監視 運用担当者 障害通知 Elasticsearch ・・・ Z.com Cloud Enterprise ホストOS
  10. 10. • 目指したいもの Prometheusで障害発生前に異常検知してログイン障害をなくしたい 10 Kubernetes Nagios 認証サービス Prometheus Alert Manager Grafana On Call 監視 外形監視 Munin リソース監視 Slack 運用担当者 システム異常の早期発見通知 障害通知 早期対策 kubelet Node Exporter
  11. 11. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 信頼性の向上 • まとめ 11
  12. 12. 関連技術紹介 • Kubernetes コンテナがサービスとして稼働できる状態を管理する(Pod) Podの実行に適したノード(VM)に配置する 例: PHP-FPMが起動していない状態ではNginxにリクエストが来ない 12 Kubernetes ノード(VM) Pod Nginx PHP-FPM ノード(VM) Pod Nginx PHP-FPM ノード(VM) Pod Nginx ・・・
  13. 13. • Prometheus 2012年 SoundCloud社が開発、OSSで公開 2016年 Cloud Native Computing Foundationのインキュベーションプロジェクトのク ラウド用プロダクトとして開発が進められ、v1.0 がリリース ↓ クラウドネイティブなコンテナの監視ツールのデファクトスタンダードへ (KubernetesもCloud Native Computing Foundation出身) 13
  14. 14. 時系列の数値データを収集して保持しリクエストに応じてデータを加工するツール 可視化/アラートツールと組み合わせて監視/アラートツールとして使える ※Prometheus server単体では監視/アラートツールとして機能しない https://prometheus.io/docs/introduction/overview/#architecture 14
  15. 15. • kube-prometheus-stack Kubernetesの監視/アラートをPrometheusと周辺ツールで実現するパッケージ Kubernetes上にデプロイしてノードとコンテナのメトリクスを取得できる Prometheus、Grafana、Alartmanager、kube-state-metrics、 Prometheus Operator、Node Exporterで構成されている 15
  16. 16. • Grafana 分析と可視化用のツール 16
  17. 17. • Alertmanager APIでアラートリクエストを受信してアラートをハンドリングできる Prometheus serverからアラートを受け取る 電子メールやSlackでアラートを通知できる アラートのグルーピングや抑制ができる 17
  18. 18. • Metrics in Kubernetes Kubernetesのメトリクスを提供する仕組み kubelet: コンテナリソースのメトリクスを提供 kube-state-metrics: Kubernetesのメトリクス提供ツールからメトリクスを収集 • Node Exporter Kuberntesのノードのメトリクスを収集する仕組み 18
  19. 19. 既存監視ツールとの比較 19
  20. 20. • Nagios ホストOSの監視/アラートツール(コンテナリソースの監視には向かない) 生存確認失敗時やシステムリソースが閾値に達するとアラートを通知する 条件に応じてWarningやCritical等のステータスを管理できる 例1: トップページのレスポンスが30秒なければアラートを通知する 例2: ディスク使用量が75%を超えたらアラートを通知する ※運用している認証サービスではシステム監視チームと連携してステータスCritical の際に運用担当者にオンコールする運用体制 20
  21. 21. • Munin 監視ツール CPU、メモリ、ディスク使用量、ネットワークトラフィック等を時系列に可視化 リソース状況の確認や障害発生時の異常箇所検知に利用 21
  22. 22. • Zabbix サーバー、ネットワーク、アプリケーション等を監視 障害検知、アラート通知、可視化機能を提供 https://www.zabbix.com/jp/server_monitoring 22
  23. 23. • Prometheus Stackの優位性 Prometheusは様々なメトリクスを元に監視用データを柔軟に加工できる コンテナの監視を中心的な機能に置いている 歴史的な経緯からも今後もKubernetes/コンテナ環境との親和性強化に期待 kube-prometheus-stackによる導入障壁の緩和 23
  24. 24. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 信頼性の向上 • まとめ 24
  25. 25. Prometheusのアーキテクチャ • スクレイプ JobやExporterと連携してメトリクスを収集する https://prometheus.io/docs/introduction/overview/#architecture 25
  26. 26. • データモデル 時系列データを保持 メトリクス名、メトリクス値、ラベル、timestampで構成される 時系列データはメトリクス名とラベル(key-value)で一意に識別可能 26 VM Prometheus server timestamp 1664240957 Node Exporter メトリクス名 メトリクス値 ラベル CPU USAGE 20 host=“192.168.X.Y” MEMORY USAGE 1000000000 host=“192.168.X.Y” DISK USAGE 30000000000 host=“192.168.X.Y”
  27. 27. • TSDB 収集したメトリクスは時系列データベース(TSDB)に保存 Prometheus serverのローカルストレージにデータを永続化 コンテナの場合は外部ストレージをマウントして永続化 ストレージの冗長化はサポートしていない デフォルトのデータ保持期間は15日 用途に応じて保持期間を変更する 27
  28. 28. • メトリクスの種類 Counter: 値が単調に増加するメトリクス、値がリセットされることがある 例: アプリケーションエラー件数、処理したリクエスト件数 Gauge: 値が増減するメトリクス 例: メモリ使用量、ディスク使用量 Histogram: 指定した範囲のヒストグラム Summary: 集計値やイベントの発生数 28
  29. 29. • PromQL データ型 • Instant Vector: 時系列上に単一データを持つ型、グラフ化できる • Range Vector: 時系列上に複数データを持つ型、グラフ化できない • Scalar: 浮動小数型 時系列セレクター • Instant Vector Selectors: Instant Vector型を取得する、メトリクスも含む node_memory_MemTotal_bytes node_memory_MemTotal_bytes{job=“node-exporter”, instance=“192.168.X.Y”} • Range Vector Selectors: Instant Vector型からRange Vector型を取得する node_memory_MemTotal_bytes[1d] 29
  30. 30. • 気温を観測する例 1日の気温を1時間ごとに計測してPrometheusでメトリクスとして取得 0時に気温10℃、12時まで1℃/時ずつ上昇、12時以降1℃/時ずつ下降 30 時 気温(℃) 0 6 12 18 24 10 22 Prometheus メトリクス名 値 timestamp temparature 10 10 temparature 11 11 ・・・ temparature 10 24
  31. 31. 31 時 気温(℃) 0 6 12 18 24 10 22 Prometheus temparature [(0, 10), (1, 11), ・・・(24, 10)] PromQL temperature(メトリクス) Instant Vector(メトリクスそのもの) グラフ化 時 気温(℃) 0 6 12 18 24 10 22 Prometheus temparature [(0, [(0, 10)], (1, [(0, 10), (1, 11)], ・・・ (24, [(22, 12), (23, 11), (24, 10)] PromQL temperature[2h] Range Vector イメージ 10 時系列上に3つのベクトル値
  32. 32. 32 時 気温(℃) 0 6 12 18 24 10 22 10 • Functions Range Vectorの時点では意味がない Functionと組み合わせることで意味のある指標に変換できる avg_over_time(v range-vector): 指定した範囲に含まれる平均値 delta(v range-vector): Range Vectorの時系列上の最初と最後の値の差分 avg_over_time 時 気温(℃) 0 12 24 11 21 直近2時間ごとの平均気温 delta 時 気温(℃) 0 12 24 直近2時間の気温変化 2 -2 Instant Vector グラフ化できる
  33. 33. • アラート メトリクスやメトリクスを加工した値に条件をつけてアラートが送信できる 33
  34. 34. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 信頼性の向上 • まとめ 34
  35. 35. Prometheusによる監視改善 • ノードのディスク容量不足によるログイン障害 • KubernetesのPod Evictionの仕組み • 認証サービスのアプリケーション構成 • 障害を引き起こした原因 • ディスク容量不足に気付けなかった理由 • ディスク使用量増加傾向の監視 • ディスク使用量増加の異常検知によるアラート • DoS攻撃等の監視 35
  36. 36. • ノードのディスク容量不足によるログイン障害 ディスク容量不足によりノード上にPodがデプロイできずログイン不可になった 36 Kubernetes ノード(VM) Pod Nginx PHP-FPM ノード(VM) Pod Nginx PHP-FPM ノード(VM) Pod Nginx PHP-FPM Kubernetes ノード(VM) ノード(VM) ノード(VM) ディスク容量不足 ディスク容量不足 ディスク容量不足
  37. 37. • KubernetesのPod Evictionの仕組み Node-pressure Eviction ノード上のリソースの枯渇を避けるためにPodをノードから除外する(Evict) Pod除外後にノードがデプロイできる状態になると再度デプロイして復旧 37 ノード(VM) Pod Nginx PHP-FPM ノード(VM) ノード(VM) Pod Nginx PHP-FPM リソース不足 リソース確保 再デプロイ
  38. 38. 認証サービス Kubernetes • 認証サービスのアプリケーション構成 認証サービスだけで使うためのノードを割り当てている 割り当てられている全ノードが稼働している 1ノードに1Pod稼働している 各Podに均等にリクエストが来るようにしている 38 ノード(VM) Pod Nginx PHP-FPM ノード(VM) Pod Nginx PHP-FPM ノード(VM) Pod Nginx PHP-FPM Elastics earch ・・・
  39. 39. • 障害を引き起こした原因 認証サービスのログの量が短期間に増加した 全ノードでほぼ同時にディスク容量不足発生(全ノード同じ構成のため) 認証サービスのPodが順次除外される ディスク容量不足が解消できないのでPodが除外された状態が続く 認証サービスの全Podが除外される 39 Kubernetes ノード(VM) ノード(VM) ノード(VM) ディスク容量不足 ディスク容量不足 ディスク容量不足
  40. 40. • ディスク容量不足に気付けなかった理由 特定リクエストで1MB程ログが出る修正が入る => レビューで気付けない Nagiosでディスク使用量のWarningアラートが発生 => ログ量変化に気付けない Warningの閾値を超えた状態が続きアラートが発生しない Criticalアラート(オンコール)が発生したため古いログ削除 => 調査の時間取れず 再度Criticalアラート(オンコール)が発生したため古いログ削除 Nagiosのディスク使用量の閾値見直し 閾値が高すぎてアラートが発生する前に認証サービスのPodが除外される => Node-pressure Evictionの仕様を正しく理解できていなかった 40
  41. 41. • ディスク使用量増加傾向の監視 ディスク使用量を以前(1日前、1週間前、1ヶ月前等)と比較して異常検知 PromQL 41 delta( node_filesystem_avail_bytes{job="node-exporter", instance="$instance", fstype!=""}[1d] )
  42. 42. • ディスク使用量増加の異常検知によるアラート ディスク使用量の増加量の閾値をアラートの条件に設定 通知先をSlackに指定 42
  43. 43. • DoS攻撃等の監視 Nginxのaccess.logをFluentdでメトリクスとして転送する rate関数を利用してリクエスト数の変化率を監視する 43
  44. 44. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 信頼性の向上 • まとめ 44
  45. 45. Grafana OnCallによるアラート改善 • Grafana OnCallとは アラートエスカレーションやスケジューラとの連動によりエンジニアの負担削減 クラウド版とOSS版(Grafanaのプラグイン)がある https://grafana.com/oss/oncall/ 45
  46. 46. • ユースケース アラートのレベルに応じて通知の時間帯や通知先を変更する Warning(すぐにはサービス影響なし): 業務時間、全開発者宛に通知 Error(サービスに影響する可能性あり): 全日、障害担当者にのみ通知 緊急(サービスが稼働していない): 全日、全開発者宛(+事業部担当者)に通知 46
  47. 47. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 信頼性の向上 • まとめ 47
  48. 48. 信頼性の向上 • 監視システムへの稼働要求 監視システムは監視対象が稼働していないことを検知する必要がある 監視システムは監視対象より高い稼働率が求められる 48 システム 監視システム 監視 稼働率: 99.99% 稼働率: 99.999% < 通知
  49. 49. • 監視の監視 認証サービスとPrometheusは共にKubernetes内で稼働 Prometheusの稼働率を認証サービスより上げ辛い Kubernetesの外部からNagiosで監視することで信頼性向上 49 Kubernetes Nagios 認証サービス Prometheus 監視 外形監視 システム異常の早期発見通知 障害通知 Slack 運用担当者 監視・・・?
  50. 50. • ストレージの冗長化 メトリクスの保存に冗長性のあるリモートストレージを利用できる Google BigqueryやPostgreSQL等 リモートストレージを利用する場合もPromQLはPrometheus serverで実行 メリット ストレージを冗長化できる 長期間のメトリクスの保持に適している デメリット リモートストレージから生データを取得するためパフォーマンス低下の可能性 https://prometheus.io/docs/prometheus/latest/storage/ 50
  51. 51. アジェンダ • モチベーション • 関連技術紹介 • Prometheusのアーキテクチャ • Prometheusによる監視改善 • Grafana OnCallによるアラート改善 • 将来的な拡張性について • まとめ 51
  52. 52. まとめ • システム異常の早期検知にPrometheusが利用できる • Prometheusに適切なアラートを設定することで早期検知する • Grafana OnCallでより柔軟なアラートシステムを実現 • システムの洞察(インサイト)を得るためにPrometheusを導入する • 適切なオートスケールやオートヒーリングの構築に繋がることも期待 • 監視システムの可用性を考慮することも大事 52
  53. 53. 53 Kubernetes Nagios 認証サービス Prometheus Alert Manager Grafana On Call 監視 外形監視 Munin リソース監視 Slack 運用担当者 システム異常の早期発見通知 障害通知 早期対策 kubelet Node Exporter
  54. 54. ご清聴ありがとうございました 54

×