【ITニュース解説】I got tired of rebuilding my homelab Kubernetes cluster, so I automated the whole thing
2026年09月26日に「Dev.to」が公開したITニュース「I got tired of rebuilding my homelab Kubernetes cluster, so I automated the whole thing」について初心者にもわかりやすく解説しています。
ITニュース概要
Kubernetesクラスターの手動構築・再構築は手間がかかる。筆者は、自宅の複雑なKubernetes環境を自動で構築するスクリプトを作成した。VMの準備からHA構成まで、本番に近い本格的な環境が手軽に作れるため、システム学習や検証が効率的に行える。
ITニュース解説
Kubernetesは、コンテナ化されたアプリケーションを効率的に管理・運用するためのデファクトスタンダードとして広く利用されているが、そのクラスター構築には多くの手間と専門知識が必要となる場合が多い。筆者は自身の学習環境である「ホームラボ」でKubernetesクラスターを構築する際に、何度も不具合を起こしては、仮想マシン(VM)の作成からKubernetesの初期設定、ネットワーク設定、ノードの参加といった一連の作業を手作業で繰り返すことに疲弊していた。こうした経験から、手作業での再構築の手間と時間の無駄を解消するため、クラスター構築の全工程を自動化するスクリプトを作成するに至った。
このスクリプトは、単一のKVMホスト(仮想化環境を提供するサーバー)上に、実運用に近い高可用性(HA)構成のKubernetesクラスターを構築する。具体的には、合計6つの仮想マシンを作成し、その上に3つのコントロールプレーンノードと2つのワーカーノードからなるKubernetesクラスターを構成する。コントロールプレーンノードはクラスター全体の制御を行う中核であり、高可用性を実現するため複数台で構成される。ワーカーノードは、実際にアプリケーションのコンテナを実行する役割を担う。コントロールプレーンノード間でデータを共有する「etcd」は、各コントロールプレーンノード上に直接デプロイされる「stacked etcd」方式を採用している。
外部からのアクセスは、まず「k8s-bastion」VMにデプロイされたHAProxyを経由する。HAProxyは、複数のコントロールプレーンAPIサーバーへの負荷分散と高可用性を提供するプロキシとして機能する。Webアプリケーションへのアクセスを可能にするため、「ingress-nginx」も導入され、ワーカーノード全体に配置されHTTP(80番ポート)およびHTTPS(443番ポート)のトラフィックを処理する。コンテナ間のネットワーク通信には「Calico CNI」が利用される。この構成は、k3sやkindといった簡易版ではなく、「kubeadm」というツールを使って構築される本番環境でも見られるような本格的なものである。筆者は、実運用に近いこの構成を構築し、Kubernetesの各コンポーネントがどのように連携するかを深く理解することを目的としていた。
自動化スクリプトは、Kubernetesクラスター構築の複雑なプロセスを複数の段階に分割し、それぞれを順番に実行する。 「prep」ステージでは、SSHキーの準備、ホストサーバーに必要なパッケージのインストール、OSの元となるRocky Linux 9クラウドイメージのダウンロードを行う。 「vms」ステージで、cloud-initというツールを活用し、指定されたスペックで6つの仮想マシンを効率的に作成する。cloud-initは、VMが初回起動時に自動で初期設定を実行し、手動でのOSインストールを不要にする。 「ip」ステージでは、作成された仮想マシン群のIPアドレスを収集し、後の設定で利用するための状態ファイルに保存する。VMのIPアドレス取得はタイミングによっては困難な場合があるため、スクリプトは複数の方法を試し、数分間リトライを繰り返す工夫がされている。 「bastion」ステージでは、HAProxyをデプロイするk8s-bastionノードにHAProxyを設定し、Kubernetesクラスターのブートストラップに必要なスクリプトを配置する。 「install」ステージでは、containerdというコンテナランタイムのインストール、kubeadmによるコントロールプレーンの初期化、Calico CNIのデプロイ、そして全てのノードをクラスターに参加させる処理を実行する。 「addons」ステージでは、ingress-nginxをデプロイし、HAProxyを介してWebアプリケーションへの80番/443番ポートのアクセス経路を設定する。 最後に「verify」ステージで、構築されたKubernetesクラスターが正常に動作しているかを確認する。
筆者はこの自動化プロセスを通じて、いくつかの重要な教訓を得た。cloud-initを使ったクラウドイメージの利用により、各VMのOSインストール作業が劇的に簡素化され、手動でのクリック操作が不要になった。また、IPアドレスの収集が予想以上に厄介な問題であり、スクリプトが多様な方法で試行錯誤して取得する仕組みは、この問題を解決するための重要な改善点であった。
さらに、スクリプトを複数のステージに分割し、それぞれのステージを何度でも安全に再実行できるように設計したことは、開発効率を大きく向上させた。途中でエラーが発生した場合でも、修正後にそのステージから再開できるため、最初からやり直す必要がなくなる。既存のVMやインストール済みパッケージ、既に参加済みのノードはスキップされる。加えて、複数のノードに対するコンテナランタイムやkubeadmのインストールといった準備作業を並列で実行することで、全体の構築時間を大幅に短縮できた。
これらの工夫により、Kubernetesクラスターの構築はわずか10分から20分程度で完了し、全てのコントロールプレーンノードとワーカーノードが「Ready」状態となる。
ただし、この自動化されたホームラボ環境にはいくつかの限界も存在する。例えば、HAProxyがデプロイされているk8s-bastionは単一のVMであるため、HAProxyに障害が発生した場合、コントロールプレーンへのアクセスが途絶える可能性がある。コントロールプレーン自体は高可用性構成だが、その入口が単一障害点となっているのだ。また、このクラスターはデフォルトで合計30vCPU、88GB RAMという比較的大きなリソースを消費するため、ホストサーバーのスペックによっては調整が必要となる。スクリプトにはリソース設定を調整するための変数が用意されており、実行前にホストのスペックと比較する機能も備わっている。最後に、この構成はあくまで学習やホームラボでの利用を想定しており、本番環境向けの堅牢なセキュリティ設定(Firewalldの無効化、SELinuxのパーミッシブモード、SSHホストキーチェックのスキップなど)は簡素化されている点に注意が必要である。これはあくまで学習をシンプルに進めるための選択である。
この自動化スクリプトは、Kubernetesの学習者や、実運用に近いインフラストラクチャをホームラボで構築したい人々にとって、非常に有用なツールとなり得る。CKA(Certified Kubernetes Administrator)などの資格取得を目指す上での実践的な学習環境としても役立つだろう。