Skip to content

Instantly share code, notes, and snippets.

@d-kuro
Created September 26, 2019 11:46
Show Gist options
  • Save d-kuro/ed50a114f42b412f5fb9de1f564e6319 to your computer and use it in GitHub Desktop.
Save d-kuro/ed50a114f42b412f5fb9de1f564e6319 to your computer and use it in GitHub Desktop.
Cloud Native Meetup Tokyo #10

Cloud Native Meetup Tokyo #10

Kubernetes 上で KVS をマネージドっぽく使いたい!

  • Redis Operator
    • HA 構成の Redis
    • 何も考えずに HA の Redis が作れる
    • 一発でエンドポイントが払い出せる
    • クラスタ内アクセスを想定
    • Sentinel なので Write はスケールしない
  • Redis の HA
    • Replication
      • master のデータをコピーするだけ
      • master が SPoF
    • Cluster
      • Sharding
      • Write がスケール
    • Sentinel
      • Replication を HA にする
      • master が落ちたら slave を master に昇格する
      • master/slave の情報は Sentinel から持ってくる
  • TiKV
    • Rust で実装された分散 KVS
    • Spanner と HBase に影響を受けている
    • TiDB のバックエンドストアとして開発された
      • MySQL 互換の分散 DB
    • 機能やドキュメントは未熟
    • クラスタ内アクセスを想定しているが、改善中
    • CNCF Incubating
  • コンポーネント
    • TiKV
      • 分散 KVS
      • Raft で管理
    • Placement Driver
      • TiVK のクラスタ管理
    • RocksDB
      • TiKV のバックエンド DB ライブラリ
      • LSM Tree 採用
  • アクセス
    • Placement Driver にデータの居場所を聞いて, リクエストを送る
    • gRPC でレイテンシを最小限にしている
  • Raft
    • 分散合意アルゴリズム
    • Candidata
      • Lader が決まってない人
    • Follower
      • ログを受け入れる
      • 過半数の受け入れでコミット
    • Lader
      • R/W 全てのリクエストを処理
  • TiKV
    • データは Region という単位で Sharding (range base)
    • Multi-Raft
  • Operator
    • TiKV のオペレーターはない
    • TiDB オペレーターを使って TiDB のレプリカ数を 0 にする

Loki入門

  • Loki について
    • Log aggregator system
    • Grafana Lab が開発
    • Prometheus のようにラベルで管理ができる
  • Kubernetes との連携
    • Grafana loki に対して Promtail がログを収集して送る
    • Promtail は log にラベルをつける
  • Loki
    • ログに付与されたラベルによるフィルタリング
    • 結果を grep できる
    • テキスト処理はしない
    • Cortex のアーキテクチャとほぼ同じ (派生しているため)
  • Distributor
    • clinet から受けたログを Ingester に
    • ヘッダに含まれる ID でユーザを識別
    • マルチテナントを想定
    • ステートレス
  • Ingester
    • ログを Chunk Store に
    • セミステートフル
    • 直近のログを保持している
    • Read のために直近のログを cache している
    • log をまとめて Chunk Store に
      • 頻繁な書き込みの抑制
      • Chunk がいっぱいになったら書き込む
    • Distributor はコンシステントハッシュで Ingester を決定
  • Chunk Store
    • loki 自体は DB ではない
    • 2 種類の Chunk Store
      • Index
        • ログ検索のための転置 index
        • ラベルなどのメタデータを保持
        • KVS
        • DynamoDB とか使える
      • Chunks
        • 実際のログを保存
        • オブジェクトストレージ
        • S3 とか使える
  • Querier
    • ログのクエリを受ける
    • 直近のログは Ingester
    • それ以外は Chunk Store
  • Table Manager
    • log の Retention を管理
    • 現状 Chunks の Retention は local にのみ実装がある
  • 様々なコンポーネントがあるが、全部 1 つの実行ファイルから起動
    • シングルプロセスで全てのコンポーネントを動かすこともできる
    • コンポーネントを分離して動かすドキュメントは今の所ない
  • Promtail
    • loki へラベル付きのログを送信するための agent
    • Prometheus と似たような設定
    • Kubernetes のアプリログの場合 Service Discovery が使える
    • DaemonSet で置いたり Sidecar で置いたり
  • Config
    • relabel_config
      • log を読む前の処理
      • ラベル付与
      • log 収集するコンテナの指定
      • log の path 指定
    • pipeline_stages
      • log を読んだ後の内容に対して処理
      • 各 stage で log に対して様々な処理
      • log からメトリクスを作成できる

Virtual Kubeletの有用性

  • Virtual Kubelet の概要
    • 任意の API と Kubernetes を連携するためのソフト
    • Kubelet を仮想化したかった
  • Kubelet
    • Pod の作成とかをする
    • Node にいる agent
    • API Server と非同期/同期で通信して処理
    • excc とかは同期でやってる
    • Pod の liveness/rediness
    • init containers の実行
  • Virtual Kubelet
    • init containers の実行できない
    • Pod の liveness/rediness できない
    • 基本的に Pod とは別のネットワークにいる
    • プロバイダごとに実装が違う
    • DaemonSet は配備されない
      • taint が貼られている
      • toleration を使う
    • スケジュールしたいときは nodeSelector で指定
      • 将来的には Affinity に置きかわりそう
    • Probe が使えない
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment