Slide 1

Slide 1 text

オンプレミス Kubernetesへの サービス移行 lyluck

Slide 2

Slide 2 text

● 2022年12月 ピクシブ中途入社 ● 技術開発本部 インフラ部 ソリューションアーキテクト チーム ● ピアノと音ゲーが趣味 lyluck

Slide 3

Slide 3 text

● なぜオンプレミスKubernetes? ● クラスタ構築 ● 良かった点と悪かった点 話すこと

Slide 4

Slide 4 text

なぜオンプレミス Kubernetes?

Slide 5

Slide 5 text

サーバーの準備には 時間がかかる!

Slide 6

Slide 6 text

サーバーの準備 1. 見積もり(1ヶ月) 2. 調達(半年) 3. セットアップ 4. テスト 5. 監視設定 6. アプリケーション が動く

Slide 7

Slide 7 text

Kubernetesの場合 1. コンテナを用意する 2. マニフェストファイルを書く 3. アプリケーションが動く

Slide 8

Slide 8 text

メンテナンスが大変

Slide 9

Slide 9 text

サーバーのメンテナンス ● サーバーの入れ替え ● スケールアウト・スケールイン

Slide 10

Slide 10 text

サーバーのメンテナンス ● 開発チームとの調整が必要 ● どのサーバーが対象? ● デプロイ禁止の時間帯

Slide 11

Slide 11 text

Kubernetesの場合 ● 調整不要 ● アプリケーションを 自動で適切なノードへ割り当て

Slide 12

Slide 12 text

クラウドじゃダメ?

Slide 13

Slide 13 text

実例をみてみよう

Slide 14

Slide 14 text

オンプレKubernetes実例 ● VRoid Hub ● pixiv Sketch ● FANBOXプリント ● Airflow (バッチ) ● Rendertron (SEO)

Slide 15

Slide 15 text

クラウド(GKEなど)実例 ● pixiv Ads (広告) ● Sentry (監視) ● IAP (認証プロキシ) ● GitLab Runner (CI/CD) ● Rendertron (SEO)

Slide 16

Slide 16 text

オンプレ vs クラウド

Slide 17

Slide 17 text

オンプレ クラウド スケーラビリティ ✅ 管理工数 ✅ 費用 ✅ カスタマイズ ✅ クラウド連携 ✅ オンプレ通信コスト ✅

Slide 18

Slide 18 text

pixiv Ads (広告): クラウド ● トラフィックの激しい増加がある ● オンプレと通信しない

Slide 19

Slide 19 text

Airflow (バッチ): オンプレ ● オンプレと通信する ● セキュリティの観点でインターネットを 通したくない

Slide 20

Slide 20 text

Rendertron (SEO): ハイブリッド ● 元々はクラウド ● オンプレと通信しない ● クラウドの料金を削減したい

Slide 21

Slide 21 text

オンプレKubernetesが 有効な場合もある!

Slide 22

Slide 22 text

VRoid Hub の移行事例

Slide 23

Slide 23 text

もともとの構成 ● 手動スケール ● スパイクがある ● オンプレと通信する > オンプレK8s

Slide 24

Slide 24 text

移行後 ● スケール対象をK8s化 ● オートスケール ● サーバー数が減った

Slide 25

Slide 25 text

クラスタ構築

Slide 26

Slide 26 text

使ったもの ● kubespray ● k0s, k0sctl ● MetalLB

Slide 27

Slide 27 text

kubespray https://github.com/kubernetes-sigs/kubespray

Slide 28

Slide 28 text

kubespray使ってみた ● Kubernetes SIGs管理 ● 中身はAnsible ● Ansibleは社内実績が多い

Slide 29

Slide 29 text

kubespray合わなかった ● 実行に時間がかかる ● Ansible二重管理が辛い ○ pixivではホストセットアップにも Ansibleを使う

Slide 30

Slide 30 text

k0s https://github.com/k0sproject/k0s

Slide 31

Slide 31 text

