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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for melanmeg melanmeg
December 10, 2024
300

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

Avatar for melanmeg

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に勝った ※喧嘩を売っている訳ではない