CNDT2020 Track Cで発表したスライドです
発表者: @gurapomu, @KKawabe108
で構築する複数Kubernetesの監視基盤in CNDT 2020CyberAgent, Inc.Speakers: Riku Gemba, Katsuya Kawabe #CNDT2020_C
View Slide
AGENDA1. 自己紹介2. AKEの紹介と背景3. VictoriaMetricsとPrometheus4. 監視基盤のアーキテクチャ5. 監視基盤の運用
自己紹介- 川部 勝也- CIU (CyberAgent group Infrastructure Unit) 所属- インフラエンジニア- 2020年新卒入社- 趣味: カラオケ- 源波 陸- CIU所属- インフラエンジニア- 2020年新卒入社- 特技: マインスイーパー
AGENDA1. 自己紹介 ✔2. AKEの紹介と背景3. VictoriaMetricsとPrometheus4. 監視基盤のアーキテクチャ5. 監視基盤の運用
AKE の紹介
AKE の紹介AKEについてより詳しく知りたい方は @makocchi, @amsy810 お二人の資料を漁ってください
AKE のアーキテクチャAKE Clientmaster node node nodePod PodPodPodPodPodPodPodPodIngresscontrollerPodIngressVMexternalnetworkVM
✱ マネージドサービスとしての質を高めたい✱ 監視ツールを用いて障害に即時対応✱ 横断監視で Datadog を使用するのは、費用が高くなりやすい✱ プロダクトが増えるごとにコストが増加する✱ クラスタが増えればもっと増える背景
背景: 複数のDatadogで監視するメトリクスが重複横断監視用DatadogプロダクトAのメトリクス プロダクトBのメトリクスプロダクトCのメトリクス プロダクトDのメトリクス・・・・・・プロダクトAのDatadogプロダクトAのメトリクスプロダクトBのDatadogプロダクトBのメトリクス
背景: PrometheusとGrafanaDatadog のダッシュボードが横断監視用とプロジェクト用で乱立し、費用が高くなる、同じメトリクスを二つのAPIキーで送信しなければならないといった問題が発生するPrometheus と Grafana を用いれば、横断監視しつつ、ダッシュボードをプロダクト毎に払い出すことができる
AGENDA1. 自己紹介 ✔2. AKEの紹介と背景 ✔3. VictoriMetricsとPrometheus4. 監視基盤のアーキテクチャ5. 監視基盤の運用
VictoriaMetrics と Prometheus
こいつは何者?VictoriaMetrics と Prometheus
ログを永続化PrometheusPrometheusのみで横断監視する場合StoragePodやDeployment といったユーザの管理するリソースから kubelet や kube-proxyといったKubernetesのコンポーネントも監視Federation 機能を使って複数Prometheusのログを集約可能
ログを永続化PrometheusPrometheusのみで横断監視する場合StoragePodやDeployment といったユーザの管理するリソースから kubelet や kube-proxyといったKubernetesのコンポーネントも監視1サーバなのでいつか限界がくる
StorageVictoriaMetricsメトリクスを永続化Prometheusの収集したメトリクスをさらに集約して永続化する機構Prometheusのみで横断監視する場合
VictoriaMetricsのアーキテクチャLoad Balancervmselect vmselectvmstorage vmstoragevminsert vminsertLoad Balancer図参考: https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/Cluster-VictoriaMetrics読み込みフロー:Grafana や Prometheus からのクエリは vmselect がvmstorage からデータを読み込み、マージして返すvmselect はステートレス書き込みフロー:remote write や OpenTSDB の put protocol をサポートConsistentHash を用いて vmstorage への負荷分散を行うvminsert はステートレス実データを保存するストレージプロセスデータはファイルシステムにファイルとして保存されるステートフル・・・・・・・・・
vmstorageのデータと対応ストレージvmstorageデータの実態は vmstorage が動くマシンのファイルシステムに保存されるつまり GCS や S3 を FUSEでファイルシステムとしてマウントすればバックエンドストレージとして使用可能当然 NFS も使用可能
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-317bc1f95932https://hnakamur.github.io/blog/2017/02/12/tried-facebook-gorilla-time-series-database-compression/
VictoriaMetricsのデータ圧縮の工夫Gorilla による浮動小数点以下の圧縮 VictoriaMetrics による浮動小数点以下の圧縮浮動小数点以下に 10^N を乗算し、整数化することでランレングス符号化やハフマン符号化による圧縮がより機能しやすくなる
VictoriaMetricsによるデータ圧縮のパフォーマンス画像出典: https://victoriametrics.com/2TBのディスクに2年間保存できるサンプルの量は80万超となっており、既存の時系列DBに比べて圧倒的。
競合のOSS (Thanos, Cortex)
✱ Cortex✱ DynamoDB, Google Bigtable, Cassandra, S3, GCS, Microsoft Azure など多様なストレージに対応✱ HA対応のアーキテクチャ✱ インメモリキャッシュによる高速なクエリの処理✱ Helmで運用可能✱ Thanos✱ GCS, S3 にメトリクスを保存✱ Prometheus のデータを ObjectStorage に保存する Gateway を冗長可能✱ Operator, Helmで運用可能競合のOSS (Thanos, Cortex)
✱ Consul、Memcache、DynamoDB、BigTable、Cassandraなど多くのサードパーティソフトウェアに依存していて、アーキテクチャが複雑で運用負荷が高い✱ Helmのチャートが新しいKubernetesのバージョンで動かなかったりする✱ VictoriaMetricsに比べてCPU, Memory使用率が高い✱ サンプルの圧縮率が低いWhy not Cortex参考 : https://promcon.io/2019-munich/slides/remote-write-storage-wars.pdf
✱ データ損失すると最大2時間分消失する可能性がある✱ ThanosサイドカーをデプロイするのとPrometheusのデータ圧縮を無効化する必要があり、Prometheusの性能を低下させてしまう可能性がある✱ VictoriaMetricsよりCPU, Memoryを使用率が高いWhy not Thanos参考 : https://promcon.io/2019-munich/slides/remote-write-storage-wars.pdf
Why VictoriaMetrics色々検証しましたが・・・
Why VictoriaMetrics✱ シンプルなアーキテクチャによる運用のしやすさ✱ 高圧縮なアルゴリズム✱ 必要十分な可用性、耐障害性、スケール性
AGENDA1. 自己紹介 ✔2. AKEの紹介 ✔3. VictoriMetricsとPrometheus ✔4. 監視基盤のアーキテクチャ5. 監視基盤の運用
横断監視基盤の構成: メトリクスの書き込みK8s ClusterK8s ClusterK8s ClusterLoad Balancervmselect vmselectvmstorage vmstoragevminsert vminsertLoad Balancer・・・・・・・・・
横断監視基盤の構成: クエリの実行Load Balancervmselect vmselectvmstorage vmstoragevminsert vminsertLoad Balancer・・・・・・・・・vmalertalertmanagerAKEDeveloper通知可視化
横断監視基盤の構成: よくあるクラスタClient
横断監視基盤の構成: よくあるクラスタClientLoadBalancer も監視したい
Ingress はクラスタに紐づくリソースだが、実態のVMやプロセスがクラスタの外部に存在するしかし、VM上で動作するプロセスやVMのパフォーマンスに関するメトリクスを Prometheus で監視したいIngress の監視
横断監視基盤の構成: クラスタ内部の監視構成kube-state-metricsAKE Prometheusnode exporterkube-proxykubeletCore DNSetcdPullIngressVM VM様々なexporter様々なexporter
横断監視基盤の構成: クラスタ内部の監視構成kube-state-metricsAKE Prometheusnode exporterkube-proxykubeletCore DNSetcdPullIngressVM VM様々なexporter様々なexporter✱ どうやってIngress VMのIPアドレスを リソースの作成に応じてディスカバリするのか✱ VMはユーザによって減ったり増えたりする可能性もある
✱ Prometheus のみではクラスタ外部に構成されている、ロードバランサの実態として作成される複数のVMをディスカバリできない✱ static_configs や file_sd_configs を使用すれば明示的にIPアドレスを指定できる✱ static_configs や file_sd_configs を自動的に埋めたいクラスタ外に立つリソースの監視手法
✱ AKE Prometheus は Prometheus Operator を用いてデプロイされている✱ Operatorは static_configs, file_sd_configs を Secret で管理している✱ つまり、Secretをなんとかして書き換えてあげれば AKE Prometheus が動的にIngress VM の Exporter の Job をPullすることができるクラスタ内部の監視構成これを実現する CronJob を実装すればやりたいことはできる!
✱ AKE Prometheus は Prometheus Operator を用いてデプロイされている✱ Operatorは static_configs, file_sd_configs を Secret で管理している✱ つまり、Secretをなんとかして書き換えてあげれば AKE Prometheus が動的にIngress VM の Exporter の Job をPullすることができるクラスタ内部の監視構成これを実現する CronJob を実装すればやりたいことはできる!Custom Controller に 実装する手もあったが、責任の分散と実装、デバッグのしやすさから CronJob を選択
クラスタ内部の監視構成
Ingressの監視static_configs が書かれたyamlの実態はsecretに格納されている
Base64エンコードされたyamlを書き換える元のSecret Data Ingress監視Jobを追加したSecret DataIngressの監視
Ingressの監視: CronJobの動作Ingress HeatStackResourceAKEPrometheusSecretServicesCronjob1. Heatstack リソースを列挙する2. VM の IP を Heatstack リソース毎に抽出する
Ingressの監視: CronJobの動作Ingress HeatStackResourceAKEPrometheusSecretServicesCronjob3. PrometheusのSecretを取得する4. Heatstack リソースごとにstatic_configs の job を追加して、Secret の data を更新する
Ingressの監視: CronJobの動作Ingress HeatStackResourceAKEPrometheusSecretServicesCronjob5. Service を列挙して label からAKE Prometheus を特定する
Ingressの監視: CronJobの動作Ingress HeatStackResourceAKEPrometheusSecretServicesCronjob6. Service から Endpoint を指定し、Prometheus のリロードAPIを叩くPOST or PUThttps://ake-prometheus.kube-system.svc.cluster.local:9090/-/reload
✱ クラスタ毎の Prometheus と VictoriaMetrics によって横断監視を実現✱ Kubernetesクラスタとは独立したロードバランサの監視は CronJob によって実現横断監視基盤の構成
余談: ingress-nginxに簡単なパッチを当てた話
✱ NginxのプロセスはLuaスクリプトでリクエストのメトリクスをバッファリングしている✱ その件数が1秒間最大1万件でハードコーディングされていた✱ プロダクトではその数倍のリクエスト数が想定されていたのでオプション化✱ Luaスクリプト書いたり、そのテストも書いたり✱ 0.34.0以上で使えるようになってる余談: ingress-nginxに簡単なパッチを当てた話
KuberhealthyというOSSにもパッチを当ててKubernetes 1.16以上で動くようにしたのですが、まだマージされていないので別の機会に・・・余談: kuberhealthy
AGENDA1. 自己紹介 ✔2. AKEの紹介と背景 ✔3. VictoriaMetricsとPrometheus ✔4. 監視基盤のアーキテクチャ ✔5. 監視基盤の運用
通知システムの構成AKEDeveloper
Grafana Dashboard
4. 横断監視基盤の構成: Kubernetes の監視node exporterkube-state-metricskubeletMaster Componentsk8s Node ResourcesのメトリクスCPU, Memory, I/O, etc...k8s Resources のメトリクスdeploy, sts, ds,pod, pv, etc…k8s Componentsのメトリクスkube-apiserver,etcd, kubelet,coredns, etc,...
4. 横断監視基盤の構成: Ingressの監視systemd exporter bird exporternode exporter nginx metricsCalicoやingress-nginxがDockerで正常に動いているかBGPのPeer Linkが正常に貼られているかIngress VMのCPUやメモリのメトリクスIngress-nginxが持つリクエストやコネクションのメトリクス
✱ Critical✱ 即時対応✱ 業務時間外は PagerDuty による輪番制✱ Warning✱ 日中帯対応(休日含む)✱ 業務時間外は PagerDuty による輪番制✱ Informational✱ 翌営業日対応横断監視基盤の構成: アラート優先度
✱ 1ヶ月あたり130GB✱ クラスタ数 30+✱ ノード数 200+✱ ポッド数 3500+✱ 必要ないメトリクスは可能な限り絞る✱ exporter の起動オプションで指定可能✱ --no-collector.hogeVictoriaMetrics のメトリクスサイズ
✱ Datadog を使用✱ サードパーティの監視✱ Dashboard とアラート設定VictoriaMetrics を監視する
✱ アラートしきい値✱ 「実は異常が起こっていたが気づかなかった」は避けたい✱ あとから調整していけばいいよね・・・✱ 結果夜中に何度もたたきおこされる✱ 監視が必要ないクラスタ✱ むしろアラートがうるさい✱ 検証クラスタを立てるたびに silence を入れるのは面倒✱ アラート発砲させないオプションは必須 (隠し flag など)監視基盤構築の苦労話 1, 2
✱ 毎朝9時に大量のアラート✱ 急激に VictoriaMetrics の負荷が上がってメトリクスが途切れる✱ 多くのクラスタの Prometheus と疎通がとれず✱ よくよく調べると vmstorage がメモリリークしていた...監視基盤構築の苦労話 3
✱ クラスタのアップデートで突然 Grafana のダッシュボードが消える✱ AlertManager の silence も消えてアラートが鳴りまくる✱ Grafana と AlertManager のストレージが pv になっておらずpod のリスタートが走りデータが消失した✱ 意図せず Grafana のバージョンが 7系にアップデートされる監視基盤構築の苦労話 4
本日のまとめ
✱ Datadog にたよらず独自に横断監視を VictoriaMetrics と Prometheus で実現することでプロダクトの増加による追加コストを抑えることができる✱ VictoriaMetrics は Prometheus や InfluxDB より高圧縮かつ高速な読み書きのストレージを実現✱ シンプルなアーキテクチャによって高可用性、耐障害性を持つ✱ クラスタ外のエンドポイントの監視は CronJob でディスカバリする処理を動かす✱ KaaS特有の監視項目を含めながら運用されているまとめ
Thank you for listening !