Raspberry Pi にて Kubernetes クラスターを作成する
- zqz
- 9月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 ufwkubernetes のリポジトリ追加
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpgecho "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.listCRI-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.gpgecho "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.listcri-o , kubelet , kubeadm , kubectl のインストール
apt update
apt install -y cri-o kubelet kubeadm kubectlcrio の自動起動の登録と起動
systemctl stop crio.service
systemctl start crio.service
systemctl enable crio.serviceswap 禁止とポートフォワーディングの許可
swapoff -asysctl -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.shkubectl 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/flannelmetailb のインストール
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-systemipaddresspool.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:
- defaultkubectl 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: 80kubectl 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 6mweb ブラウザで web サーバーにアクセスする
同じネットワークにあるコンピューターで "EXTERNAL-IP" に項目の IP アドレスに web ブラウザでアクセスしてページが表示されれば成功します。
(Apache は http の Port 80 番で起動しています)

Raspberry Pi の写真



コメント