top of page

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 番で起動しています)

web ブラウザで web サーバーにアクセスするスクリーンショット
web ブラウザで web サーバーにアクセスするスクリーンショット

Raspberry Pi の写真

複数の Raspberry Pi を識別する為にテプラで IP アドレスを記載した様子の写真
複数の Raspberry Pi を識別する為にテプラで IP アドレスを記載した様子の写真

最新記事

すべて表示
ラズパイと4GPiの接続 -その2-

この間、SIMの認識までできたので、その続き。 まずはどのモデムに認識されているかを確認します。 Modem/0として認識されています。 $ sudo mmcli -L /org/freedesktop/ModemManager1/Modem/0 [QUALCOMM...

 
 
 

コメント


bottom of page