KubeFest Tokyo 2020 参加まとめ

# 概要

セッション概要 / 動画 / 資料がまとまっているとてもお世話になったサイト
[KubeFest Tokyo 2020に参加してきた](https://medium.com/@bells17/kubefest-tokyo-2020-b77214d70800)

以下は自分が参照したセッションのまとめ。諸事情により主に Yahoo / Z Lab について記載する。

LT については普段の業務で役立ちそうなものを視聴した。

※ 以下は動画を視聴しながらとったメモなので誤字脱字はご容赦ください🙇‍♂️

# ヤフー/ゼットラボのステートフルアプリケーションへの挑戦
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/1/
セッション動画: https://www.youtube.com/watch?v=TGBJHzSddA4

## 概要
- Yahoo では歴が長いシステムもあるため、ステートフルアプリケーションでも CaaS で実現したいという要望は多い。
 - よって Zlab ではステートフルサービスの提供をチャレンジしており、そろそろ GA するみたいだ

## 実績 / 特徴
- 210 以上のチームが CaaS を利用している
 - スポナビも利用しているみたいだ
- Node には openstack を利用する
- Addon-manager → ZLAB が開発。CaaS を利用すると付随して Grafana / Prometheus などが利用できる。
 - CSI / ストレージのアップデートも自動化できる

## 具体例 ~ディスプレイ広告(YDN)~
- オンプレで稼働していたが、以下の課題を解決したかった
 - 余分にリソースを確保していた
 - サーバ故障日の運用が手間
 - リリースにコストが掛かる
- Vespa を利用してシステムを構築しているが、データ管理がステートフル。
 - これを Zlab が提供する CaaS を用いて提供するようにした
 - 1 Pod に 1Server が紐づく構成になっている
- 苦労した点
 - Node とストレージの同期が非同期だった
  - 同期にするような設定を加えることで対応
 - ストレージの IOPS がボトルネック
  -1 k8s クラスタに 1ストレージプールの構成を取ることで対応
- ローリングアップデートでもデータをロストしないようにする
 - preStop Hook を利用し、更新データの同期処理を設定
https://kubernetes.io/ja/docs/concepts/containers/container-lifecycle-hooks/



# 監視の基礎から知る、ヤフーの大量クラスタ監視システムの仕組み
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/27/
セッション動画: https://www.youtube.com/watch?v=wbAK56eDZY4

## 概要
- Yahoo の CaaS の監視・運用基礎
- 大量クラスタを少人数で安定稼働させるには?

## Yahoo の課題
- 利用者の増加によるシステムの大型化
- 稼働サービスの多様化
- CaaS 提供当初は過剰なリソース要求 / サポートの過拡大 / といった問題

## KaaS チーム
- Z Lab / ヤフー KaaS チーム / サービス開発の3ロールが存在
 - KaaS チームは k8s バージョアップ, k8s クラスタのデプロイ / ヤフーインスラとのインテグレーションなどを実施
- 過去の参考発表についても紹介されている

## 自動化の取り組み
- デプロイ作業の自動化
- CI, GitOps による運用自動化
 - KaaS の構成ファイルが Github で全て管理されている
 - Pull リクエストがマージされると自動でデプロイが開始される
- k8s の Custom Resource Definition の仕組みを利用して構築作業を自動化している

## クラスタ監視
- KaaS チームは k8s が正常稼働しているか、デフォルト提供のアドオンが正常稼働されているかを監視している。
- オブザーバビリティ(可観測性) の3本柱 メトリクス / トレース / ログ

- k8s クラスタの監視は Prometheus で監視している
 - exporter で監視対象のメトリクスを収集している
 - クラスタの正常稼働 / アドオンの正常稼働 を監視

- 大量クラスタ監視を集約する
 - 個々のクラスタを関しはできなので、集約システムを構築した
 - データ量が膨大になるので、アラートメトリクスのもを収集するようにしている
 - リソースの使いすぎ / 使われていないクラスタの特定なども行っている
 - KaaS チームは全体最適化の観点で監視している



# 分散密ベクトル探索エンジン Vald の Helm Chart の作成と Operator SDK を用いた Helm ベースの Operator の開発
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/2/
セッション動画: https://www.youtube.com/watch?v=aYNKPcn5nkY

## 概要
- Valt とは
 - k8s 上で稼働する類似ベクトル検索基盤。類似画像検索などで利用
 - OSS
- 従来は NGT 
 - メモリスケーラビリティの課題
 - Valt はコアライブラリとして NGT を利用


## Valt の特徴
- 機能ごとに独立したマイクロサービスとして構成される
- gRPC 通信である
- yaml によるアプリケーション設定ができる
 - Helm を用いて利用することができる

## Heml Chart を作成したときの工夫
- 数千行規模の yaml を簡単に扱える
- 様々なデプロイオプションを提供
 - 機能ごとに独立しているため、機能の on / off が選択可能に
- ドキュメンテーションは大事 

- 全てのコンポーネントの一括設定は "default" で設定する
- コンポーネントごとの設定も、共通した書き方を意識する。上書きできるように設計する。

- ドキュメントは自動生成
 - norwoodj/helm-docs 
 - values.yaml のコメントを元に Markdown テーブルを作成
- values のバリデーションを行える values.schema.json は自作した自動生成ツールをつくったみたいだ。Go で実装

### 課題
- 各コンポーネントを subchart に切り出す / Chart Tests / Char Hooks などを今後は利用していきたい

## Helm ベースの Operator
- Operator ... アプリケーションやインフラなどのリソース固有の k8s Controller 
 - Prometheus Operator / Redis Operator など
- Custom Resource を元にリソースの管理を行う
- Operator は開発することもできる
 - Operator SDK
 - Helm で手軽に作成することができる
- Flux Helm Operator も便利



# The potential of Kubernetes as more than just an infrastructure to deploy
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/11/
セッション動画: https://www.youtube.com/watch?v=tWtT4p96MxI

## 概要
- Yahoo は深層学習を用いて色々なデータを特徴ベクトル化し、ベクトルの距離計算によりデータを NGT に Indexing している
 - 音声 / テキストなど...

- NGT は Yahoo Japan 研究所で開発されている
 - 世界トップレベルの高速高精度な近似近傍検索アルゴリズム
 - メモリ上に全ての Graph and Tree 構造の Index を保持することが特徴
- Yahoo ショッピングの 類似商品画像検索 ヤフオクの出品画像からタグを自動推測する

## 現状の課題
- データが増えることによるメモリ不足
- シャーディングにて解決した例もある
 - envoy を利用
- RAM 使用量に偏りが生じやすい、など運用に負担がかかる
→ Vald の開発に踏み切ることにした

## Vald
- NGT を k8s 上で動作するようにしたもの
- Cloud-Native なアーキテクチャ

- LB Gateway / Agent / Discoverer (k8s API の情報を元にサービスディスカバリを実施する)

- Helm ベースのデプロイすることができる
- Yaml ベースの設定ができる
- controller-runtime を利用している
 - k8s の CRD/API の両方を操作できる
 - これを用いて, Pod 上で動作する NGT のAgent のリソース管理を実現していたりする


# KubernetesにおけるCIについて
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/21/
セッション動画: https://www.youtube.com/watch?v=Ma-22scPRV4

## 概要
- コンテナ上で動作するアプリケーションのテストだけではなく、k8s の構成要素自体のテストもすることができる
- Dockerfile, k8s Manifest などのテストもすることができる
 - これらも Shift left に従って早期にチェックするといいだろう

# kubectl のプラグイン機構を活用してオペレーションを効率化しよう
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/23/
セッション動画: https://www.youtube.com/watch?v=bEP4FwBEjfA

## 概要
- kubectl のコマンドだけでは面倒な実行があるだろう
 - そんなときプラグイン機構を使うと便利
- krew を利用すると、プラグインの検索、インストールができる
- おすすめプラグインも紹介されている


# Kpt を使って組み換え可能な Manifest Pipeline を作ろう！
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/23/
セッション動画: https://www.youtube.com/watch?v=bEP4FwBEjfA

## 概要
- Manifest 構築ツールである

# Re: Kubernetes-native テストベッドで始めるベストプラクティス模索
セッション概要: https://k8sjp.github.io/kubefest-2020/sessions/26/
セッション動画: https://www.youtube.com/watch?v=hKII_CSWmp8

## 概要
- k8s の controller を使って、k8s をより使いやすくすることができる。最近の流行り
- 全ての管理を k8s に任せる kubernetes-native な世界観を目指す
 - 青山さんはそれを実現する kubernetes-native TESTBED を作成した