🐢

Raspberry Pi 4にminikubeをインストールする

2024/12/03に公開

kubernetesの勉強のためRaspberry Pi 4にminikubeをインストールしてnginxコンテナを動かしたので、記録のため記事を公開します。

環境

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

$ uname -r
6.6.62+rpt-rpi-v8

事前準備

Swapをオフ

# 変更前確認
$ cat /etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=62debe12-01  /boot           vfat    defaults          0       2
PARTUUID=62debe12-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

$ free
               total        used        free      shared  buff/cache   available
Mem:         7997480      744556     5694192      136644     1820292     7252924

# スワップファイルのサイズを0に設定
$ sudo vi /etc/dphys-swapfile

# スワップ領域を無効化
$ sudo swapoff -a
$ sudo shutdown -r now

# 確認
$ free
               total        used        free      shared  buff/cache   available
Mem:         7997332      540628     6820520        1880      748984     7456704
Swap:              0           0           0
dphys-swapfile
CONF_SWAPSIZE=0

インストール

dockerインストール

# インストール
$ sudo apt-get update
$ sudo apt-get install docker.io

# ユーザグループを作成
sudo usermod -aG docker $USER
cat /etc/group | grep docker

# dockorバージョンの確認
$ docker -v
Docker version 20.10.5+dfsg1, build 55c4c88

minikubeインストール

# インストールバイナリのダウンロード
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64
$ chmod +x minikube

# インストール
$ sudo mkdir -p /usr/local/bin/
$ sudo install minikube /usr/local/bin/

# minikubeスタートアップ
$ minikube start
- Raspbian 12.8 (arm64) で minikube v1.34.0
- docker ドライバーを使用してインストール
- root 権限で Docker ドライバーを使用
- "minikube" クラスターの "minikube" プライマリコントロールプレーンノードを開始
- ベースイメージ v0.0.45 をプル中...
- Kubernetes v1.31.0 をインストール中...
    > gcr.io/k8s-minikube/kicbase...:  441.45 MiB / 441.45 MiB  100.00% 6.25 Mi
    > preloaded-images-k8s-v18-v1...:  307.61 MiB / 307.61 MiB  100.00% 3.90 Mi
- Docker コンテナを作成中 (CPUs=2, Memory=2200MB) ...
- Docker 27.2.0 で Kubernetes v1.31.0 をインストール中...
    - ネットワーク設定中...
    - クラスターロールバインディングを設定中...
    - RBAC のロールバインディングを設定中...
- bridge CNI (コンテナネットワークインターフェース) を設定中...
- Kubernetes クラスターを起動中...
    - gcr.io/k8s-minikube/storage-provisioner:v5 をプル中...
- kubectl を使用可能に設定中... 'minikube kubectl -- get pods -A' を実行可能
- クラスターが起動しました。kubectl を使用して 'minikube kubectl -- get pods -A' を実行してください。

$ minikube version
minikube version: v1.34.0
commit: 210b148df93a80eb872ecbeb7e35281b3c582c61

kubectlインストール

# Kubernetesパッケージリポジトリの公開キーをダウンロードし、リポジトリを登録
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo 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.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update

# インストール
$ sudo apt-get install -y kubectl

動作確認

# nodeの確認
$ kubectl get nodes -o wide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
minikube   Ready    control-plane   27h   v1.31.0   192.168.49.2   <none>        Ubuntu 22.04.4 LTS   6.6.62+rpt-rpi-v8   docker://27.2.0

# ARMアーキテクチャのNginxをデプロイする
$ kubectl create deployment hello-minikube --image=arm64v8/nginx:latest
# podの確認
$ kubectl get pods -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
hello-minikube-b64567988-dwfkv   1/1     Running   0          24m   10.244.0.40   minikube   <none>           <none>

# Serviceの作成
$ kubectl expose deployment hello-minikube --type=NodePort --port=80 --target-port=80 --name=hello-minikube-service

# Serviceの確認
$ kubectl get services hello-minikube-service
NAME                     TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
hello-minikube-service   NodePort   10.98.153.131   <none>        80:30841/TCP   10s

# 接続テスト
$ curl http://192.168.49.2:30841/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Raspi側からcurlでnginxコンテナにアクセスできることが確認できました!

ネットワーク構成の整理

# Raspiに仮想NICが構成され、Node Networkと接続されている
$ ifconfig
br-73005f8879f7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.49.1  netmask 255.255.255.0  broadcast 192.168.49.255
        inet6 fe80::42:5bff:feb4:d744  prefixlen 64  scopeid 0x20<link>
        ether 02:42:5b:b4:d7:44  txqueuelen 0  (イーサネット)
        RX packets 1361  bytes 355527 (347.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1369  bytes 260261 (254.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
(以下、省略)

イメージ

ネットワークのイメージ

Ingress Controllerの有効化

L7でロードバランスさせたいときはIngressを利用しますが、minikubeではアドオンを利用します。

# アドオンの有効化
$ minikube addons enable ingress
ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    registry.k8s.io/ingress-nginx/controller:v1.11.2 をダウンロード中...
    registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3 をダウンロード中...
    registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3 をダウンロード中...
ingress アドオンを有効にしています...
'ingress' アドオンが有効になりました


# Ingress用のマニュフェストを作成し、apply
$ vi ./sample-ingress.yaml
$ kubectl apply -f sample-ingress.yaml

# Ingressの確認
$ kubectl get ingress
NAME             CLASS    HOSTS                ADDRESS        PORTS   AGE
sample-ingress   <none>   sample.example.com   192.168.49.2   80      42m
sample-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
    - host: sample.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: hello-minikube-service
                port:
                  number: 80
# Ingress経由でアクセスできることを確認
$ curl http://192.168.49.2 -H "Host: sample.example.com"
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

今後

raspiと同一ネットワークの端末からNGINXにアクセスできるように構成したいですね。

Discussion