Share
Embed
コマンド一発で、本格的なおうちKubernetesを構築する
作成したリポジトリ:
https://github.com/melanmeg/k8s_1-30_on_noble
参考:
https://github.com/unchama/kube-cluster-on-proxmox
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
melanmeg
December 10, 2024
Transcript
20 slides
-
コマンド一発で、本格的なおうちKubernetesを構築する Copyright © 3-shake, Inc. All Rights Reserved. 2024/12/10 Kubernetes
Novice Tokyo #35 @melanmeg -
自己紹介 10月から株式会社スリーシェイクに入社しました! よろしくお願いします 山本直矢 @melanmeg 趣味:ホロライブ、ツイキャス廃人 最近の仕事:terraform, shared-vpc, 課金通知実装 魔女っ子シオンの
Magical cafe 「紫咲シオン」のコラボカフェ キュアメイドカフェ秋葉原で開催決定! https://hololive.hololivepro.com/events/shioncafe2024/ ツイキャスAPIツール https://twicas-api.melanmeg.com/download 作ったやつ ※たいしたものではない -
はじめに、今回作るクラスタ全体像 サーバー構成 • 物理ノード x1 • 管理ノード x1 • コントロールプレーン
x3 • ワーカーノード x3 • ロードバランサー x2 今回作成したリポジトリ↓ https://github.com/melanmeg/k8s_1-30_on_noble -
事前準備【物理】 スペック • CPU:10コア/16スレッド、メモリ:128GB ◦ 本格的なKubernetesクラスタ構築の検証だけなら十分 ◦ 個人レベルなら、ある程度サービスを載せて運用もできる • 総額で約15万円
※できれば物理で3つに分けておきたくはある 【あとから買ったもの】 グラボ: Nvidia GT 710 4,947円 メモリ: 同じやつ 30,600円 合計:150,266円 -
元にしたリポジトリがある このリポジトリはなに? 『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 もう三年前 -
元にしたリポジトリがある このリポジトリはなに? 『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でも作れるよう -
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 -
KVMで使うイメージについて イメージには「Ubuntu Cloud Images」を使っている • オンプレミスでもCloud-initを利用したVM作成ができる ※本来パブリック クラウド上で実行するために Canonical によってカスタマイズされた公式
Ubuntu イメージであるが、KVMでも動作可能 https://cloud-images.ubuntu.com/ なぜCloud-initか • テンプレートになる • コマンド一発で構築するには、ネットワーク設定やSSH設定な どプロビジョニングが必要 -
Cloud-initの設定ポイント cloudinit.tfに記載 runcmdプロパティ:初回起動時に実行したい処理を記載 例えば、 - パッケージアップデート - ビープ音無効化 - リポジトリ先を理研に変える
.etc • 工夫したポイント 最後に nc -l -p 12345 を実行して、 Terraform最後のヘルスチェックとして、12345ポートをポーリングしている terraform/modules/vm/cloudinit.tf -
なぜAnsibleか 一から作ると、手順と対象サーバーが多くて大変 ↓ 自動化したシェルスクリプトを使っていたが... ↓ 以下のような懸念がでた • SSHでファイル設置・実行までも自動化したい • (k8sバージョンアップ時の修正などで)デバッグがしずらい
• ファイル分割したい ↓ Ansible良さそう!と安直に使い始めた -
Ansibleの良いところ 以下のようなことができる • 複数のサーバに並列・逐次実行が可能 • 処理のまとまり(playbookやtask)で再利用でき、ワーカー・コントロールプレー ン・LBの各役割に対して適用できる • Jinjaテンプレートが使える •
コントロールプレーンで生成したノード参加の定義ファイルもfetchして別ノードに コピーするなども自動化できる • シェルに比べ、安全に変数の受け渡しができる • サーバー追加時には、役割に対して必要な処理を実行できる おうちKubernetes構築自動化にとても適している ※Ansible大好き人間なので、他の構成管理ツールは存じてない -
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読み込み 変数利用 -
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の方が通信が安定するかなと個人的に 思っているためです。 -
最後に:GKEとクラスタ作成までの時間をバトルをしてみた • TerraformでGKEクラスタ作成 [完了条件] Terraform で GKE Autopilot作成 → Terraformが完了するまで
• 今回作ったもの(オンプレミス)でクラスタ作成 [完了条件] VM作成→Kubernetes構成→NodeがすべてReadyになるまで 【計測結果】 GKEクラスタ作成:664秒 今回作ったもの:320秒 ※ GKEとオンプレの時点で、比較するには環境が大きく異なるが、 今回はあまり細かいことは気にしないことにした CP×1, WK×3構成 であれば、200秒も掛からなかった。 オンプレミスでは削除は数秒であるのはメリット オンプレでも最新世代のCPUを買えば、そこらのインスタンスより 高速に動作していると思う GKEに勝った ※喧嘩を売っている訳ではない