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

Cortexの話をKubeConで聞きたかったっていう話

Ce4810046c3b25ff4dfce9cac2dbd4dd?s=47 uesyn
January 09, 2019
1.3k

 Cortexの話をKubeConで聞きたかったっていう話

Ce4810046c3b25ff4dfce9cac2dbd4dd?s=128

uesyn

January 09, 2019
Tweet

Transcript

  1. Cortexの話を KubeConで 聞きたかったっていう話 上村 真也(@uesyn)

  2. 本発表は私自身の見解であり、 所属する企業や組織の立場、戦略、意見を 代表するものではありませんし、 私にはそんな権限ありません。

  3. 自己紹介 • 名前:上村 真也(@uesyn) • 所属:K◦◦I、現在クリエーションラインへ50%出向中 • 趣味:PCゲーム(特にFPS) • 好きな技術:kubernetes,

    OpenStack
  4. Cortexに関するセッション • https://sched.co/GrXL • https://www.youtube.com/watch?v=iyN40FsRQEo

  5. Prometheusのローカルストレージ • Long-term Storageではない ◦ レプリケーションの機能がない ◦ クラスター化されていない • 長期間保存が必要な場合

    ◦ Remote Storageを活用 ◦ Prometheusのremote read/write ▪ https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write ▪ https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations
  6. Cortexとは? Prometheusのメトリクスのための • 水平スケーラブル可能で • High-availabilityで • マルチテナント対応な • 長期間ストレージ

    https://github.com/cortexproject/cortex/blob/master/imgs/logo.png
  7. 簡単な歴史 2016/06/16 Project start at Weaveworks 2016/10/25 Renamed to Cortex

    2018/02/19 Weaveworks initiate community model 2018/09/20 Acceptance of Cortex into the CNCF Sandbox
  8. Cortexのアーキテクチャ

  9. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  10. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png ユーザテナント remote write

  11. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  12. Frontend • Cortexに含まれていないため自分で実装する必要がある • ユーザ側Prometheusからリクエストを受けとる

  13. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  14. Distributor • Prometheusから送信された時系列データを処理する • 複数のIngesterに並列でサンプルを送信する ◦ どのIngesterへ送信するかは分散ハッシュテーブルを活用 ◦ コンシステントハッシュリングは Consulに保存

    • ステートレスな設計 https://schd.ws/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf
  15. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  16. Ingester • 時系列データを長期ストレージバックエンドへ書き込む ◦ 数時間分のデータを圧縮しチャンクとして ▪ 圧縮にはGorillaを利用 ◦ バックエンドの長期ストレージへの書き込み頻度を下げる •

    過去12時間のデータを保持しておく ◦ 直近のデータの読み込みを高速化するため ◦ 上記のためセミステイトフル https://schd.ws/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf
  17. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  18. Chunk store • 2種類のデータストア 1. chunkとしてまとめられた時系列データを保存 2. chunkのための転置インデックスを保存 chunkを保存(オプション) インデックスを保存

    *chunkも保存可能*
  19. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  20. Query Frontend • テナントからのReadリクエストをいい感じにQuerierに流してくれる ◦ Readのリクエストをテナント ID毎にキューイング ◦ テナント間のリクエストを公平にスケジューリング ◦

    エラー時のリトライ ◦ 複数の日をまたぐリクエストの分割による分散処理 ◦ クエリ結果のキャッシュ • オプションのサービスなので省略可能
  21. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  22. Querier • クライアントからのPromQLクエリを処理 • 取得する時系列データへのアクセスの抽象化 ◦ 直近のデータはIngesterから取得 ◦ 上記以外はchunk storeから取得

    https://schd.ws/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf
  23. Cortexのアーキテクチャ https://github.com/cortexproject/cortex/blob/master/docs/architecture.png

  24. Ruler • Alertingのためのルールを実行してアラートを、Alertmanagerに送信 • CortexのインストールにはAlertmanagerも含まれる

  25. マルチテナント対応について

  26. マルチテナント対応について https://github.com/cortexproject/cortex

  27. マルチテナント対応について https://github.com/cortexproject/cortex/blob/master/docs/architecture.md

  28. マルチテナント対応について • リクエストに含まれるヘッダ内のIDでテナントを判断 • テナントID毎にPrometheusのメトリクスを分割して保存可能 • Cortex自体に認証・認可の機能は含まれず、実装が必要

  29. headerに埋め込むテナントID https://github.com/cortexproject/cortex/blob/master/cmd/distributor/main.go#L106 • distributor内のコードを確認

  30. headerに埋め込むテナントID https://github.com/weaveworks/common/blob/master/middleware/http_auth.go#L12

  31. headerに埋め込むテナントID • X-Scope-OrgIDで識別 • ユーザ実装のFrontendで埋め込もう?

  32. Cortexをkubernetes上で動かそう!

  33. Cortexをkubernetes上で動かそう! • 動かそうと思った矢先

  34. Cortexをkubernetes上で動かそう!

  35. Cortexをkubernetes上で動かそう! • 公式の入門ドキュメントは現状ない(1/7時点) • For Developersに記載された通りに動かしても動かない • そもそも動かしてもFrontendを実装しないとマルチテナントは使えない ◦ nginxで固定でheaderをつけるようにしてクライアント毎にフロントエンドを分けるのが一番楽

  36. とりあえず動いた手順 1. make a. コンテナイメージができるので動かしたい k8sからアクセスできるregisotryへpush i. 公式で用意されているコンテナイメージはたぶん存在してない ii. makeの前にMakefileのIMAGE_PREFIXを編集しておく

    2. k8sディレクトリ内のマニフェストのimageを上記へ置換 3. 一部マニフェスト内のargumentが間違っている部分を修正 対象:ingester-dep.yaml, querier-dep.yaml, ruler-dep.yaml, table-manager-dep.yaml 変更:--dynamodb.periodic-table.start →  --dynamodb.periodic-table.from 4. kubectl create -f ./k8s
  37. とりあえず動いた手順

  38. とりあえず動作確認 5. kubectl port-forward svc/nginx 9999:80 6. curl http://127.0.0.1:9999/api/prom/api/v1/query?query=up ◦

    {"status":"success","data":{"resultType":"vector","result":[]}}が多分返ってくる
  39. Cortexへデータを書き込もう! • remote_writeのURLはdistributorへhttpで/api/prom/pushに対して ◦ もちろんheaderにはテナントIDを入れて https://github.com/cortexproject/cortex/blob/master/cmd/distributor/main.go#L102

  40. Cortexからデータを読み込もう! • Grafanaなどからquery-frontendへhttpで/api/prom/.*に対して ◦ もちろんheaderにはテナントIDを入れて https://github.com/cortexproject/cortex/blob/master/cmd/query-frontend/main.go#L55

  41. まとめと今後 • まとめ ◦ cortexの歴史と概要を紹介 ◦ とりあえず動かす手順を紹介 • 今後 ◦

    本物のDynamoDB, S3への接続 ◦ 負荷テストとか? ◦ Ruler, table-manager, schemaの調査 ◦ 似たような設計のLokiの調査