🐢
Raspberry Pi 4にminikubeをインストールする
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