Raspberry PiにKubernetes環境を構築する

何番煎じかわかりませんが、Raspberry PiにKubernetes環境を構築したので、記録を残します。
複数台でクラスターを組むこともなく、1台構成です。

# 環境

Raspberry Pi 4 (8GBメモリ)
Raspberry Pi OS 64bit
https://www.raspberrypi.org/forums/viewtopic.php?f=117&t=275370

# 手順

## Swapの無効化

```console
sudo apt-get purge -y --auto-remove dphys-swapfile
sudo rm -fr /var/swap
```

## cgroupの有効化

/boot/cmdline.txtの末尾に`cgroup_enable=memory cgroup_memory=1`を追加。（改行はせず、1行目の末尾に追加）

```text:/boot/cmdline.txt 
console=serial0,115200 console=tty1 root=PARTUUID=8226b72e-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1
```

設定後、再起動しましょう

## Dockerのインストール

https://docs.docker.com/engine/install/debian/

```console
sudo apt remove docker docker-engine docker.io containerd runc
sudo apt install apt-transport-https ca-certificates curl gnupg-agent  software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
```

## kubectlのインストール

https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

Minikubeに`kubectl`コマンドが内蔵されているようでしたが、別でインストールしたほうが使いやすい気がしましたのでインストールしました。
`kubeadm`と`kubelet`はminikubeがインストールしているような気がしましたので、インストールしません。

```console
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubectl
```

## Minikubeのインストール

https://kubernetes.io/ja/docs/tasks/tools/install-minikube/

Raspberry PiはARM64アーキテクチャのため、ダウンロードする実行ファイルは`minikube-linux-amd64`ではなく`minikube-linux-arm64`です。

```console
sudo apt install conntrack -y

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/
```

## kubernetesクラスタの作成

vm-driverは`none`とします

```
sudo minikube start --vm-driver=none
```

## aliasと入力補完の設定

`minikube`も`kubectl`も毎回`sudo`が必要で、毎回入力するのは面倒なのでaliasを作成します。
また、入力補完のcompletionも設定します。

```bash:~/.bashrc
alias minikube='sudo minikube'
source <(minikube completion bash)
alias kubectl='sudo kubectl'
source <(kubectl completion bash)
```

# 動作確認

動作確認としてNginxコンテナを起動してみます。

```yaml:nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  type: NodePort
  selector:
    app: nginx-app
  ports:
  - protocol: "TCP"
    port: 80
    nodePort: 30080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:latest
```

```console
kubectl apply -f nginx.yaml
```

Raspberry Piからは`curl http://localhost:30080`で応答がありますし、外部のPCからは`http://raspberrypi.local:30080/`で応答が受け取れました。

# 感想

* ARM64対応のイメージが有るものと無いものがあるので注意
* `kubeadm`での構築を試みたのですが、なぜかPOD間通信ができなかったので、Minikubeにしました
* さてどう活用しようかな