2025/07/27
2025/07/27
Kubernetesを学ぶために、自宅でクラスター環境を構築しました。
今回はRaspberry Pi 2台を使ってK3sクラスターを組み、最終的にKubernetes Dashboardまでデプロイできたので、その手順と躓いたポイントをまとめます。
目的: 自宅でKubernetes学習環境を構築
構成: Raspberry Pi 2台でK3sクラスター
yamakenmain
(192.168.1.85) - マスターノードyamakensub1
(192.168.1.84) - ワーカーノードyamakensub2
(192.168.1.86) は起動せず、2台構成に変更Raspberry Pi Imagerでの事前設定:
基本パッケージのインストール:
# システムアップデート
sudo apt update && sudo apt upgrade -y
# 必要パッケージのインストール
sudo apt install -y curl wget vim git htop
各ノードに固定IPを設定(/etc/dhcpcd.conf
):
interface wlan0
static ip_address=192.168.1.85/24 # 各ノードで異なるIP
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8
/etc/hosts
にクラスター内の名前解決を追加:
192.168.1.84 yamakensub1 k8s-worker1
192.168.1.85 yamakenmain k8s-master
192.168.1.86 yamakensub2 k8s-worker2
cgroupの有効化(/boot/cmdline.txt
):
# 既存の内容の最後に追加(重要:改行なし)
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
スワップの無効化:
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo systemctl disable dphys-swapfile.service
マスターノード (yamakenmain):
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
# トークン取得(ワーカーノード接続用)
sudo cat /var/lib/rancher/k3s/server/node-token
ワーカーノード (yamakensub1):
# ホスト名変更
sudo hostnamectl set-hostname yamakensub1
# K3sエージェントインストール
curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.85:6443 K3S_TOKEN=<取得したトークン> sh -
Helmのインストール:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Dashboardのデプロイ:
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm repo update
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
--create-namespace \
--namespace kubernetes-dashboard
管理者ユーザーの作成(admin-user.yaml
):
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f admin-user.yaml
systemdサービスでポートフォワードを常時実行(/etc/systemd/system/k8s-dashboard-forward.service
):
[Unit]
Description=Kubernetes Dashboard Port Forward
After=k3s.service
[Service]
Type=simple
ExecStart=/usr/bin/kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml port-forward -n kubernetes-dashboard svc/kubernetes-dashboard-kong-proxy 8443:443 --address=0.0.0.0
Restart=always
[Install]
WantedBy=multi-user.target
サービスの有効化:
sudo systemctl enable k8s-dashboard-forward.service
sudo systemctl start k8s-dashboard-forward.service
問題: 両ノードがraspberrypi
で、ワーカーノードがクラスターに参加できない
解決: 各ノードに個別のホスト名を設定
問題: /boot/cmdline.txt
に改行が入っていて設定が無効
解決: 1行で記述、改行なしで設定
問題: NodePortが機能せず、LoadBalancerがPending状態
解決: systemdサービスでポートフォワードを常時実行
問題: ホスト名変更後、古いノードエントリが残ってNotReady状態
解決: kubectl delete node raspberrypi
で古いノードを削除
# クラスター状態確認
kubectl get nodes
kubectl get pods --all-namespaces
# Dashboardトークン取得
kubectl -n kubernetes-dashboard create token admin-user
# サービス再起動
sudo systemctl restart k3s
sudo systemctl restart k8s-dashboard-forward
# SSHトンネル経由でアクセス
ssh -L 8443:localhost:8443 yamakenmain@192.168.1.85
今回のクラスター構築を踏まえて、以下の拡張を計画しています: