Upgrade to Pro — share decks privately, control downloads, hide ads and more …

VictoriaMetrics+Prometheusで構築する複数Kubernetesの監視基盤

Bo0km4n
September 08, 2020

 VictoriaMetrics+Prometheusで構築する複数Kubernetesの監視基盤

CNDT2020 Track Cで発表したスライドです

発表者: @gurapomu, @KKawabe108

Bo0km4n

September 08, 2020
Tweet

More Decks by Bo0km4n

Other Decks in Programming

Transcript

  1. 自己紹介 - 川部 勝也 - CIU (CyberAgent group Infrastructure Unit)

    所属 - インフラエンジニア - 2020年新卒入社 - 趣味: カラオケ - 源波 陸 - CIU所属 - インフラエンジニア - 2020年新卒入社 - 特技: マインスイーパー
  2. AKE のアーキテクチャ AKE Client master node node node Pod Pod

    Pod Pod Pod Pod Pod Pod Pod Ingress controller Pod Ingress VM external network VM
  3. AGENDA 1. 自己紹介 ✔ 2. AKEの紹介と背景 ✔ 3. VictoriMetricsとPrometheus 4.

    監視基盤のアーキテクチャ 5. 監視基盤の運用
  4. VictoriaMetricsのアーキテクチャ Load Balancer vmselect vmselect vmstorage vmstorage vminsert vminsert Load

    Balancer 図参考: https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/Cluster-VictoriaMetrics 読み込みフロー: Grafana や Prometheus からのクエリは vmselect が vmstorage からデータを読み込み、マージして返す vmselect はステートレス 書き込みフロー: remote write や OpenTSDB の put protocol をサポート ConsistentHash を用いて vmstorage への負荷分散を行う vminsert はステートレス 実データを保存するストレージプロセス データはファイルシステムにファイルとして保存される ステートフル ・・・ ・・・ ・・・
  5. vmstorageのデータと対応ストレージ vmstorage データの実態は vmstorage が 動くマシンのファイルシステムに 保存される つまり GCS や

    S3 を FUSEで ファイルシステムとして マウントすればバックエンドスト レージとして使用可能 当然 NFS も使用可能
  6. VictoriaMetricsのデータ圧縮の工夫 ✱ VictoriaMetrics独自の圧縮アルゴリズムを採用 ✱ Gorilla(Prometheus や InfluxDB で使われている時系列DB)の圧縮手法より node exporter

    のデータ圧縮率が10倍である ✱ 符号化したデータに更に zstd で圧縮をかけている ✱ Prometheus の Counter メトリクスをデルタ符号化で圧縮 参考: https://medium.com/faun/victoriametrics-achieving-better-compression-for-time-series-data-than-gorilla-317bc1f95932 https://hnakamur.github.io/blog/2017/02/12/tried-facebook-gorilla-time-series-database-compression/
  7. ✱ Cortex ✱ DynamoDB, Google Bigtable, Cassandra, S3, GCS, Microsoft

    Azure など 多様なストレージに対応 ✱ HA対応のアーキテクチャ ✱ インメモリキャッシュによる高速なクエリの処理 ✱ Helmで運用可能 ✱ Thanos ✱ GCS, S3 にメトリクスを保存 ✱ Prometheus のデータを ObjectStorage に保存する Gateway を冗長可能 ✱ Operator, Helmで運用可能 競合のOSS (Thanos, Cortex)
  8. AGENDA 1. 自己紹介 ✔ 2. AKEの紹介 ✔ 3. VictoriMetricsとPrometheus ✔

    4. 監視基盤のアーキテクチャ 5. 監視基盤の運用
  9. 横断監視基盤の構成: メトリクスの書き込み K8s Cluster K8s Cluster K8s Cluster Load Balancer

    vmselect vmselect vmstorage vmstorage vminsert vminsert Load Balancer ・・・ ・・・ ・・・
  10. 横断監視基盤の構成: クエリの実行 Load Balancer vmselect vmselect vmstorage vmstorage vminsert vminsert

    Load Balancer ・・・ ・・・ ・・・ vmalert alertmanager AKE Developer 通知 可視化
  11. 横断監視基盤の構成: メトリクスの書き込み K8s Cluster K8s Cluster K8s Cluster Load Balancer

    vmselect vmselect vmstorage vmstorage vminsert vminsert Load Balancer ・・・ ・・・ ・・・
  12. AKE のアーキテクチャ AKE Client master node node node Pod Pod

    Pod Pod Pod Pod Pod Pod Pod Ingress controller Pod Ingress VM external network VM
  13. 横断監視基盤の構成: クラスタ内部の監視構成 kube-state-metrics AKE Prometheus node exporter kube-proxy kubelet Core

    DNS etcd Pull Ingress VM VM 様々な exporter 様々な exporter ✱ どうやってIngress VMのIPアドレスを リ ソースの作成に応じてディスカバリするのか ✱ VMはユーザによって減ったり増えたりする可能性もある
  14. ✱ AKE Prometheus は Prometheus Operator を用いてデプロイされている ✱ Operatorは static_configs,

    file_sd_configs を Secret で管理している ✱ つまり、Secretをなんとかして書き換えてあげれば AKE Prometheus が動的に Ingress VM の Exporter の Job をPullすることができる クラスタ内部の監視構成 これを実現する CronJob を実装すればやりたいことはできる!
  15. ✱ AKE Prometheus は Prometheus Operator を用いてデプロイされている ✱ Operatorは static_configs,

    file_sd_configs を Secret で管理している ✱ つまり、Secretをなんとかして書き換えてあげれば AKE Prometheus が動的に Ingress VM の Exporter の Job をPullすることができる クラスタ内部の監視構成 これを実現する CronJob を実装すればやりたいことはできる! Custom Controller に 実装する手もあったが、責任の分 散と実装、デバッグのしやすさから CronJob を選択
  16. Ingressの監視: CronJobの動作 Ingress HeatStack Resource AKE Prometheus Secret Services Cronjob

    1. Heatstack リソースを列挙 する 2. VM の IP を Heatstack リ ソース毎に抽出する
  17. Ingressの監視: CronJobの動作 Ingress HeatStack Resource AKE Prometheus Secret Services Cronjob

    3. PrometheusのSecretを取得する 4. Heatstack リソースごとに static_configs の job を追加して、 Secret の data を更新する
  18. Ingressの監視: CronJobの動作 Ingress HeatStack Resource AKE Prometheus Secret Services Cronjob

    5. Service を列挙して label から AKE Prometheus を特定する
  19. Ingressの監視: CronJobの動作 Ingress HeatStack Resource AKE Prometheus Secret Services Cronjob

    6. Service から Endpoint を指定し、 Prometheus のリロードAPIを叩く POST or PUT https://ake-prometheus.kube-system.svc.cluster.local:9090/-/reload
  20. AGENDA 1. 自己紹介 ✔ 2. AKEの紹介と背景 ✔ 3. VictoriaMetricsとPrometheus ✔

    4. 監視基盤のアーキテクチャ ✔ 5. 監視基盤の運用
  21. 4. 横断監視基盤の構成: Kubernetes の監視 node exporter kube-state-metrics kubelet Master Components

    k8s Node Resources のメトリクス CPU, Memory, I/O, etc... k8s Resources のメトリクス deploy, sts, ds, pod, pv, etc… k8s Components のメトリクス kube-apiserver, etcd, kubelet, coredns, etc,...
  22. 4. 横断監視基盤の構成: Ingressの監視 systemd exporter bird exporter node exporter nginx

    metrics Calicoやingress-nginxが Dockerで正常に動いているか BGPのPeer Linkが 正常に貼られているか Ingress VMのCPUや メモリのメトリクス Ingress-nginxが持つ リクエストやコネクション のメトリクス
  23. ✱ Critical ✱ 即時対応 ✱ 業務時間外は PagerDuty による輪番制 ✱ Warning

    ✱ 日中帯対応(休日含む) ✱ 業務時間外は PagerDuty による輪番制 ✱ Informational ✱ 翌営業日対応 横断監視基盤の構成: アラート優先度
  24. ✱ 1ヶ月あたり130GB ✱ クラスタ数 30+ ✱ ノード数 200+ ✱ ポッド数

    3500+ ✱ 必要ないメトリクスは可能な限り絞る ✱ exporter の起動オプションで指定可能 ✱ --no-collector.hoge VictoriaMetrics のメトリクスサイズ
  25. ✱ アラートしきい値 ✱ 「実は異常が起こっていたが気づかなかった」は避けたい ✱ あとから調整していけばいいよね・・・ ✱ 結果夜中に何度もたたきおこされる ✱ 監視が必要ないクラスタ

    ✱ むしろアラートがうるさい ✱ 検証クラスタを立てるたびに silence を入れるのは面倒 ✱ アラート発砲させないオプションは必須 (隠し flag など) 監視基盤構築の苦労話 1, 2
  26. ✱ クラスタのアップデートで突然 Grafana のダッシュボードが消える ✱ AlertManager の silence も消えてアラートが鳴りまくる ✱

    Grafana と AlertManager のストレージが pv になっておらず pod のリスタートが走りデータが消失した ✱ 意図せず Grafana のバージョンが 7系にアップデートされる 監視基盤構築の苦労話 4
  27. ✱ Datadog にたよらず独自に横断監視を VictoriaMetrics と Prometheus で実現 することでプロダクトの増加による追加コストを抑えることができる ✱ VictoriaMetrics

    は Prometheus や InfluxDB より高圧縮かつ高速な読み書きの ストレージを実現 ✱ シンプルなアーキテクチャによって高可用性、耐障害性を持つ ✱ クラスタ外のエンドポイントの監視は CronJob でディスカバリする処理を動かす ✱ KaaS特有の監視項目を含めながら運用されている まとめ