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

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

uesyn
January 09, 2019
1.6k

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

uesyn

January 09, 2019
Tweet

More Decks by uesyn

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  6. Cortexとは?
    Prometheusのメトリクスのための
    ● 水平スケーラブル可能で
    ● High-availabilityで
    ● マルチテナント対応な
    ● 長期間ストレージ
    https://github.com/cortexproject/cortex/blob/master/imgs/logo.png

    View Slide

  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

    View Slide

  8. Cortexのアーキテクチャ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. Distributor
    ● Prometheusから送信された時系列データを処理する
    ● 複数のIngesterに並列でサンプルを送信する
    ○ どのIngesterへ送信するかは分散ハッシュテーブルを活用
    ○ コンシステントハッシュリングは Consulに保存
    ● ステートレスな設計
    https://schd.ws/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf

    View Slide

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

    View Slide

  16. Ingester
    ● 時系列データを長期ストレージバックエンドへ書き込む
    ○ 数時間分のデータを圧縮しチャンクとして
    ■ 圧縮にはGorillaを利用
    ○ バックエンドの長期ストレージへの書き込み頻度を下げる
    ● 過去12時間のデータを保持しておく
    ○ 直近のデータの読み込みを高速化するため
    ○ 上記のためセミステイトフル
    https://schd.ws/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. Query Frontend
    ● テナントからのReadリクエストをいい感じにQuerierに流してくれる
    ○ Readのリクエストをテナント ID毎にキューイング
    ○ テナント間のリクエストを公平にスケジューリング
    ○ エラー時のリトライ
    ○ 複数の日をまたぐリクエストの分割による分散処理
    ○ クエリ結果のキャッシュ
    ● オプションのサービスなので省略可能

    View Slide

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

    View Slide

  22. Querier
    ● クライアントからのPromQLクエリを処理
    ● 取得する時系列データへのアクセスの抽象化
    ○ 直近のデータはIngesterから取得
    ○ 上記以外はchunk storeから取得
    https://schd.ws/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  37. とりあえず動いた手順

    View Slide

  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":[]}}が多分返ってくる

    View Slide

  39. Cortexへデータを書き込もう!
    ● remote_writeのURLはdistributorへhttpで/api/prom/pushに対して
    ○ もちろんheaderにはテナントIDを入れて
    https://github.com/cortexproject/cortex/blob/master/cmd/distributor/main.go#L102

    View Slide

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

    View Slide

  41. まとめと今後
    ● まとめ
    ○ cortexの歴史と概要を紹介
    ○ とりあえず動かす手順を紹介
    ● 今後
    ○ 本物のDynamoDB, S3への接続
    ○ 負荷テストとか?
    ○ Ruler, table-manager, schemaの調査
    ○ 似たような設計のLokiの調査

    View Slide