Slide 1

Slide 1 text

コマンド一発で、本格的なおうちKubernetesを構築する Copyright © 3-shake, Inc. All Rights Reserved. 2024/12/10 Kubernetes Novice Tokyo #35 @melanmeg

Slide 2

Slide 2 text

自己紹介 10月から株式会社スリーシェイクに入社しました! よろしくお願いします 山本直矢 @melanmeg 趣味:ホロライブ、ツイキャス廃人 最近の仕事:terraform, shared-vpc, 課金通知実装 魔女っ子シオンの Magical cafe  「紫咲シオン」のコラボカフェ キュアメイドカフェ秋葉原で開催決定! https://hololive.hololivepro.com/events/shioncafe2024/ ツイキャスAPIツール https://twicas-api.melanmeg.com/download 作ったやつ ※たいしたものではない

Slide 3

Slide 3 text

はじめに、今回作るクラスタ全体像 サーバー構成 ● 物理ノード x1 ● 管理ノード x1 ● コントロールプレーン x3 ● ワーカーノード x3 ● ロードバランサー x2 今回作成したリポジトリ↓ https://github.com/melanmeg/k8s_1-30_on_noble

Slide 4

Slide 4 text

事前準備【物理】 スペック ● CPU:10コア/16スレッド、メモリ:128GB ○ 本格的なKubernetesクラスタ構築の検証だけなら十分 ○ 個人レベルなら、ある程度サービスを載せて運用もできる ● 総額で約15万円 ※できれば物理で3つに分けておきたくはある 【あとから買ったもの】  グラボ:   Nvidia GT 710   4,947円  メモリ:   同じやつ   30,600円 合計:150,266円

Slide 5

Slide 5 text

事前準備【ソフト】 必要なツール ● Ubuntu24.04(物理ノード) ● KVM(物理ノード) ● Ansible、Terraform(管理ノード)

Slide 6

Slide 6 text

コマンド一発で作られる仕組み ①[ノード構築] Terraform (仮想VMを作るなど) ②[Kubernetes構成] Ansible (kubernetesインストールなど) ラップしたシェルスクリプト (コマンド一発)

Slide 7

Slide 7 text

元にしたリポジトリがある このリポジトリはなに? 『Proxmox環境でサクッと作ってサクっと壊せる高可用性なkubernetesク ラスタを作ってみる』 ※README引用 ● ./deploy-vm.sh : Proxmox VE専用ツールであるqmを利用し、 VM作成 ● ./scripts/k8s-node-setup.sh : containerd、kubernetesコンポーネント、 haproxy・keepalivedなどの諸々をインストールし、 kubernetesを構成 https://github.com/unchama/kube-cluster-on-proxmox こちらのうんちゃまさん(散財系鯖主Youtuber)のリポジトリが起源になってます! 個人的に好きな配信 【OpenStack建てたい話してたらKubernetesの勉強会になった(飲酒)】 https://www.youtube.com/watch?v=7BLmtR1nhcY もう三年前

Slide 8

Slide 8 text

元にしたリポジトリがある このリポジトリはなに? 『Proxmox環境でサクッと作ってサクっと壊せる高可用性なkubernetesク ラスタを作ってみる』 ※README引用 ● ./deploy-vm.sh : Proxmox VE専用ツールであるqmを利用し、必要な 仮想マシンの構築 ● ./scripts/k8s-node-setup.sh : containerd、kubernetesコンポーネント、 haproxy・keepalived、などの諸々をインストールして クラスタをセットアップ https://github.com/unchama/kube-cluster-on-proxmox こちらのうんちゃまさん(散財系鯖主Youtuber)のリポジトリが起源になってます! 個人的好きだった配信 【OpenStack建てたい話してたらKubernetesの勉強会になった(飲酒)】 https://www.youtube.com/watch?v=7BLmtR1nhcY もう三年前 [deploy-vm.shについて] シェルスクリプト (Proxmox VE / qm) ↓ Terraoform / libvirt-provider (KVM/QEMU / virt-install) [k8s-node-setup.shについて] シェルスクリプト ↓ Ansible ※Terraformプロバイダーのlibvirtもあり、 Terraformでも作れるよう

Slide 9

Slide 9 text

Terraform構成 https://github.com/dmacvicar/terraform-provider-libvirt ※このリポジトリはベストエフォートでのメンテであることに注意 terraform-provider-libvirt これはなに? TerraformでKVM上にVM作成できる ● commonモジュール :共通で使うリソースを定義 ○ ボリュームのプールl ○ Cloud-initのUbuntuイメージ用ボリューム ● vmモジュール :仮想マシン作成に必要なリソースを定義 ○ ドメイン ○ ボリューム(ディスク用) ○ Cloud-init . ├── env │ └── main.tf └── modules ├── common │ ├── common.tf │ ├── output.tf │ ├── provider.tf │ └── variables.tf └── vm ├── cloudinit.tf ├── domain.tf ├── healthcheck.tf ├── provider.tf ├── variables.tf └── volume.tf サーバー構成 ● 物理ノード x1 ● 管理ノード x1 ● コントロールプレーン x3 ● ワーカーノード x3 ● ロードバランサー x2

