Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

簡単な歴史 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

Slide 8

Slide 8 text

Cortexのアーキテクチャ

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Cortexをkubernetes上で動かそう!

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Cortexをkubernetes上で動かそう!

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

とりあえず動いた手順 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

Slide 37

Slide 37 text

とりあえず動いた手順

Slide 38

Slide 38 text

とりあえず動作確認 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":[]}}が多分返ってくる

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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