Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コマンド一発で、本格的なおうちKubernetesを構築する

melanmeg
December 10, 2024
110

 コマンド一発で、本格的なおうちKubernetesを構築する

melanmeg

December 10, 2024
Tweet

Transcript

  1. 自己紹介 10月から株式会社スリーシェイクに入社しました! よろしくお願いします 山本直矢 @melanmeg 趣味:ホロライブ、ツイキャス廃人 最近の仕事:terraform, shared-vpc, 課金通知実装 魔女っ子シオンの

    Magical cafe  「紫咲シオン」のコラボカフェ キュアメイドカフェ秋葉原で開催決定! https://hololive.hololivepro.com/events/shioncafe2024/ ツイキャスAPIツール https://twicas-api.melanmeg.com/download 作ったやつ ※たいしたものではない
  2. はじめに、今回作るクラスタ全体像 サーバー構成 • 物理ノード x1 • 管理ノード x1 • コントロールプレーン

    x3 • ワーカーノード x3 • ロードバランサー x2 今回作成したリポジトリ↓ https://github.com/melanmeg/k8s_1-30_on_noble
  3. 事前準備【物理】 スペック • CPU:10コア/16スレッド、メモリ:128GB ◦ 本格的なKubernetesクラスタ構築の検証だけなら十分 ◦ 個人レベルなら、ある程度サービスを載せて運用もできる • 総額で約15万円

    ※できれば物理で3つに分けておきたくはある 【あとから買ったもの】  グラボ:   Nvidia GT 710   4,947円  メモリ:   同じやつ   30,600円 合計:150,266円
  4. 元にしたリポジトリがある このリポジトリはなに? 『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 もう三年前
  5. 元にしたリポジトリがある このリポジトリはなに? 『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でも作れるよう
  6. 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
  7. KVMで使うイメージについて イメージには「Ubuntu Cloud Images」を使っている • オンプレミスでもCloud-initを利用したVM作成ができる ※本来パブリック クラウド上で実行するために Canonical によってカスタマイズされた公式

    Ubuntu イメージであるが、KVMでも動作可能 https://cloud-images.ubuntu.com/ なぜCloud-initか • テンプレートになる • コマンド一発で構築するには、ネットワーク設定やSSH設定な どプロビジョニングが必要
  8. Cloud-initの設定ポイント cloudinit.tfに記載 runcmdプロパティ:初回起動時に実行したい処理を記載 例えば、 - パッケージアップデート - ビープ音無効化 - リポジトリ先を理研に変える

    .etc • 工夫したポイント 最後に nc -l -p 12345 を実行して、 Terraform最後のヘルスチェックとして、12345ポートをポーリングしている terraform/modules/vm/cloudinit.tf
  9. Ansibleの良いところ 以下のようなことができる • 複数のサーバに並列・逐次実行が可能 • 処理のまとまり(playbookやtask)で再利用でき、ワーカー・コントロールプレー ン・LBの各役割に対して適用できる • Jinjaテンプレートが使える •

    コントロールプレーンで生成したノード参加の定義ファイルもfetchして別ノードに コピーするなども自動化できる • シェルに比べ、安全に変数の受け渡しができる • サーバー追加時には、役割に対して必要な処理を実行できる おうちKubernetes構築自動化にとても適している ※Ansible大好き人間なので、他の構成管理ツールは存じてない
  10. 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読み込み 変数利用
  11. 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の方が通信が安定するかなと個人的に 思っているためです。
  12. 最後に:GKEとクラスタ作成までの時間をバトルをしてみた • TerraformでGKEクラスタ作成 [完了条件] Terraform で GKE Autopilot作成 → Terraformが完了するまで

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