Slide 10

Slide 10 text

KVMで使うイメージについて イメージには「Ubuntu Cloud Images」を使っている ● オンプレミスでもCloud-initを利用したVM作成ができる ※本来パブリック クラウド上で実行するために Canonical によってカスタマイズされた公式 Ubuntu イメージであるが、KVMでも動作可能 https://cloud-images.ubuntu.com/ なぜCloud-initか ● テンプレートになる ● コマンド一発で構築するには、ネットワーク設定やSSH設定な どプロビジョニングが必要

Slide 11

Slide 11 text

Cloud-initの設定ポイント cloudinit.tfに記載 runcmdプロパティ:初回起動時に実行したい処理を記載 例えば、 - パッケージアップデート - ビープ音無効化 - リポジトリ先を理研に変える .etc ● 工夫したポイント 最後に nc -l -p 12345 を実行して、 Terraform最後のヘルスチェックとして、12345ポートをポーリングしている terraform/modules/vm/cloudinit.tf

Slide 12

Slide 12 text

なぜAnsibleか 一から作ると、手順と対象サーバーが多くて大変 ↓ 自動化したシェルスクリプトを使っていたが... ↓ 以下のような懸念がでた ● SSHでファイル設置・実行までも自動化したい ● (k8sバージョンアップ時の修正などで)デバッグがしずらい ● ファイル分割したい ↓ Ansible良さそう!と安直に使い始めた

Slide 13

Slide 13 text

Ansibleの良いところ 以下のようなことができる ● 複数のサーバに並列・逐次実行が可能 ● 処理のまとまり(playbookやtask)で再利用でき、ワーカー・コントロールプレー ン・LBの各役割に対して適用できる ● Jinjaテンプレートが使える ● コントロールプレーンで生成したノード参加の定義ファイルもfetchして別ノードに コピーするなども自動化できる ● シェルに比べ、安全に変数の受け渡しができる ● サーバー追加時には、役割に対して必要な処理を実行できる おうちKubernetes構築自動化にとても適している ※Ansible大好き人間なので、他の構成管理ツールは存じてない

Slide 14

Slide 14 text

Ansibleの仕組み $ ansible-playbook --key-file $KEY -i inventory.yml playbook.yml ファイルの配置 . ├── inventory.yml ├── playbook.yml ├── tasks/ └── vars_files ├── env.yml └── vars.yml playbook.yml env.yml vars.yml inventory.yml ホスト設定 タスク設定 vars_files読み込み 変数利用

Slide 15

Slide 15 text

haproxy、keepalived設定について Python実行すると、テンプレートを生成できるように自動化。 ※配列にサービス情報を追記する運用 ※JinjaテンプレートからJinjaテンプレートファイルを生成 haproxy_template.cfg.j2 ↓ haproxy.cfg.j2 keepalived_template.cfg.j2 ↓ keepalived.conf.j2 Ansibleのtemplateに渡す ※ 外部アクセスは、MetalLBなどは入れず、サービス追加ごとにhaproxyでNodePortにアクセス する方法で構築しました。ARPなどの通信よりもhaproxyの方が通信が安定するかなと個人的に 思っているためです。

Slide 16

Slide 16 text

スクリプト実行(改めて全体像) スクリプト実行

Slide 17

Slide 17 text

最後に:GKEとクラスタ作成までの時間をバトルをしてみた ● TerraformでGKEクラスタ作成 [完了条件] Terraform で GKE Autopilot作成 → Terraformが完了するまで ● 今回作ったもの(オンプレミス)でクラスタ作成 [完了条件] VM作成→Kubernetes構成→NodeがすべてReadyになるまで 【計測結果】 GKEクラスタ作成:664秒 今回作ったもの:320秒 ※ GKEとオンプレの時点で、比較するには環境が大きく異なるが、 今回はあまり細かいことは気にしないことにした CP×1, WK×3構成 であれば、200秒も掛からなかった。 オンプレミスでは削除は数秒であるのはメリット オンプレでも最新世代のCPUを買えば、そこらのインスタンスより 高速に動作していると思う GKEに勝った ※喧嘩を売っている訳ではない

Slide 18

Slide 18 text

まとめ 使ってくれとは言わないが、 誰かの役に立てば嬉しい おうちkubernetesの知識とマシンがあれば、 Kubernetes検証環境を高速に作れる

Slide 19

Slide 19 text

Let’s おうちKubernetes Copyright © 3-shake, Inc. All Rights Reserved.

Slide 20

Slide 20 text

参考 ● https://github.com/unchama/kube-cluster-on-proxmox ● https://github.com/melanmeg/k8s_1-30_on_noble ● https://k8sh.net/arch/ ● https://www.server-world.info/query?os=Ubuntu_24.04&p=kubernetes&f=1 ● https://www.youtube.com/watch?v=7BLmtR1nhcY