kubesprayとラズパイでおうちKubernetes
はじめに
kubesprayとラズパイを使って、おうち Kubernetes クラスターを構築する方法を紹介します。
構成は Control Plane が 1 台、Worker Node が 2 台の合計 3 台で構築します。
この記事で紹介するソースコードは以下のリポジトリにあります。
材料
配線が煩雑になるのが嫌だったので、PoE で給電することにしました。
名前 | 単価 | 個数 | 備考 |
---|---|---|---|
Raspberry Pi 4 Model B 8GB | 16,800 円 | 3 | |
アクリルケース付き PoE HAT | 3,599 円 | 3 | |
TP-Link TL-SG105PE | 6,667 円 | 1 | PoE 給電に対応 |
microSD カード 64GB | 980 円 | 3 | |
HDMI (メス) - micro HDMI (オス) 変換アダプタ | 970 円 | 1 | OS の初期化・ssh の設定用 |
OS のインストール
Raspberry Pi Imager を使って OS をインストールします。
以下リンクの Raspberry Pi Imager の公式サイトにアクセスし、Raspberry Pi Imager をインストールしてください。
この記事では Ubuntu24.04 をインストールします。
[Other general-purpose OS]>[Ubuntu]>[Ubuntu Server 24.04.1 LTS (64-bit)]と遷移して、OS を選択してください。
構築
kubespray は Ansible の collection です。変数を使ってインストールする内容をカスタマイズすることができます。
また、helm や ingress 等の addon も一緒にインストールできます。
構成
インストールする内容は以下の通りです。
- Kubernetes:v1.30.4
- CNI:flannel
- addon:
- helm
- metrics_server
- cert_manager
- metallb
- ingress_nginx
Playbook にするとこうなります。
---
- name: Install Kubernetes
ansible.builtin.import_playbook: kubernetes_sigs.kubespray.cluster
vars:
kube_version: v1.30.4
kube_network_plugin: flannel
kubeconfig_localhost: true
kubectl_localhost: true
helm_enabled: true
metrics_server_enabled: true
cert_manager_enabled: true
kube_proxy_strict_arp: true
metallb_enabled: true
metallb_speaker_enabled: true
metallb_namespace: metallb-system
metallb_config:
address_pools:
primary:
ip_range:
- 192.168.0.100-192.168.0.200 # ご自身の環境で読み替えてください
auto_assign: true
layer2:
- primary
ingress_nginx_enabled: true
ingress_nginx_namespace: ingress-nginx
実行
以下のリポジトリを clone してください。
git clone https://github.com/CASL0/ansible.git
inventories/hostsの IP アドレスをご自身の環境に合わせて修正してください。
以下のコマンドで Kubernetes クラスターを構築します。
python -m venv .env
source .env/bin/activate
pip install -r requirements.txt
ansible-galaxy install -r requirements.yml
ansible-playbook playbooks/mycluster.yml -b
成功するとコマンドを実行したマシン(Control node)に kubeconfig(admin.conf) と kubectl がダウンロードされます。
以下のコマンドで Kubernetes の API を実行することができます。
cd inventories/artifacts
./kubectl.sh get nodes
各 Node の STATUS が Ready になっていることを確認してください。
NAME STATUS ROLES AGE VERSION
192.168.0.5 Ready control-plane 2h v1.30.4
192.168.0.6 Ready <none> 2h v1.30.4
192.168.0.7 Ready <none> 2h v1.30.4
Discussion