Raspberry Pi にて Kubernetes クラスターを作成する
- zqz
- 12 分前
- 読了時間: 4分
3台の Raspberry Pi を利用して Kubernetes クラスターを作成したので記事にします。
機材
Raspberry Pi 5 *3
SD カード 64GB(検証用なので 16GB あれば十分かと思われます)
USB-C 電源アダプタなどその他の周辺機器
利用したソフトウェア
Ubuntu Server(OS)
CRI-O(コンテナランタイム)
MetalLB (ロードバランサー)
Flannel(ネットワーク)
前提
3台の Raspberry Pi にはそれぞれ下記の IP アドレスとホスト名が登録されているものとします。
ネットワークカードの名称は全てのノードで "eth0" とします。
タイプ | 名称 | IP アドレス |
マスターノード | マスターノード | 192.168.210.2 |
ワーカーノード | ワーカーノード - 1 | 192.168.210.3 |
ワーカーノード | ワーカーノード - 2 | 192.168.210.4 |
クラスターの設定(共通)
作業先のマシーン
マスターノード
ワーカーノード - 1
ワーカーノード - 2
諸々のパッケージの追加
software-properties-common
curl
ufw
apt update
apt install -y software-properties-common curl ufw
kubernetes のリポジトリ追加
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
CRI-O のリポジトリ追加
curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.33/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v1.33/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
cri-o , kubelet , kubeadm , kubectl のインストール
apt update
apt install -y cri-o kubelet kubeadm kubectl
crio の自動起動の登録と起動
systemctl stop crio.service
systemctl start crio.service
systemctl enable crio.service
swap 禁止とポートフォワーディングの許可
swapoff -a
sysctl -w net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/host の競争防止
hosts ファイルの中身を下記のように変更します。
IP アドレスとホスト名についてはそれぞれ対応するもを登録します。
root@pi-01:~# cat /etc/hosts
192.168.210.2 pi-01
ファイアウォールの設定
SSH に接続する為 22 番を開放しノード同士が通信できる様に登録します。
systemctl stop ufw
systemctl start ufw
systemctl enable ufw
ufw reset
ufw allow 22
ufw allow from 192.168.210.2 to any
ufw allow from 192.168.210.3 to any
ufw allow from 192.168.210.4 to any
ufw reload
クラスターの設定
作業先のマシーン
マスターノード
設定の初期化
コマンド "kubeadm init" を実行すると "kubeadm join ~~" のメッセージが表示されるので保管します。
kubeadm init --control-plane-endpoint=k8s-master
設定ファイルの整備とパーミッションの設定
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
クラスターの設定(ワーカーノード)
作業先のマシーン
ワーカーノード - 1
ワーカーノード - 2
kubeadm join 192.168.210.2:6443 --token {token} --discovery-token-ca-cert-hash {hash}
ルーティング設定
作業先のマシーン
マスターノード
helm と flannel のインストールと初期設定
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
kubectl create ns kube-flannel
kubectl label --overwrite ns kube-flannel pod-security.kubernetes.io/enforce=privileged
helm repo add flannel https://flannel-io.github.io/flannel/
helm install flannel --set podCidr="10.244.0.0/16" --namespace kube-flannel flannel/flannel
metailb のインストール
kubectl delete validatingwebhookconfigurations metallb-webhook-configuration
helm repo add metallb https://metallb.github.io/metallb
kubectl create namespace metallb-system
helm install metallb metallb/metallb -n metallb-system
ipaddresspool.yaml の登録
ipaddresspool.yaml
root@pi-01:~# cat
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.210.10-192.168.210.200
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default
kubectl apply -f ipaddresspool.yaml
ステータスの確認
作業先のマシーン
マスターノード
下記のコマンドを実行しステータスが全てのノードで "Ready" である事を確認します。
root@pi-01:~# kubectl get node
NAME STATUS ROLES AGE VERSION
pi-01 Ready control-plane 21h v1.34.0
pi-02 Ready <none> 21h v1.34.0
pi-03 Ready <none> 21h v1.34.0
デプロイ
作業先のマシーン
マスターノード
今回は検証用に Apache のコンテナを作成したクラスターにデプロイします。
それぞれ下記の yaml ファイルとコマンドを実行してデプロイします。
apache.yaml の実行
apache.yaml
apiVersion: v1
kind: Service
metadata:
name: apache-service
labels:
run: apache
spec:
type: LoadBalancer
ports:
- port: 80
protocol: TCP
selector:
run: apache
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-deployment
spec:
selector:
matchLabels:
run: apache
replicas: 2
template:
metadata:
labels:
run: apache
spec:
containers:
- name: apache
image: httpd:latest
ports:
- containerPort: 80
kubectl apply -f apache.yaml
ステータスの確認
root@pi-01:~/apache# kubectl get -f apache.yaml
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/apache-service LoadBalancer 10.106.11.250 192.168.210.11 80:31583/TCP 6m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/apache-deployment 2/2 2 2 6m
web ブラウザで web サーバーにアクセスする
同じネットワークにあるコンピューターで "EXTERNAL-IP" に項目の IP アドレスに web ブラウザでアクセスしてページが表示されれば成功します。
(Apache は http の Port 80 番で起動しています)

Raspberry Pi の写真

コメント