k0sを採用 ● バイナリひとつで大体動く ● Kubernetes本体への変更がない ● 起動がはやい

Slide 32

Slide 32 text

k0sctl ● k0sを使ってクラスタのIaC ● 簡単にk0sクラスタを構築できる

Slide 33

Slide 33 text

k0sctl.yaml – クラスタ設定ファイル

Slide 34

Slide 34 text

● kustomizeで複数クラスタを差分で管理 ● GitLab CIからデプロイ k0sctl

Slide 35

Slide 35 text

MetalLB https://github.com/metallb/metallb

Slide 36

Slide 36 text

MetalLB ● 外部ロードバランサーの実装 ● サービスをクラスタ外部へ公開する ● オンプレだと標準実装がない

Slide 37

Slide 37 text

クラスタ運用

Slide 38

Slide 38 text

product A product B product C Argo CD namespace A namespace B namespace C

Slide 39

Slide 39 text

マルチテナント ● プロダクトごとのnamespace ● プロダクトごとのマニフェストrepo

Slide 40

Slide 40 text

権限管理: 権限分離 ● 複数の部署が同一クラスタを使うので 権限を分割する ● namespace単位で分離

Slide 41

Slide 41 text

権限管理: OneLogin ● pixivではOneLoginを利用する ○ SSO, ID管理 ● OneLoginと連携して所属部署から 自動権限割り当て

Slide 42

Slide 42 text

アプリケーション管理: Argo CD ● Kubernetesリソースの確認・操作 ● アプリケーションログ

Slide 43

Slide 43 text

アプリケーション管理: Datadog ● pixivでは監視をDatadogに統一している ● CPU, メモリ, パフォーマンス

Slide 44

Slide 44 text

アプリケーション管理: kubectl ● クラスタ管理者のみ

Slide 45

Slide 45 text

アップグレード ● Kubernetes本体 ● エコシステム ○ Argo CD, Datadogなどいろいろ

Slide 46

Slide 46 text

アップグレード: Kubernetes ● k0sctlがいい感じにやってくれる

Slide 47

Slide 47 text

アップグレード: Kubernetes 1. k0sctl.yamlを書き換える 2. k0sctl apply name: my-k0s-cluster spec: k0s: - version: "v1.28.12+k0s.0" + version: "v1.29.7+k0s.0" hosts: - role: controller installFlags:

Slide 48

Slide 48 text

k0sctl applyで起きること ● controlplaneのアップグレード ● workerを1台ずつ drain > アップグレード > uncordon

Slide 49

Slide 49 text

アップグレード: エコシステム ● GitLab CIから定期的にRenovate ● エコシステムのリリースを検知+MR作成 ● 自動マージはしない

Slide 50

Slide 50 text

良かった点と悪かった点

Slide 51

Slide 51 text

良かった点

Slide 52

Slide 52 text

良かった点 ● 開発側と無調整でメンテできる ● 構成変更が簡単

Slide 53

Slide 53 text

開発側と無調整でメンテできる ● クラスタのホストのメンテナンス ● 開発側はインフラを気にせずデプロイ可

Slide 54

Slide 54 text

構成変更が簡単 ● ほぼコミットのみで変更(IaC) ● 適用が早い ● ロールバックが簡単ですみやか

Slide 55

Slide 55 text

悪かった点

Slide 56

Slide 56 text

悪かった点 ● わからないことが多い ● アップグレードが大変

Slide 57

Slide 57 text

わからないことが多い ● 問題が発生した時、だいたい初見 ● K8sだけでも複雑だが オンプレとK8sの組み合わせで さらに難解

Slide 58

Slide 58 text

アップグレードが大変 ● 回数が多い ● EOLまでが短い ● チェンジログは小さくない

Slide 59

Slide 59 text

まとめ

Slide 60

Slide 60 text

まとめ ● オンプレミスKubernetes運用を始めた ● 管理工数は大きいが費用削減や オンプレミスと通信する場合、有効