Raspberry pi 4 にk3sをデプロイしnginxをデプロイする

初めての投稿となります。優しく見守っていただけると幸いです。

#### 1.今回の内容
初心者向けの内容です。Raspberry pi 4 model Bにk3sをデプロイし、nginxをデプロイ、Serviceで外部ノードに公開をします。
k3sについては[こちら](https://k3s.io/)。
要するに、IoTやエッジ向けの小さなk8sですね。
エッジ環境向けなので、クラウド上で必要となるような機能などを削いだことによって軽量化されています。
元々はRancher Labsが開発したのもですが、Rancher Labsが2020年にSUSEに買収されたみたいです。
どうせならOSはopenSUSEにすればよかったかも。
SUSEについては[こちら](https://www.suse.com/ja-jp/)

**環境**
HW: Raspberry Pi 4+ model B 8gb mem
OS: Ubuntu22.04.5
k3s version: v1.24.6+k3s1

#### 2.k3sインストールの準備
Raspberry piにk3sをインストールするためには、まず準備が必要です。
   `/boot/cmdline.txt`の編集をしなければなりません。ただ、今回はUbuntuをインストールしている関係か、`/boot/firmware`配下にファイルがあります。`/boot/firmware/cmdline.txt`の末尾に改行せずに、`cgroup_memory=1 cgroup_enable=memory`と記述する必要があります。


編集した後のファイルがこれです。
```
cat /boot/firmware/cmdline.txt 
elevator=deadline net.ifnames=0 console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash cgroup_memory=1 cgroup_enable=memory
```

ファイルを編集した後は一度リブートしてください。

リブートが完了したら、準備は完了です。

#### 3.k3sインストール
k3sをインストールしますが、今回はシングルノードなので単純。
```
curl -sfL https://get.k3s.io | sh - 
```
これだけです。

以下のようなログが出ます。
```
[INFO]  Finding release for channel stable
[INFO]  Using v1.24.6+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.24.6+k3s1/sha256sum-arm64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.24.6+k3s1/k3s-arm64
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s
```

k8sは本来kubectlを入れないとCLIでの対話はできませんがk3sは一緒にバイナリでパッケージ化されており、別途インストールする必要がありません。
ただ、権限は面倒なので変更しておきます。
```
sudo chmod 644 /etc/rancher/k3s/k3s.yaml
```
`k3s.yaml`にはこのクラスタの情報が書き込まれており、手元のPCからkubectlを叩きたい場合は、このファイルを入れて設定してあげるだけで大丈夫です。

接続できるか確認してあげます。
```
kubectl get nodes
```
ReadyになっておけばOK.

#### 4.nginxデプロイ
nginxをデプロイします。
以下のようなファイルです。
```ctr:nginx-pod.yml
apiVersion: v1
kind: Deployment
metadata:
  name: nginx-demo
  labels:
    component: nginx
spec: 
  replicas: 3
  selector:
    matchLabels:
      component: nginx
  template:
    metadata:
      labels:
       component: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
```

このファイルを適用します。
```
kubectl apply -f nginx-pod.yml
```

ポッドの状況を確認します。
```
kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
nginx-demo-68fb94b6d9-46vpk   1/1     Running   0          86s
nginx-demo-68fb94b6d9-c94j7   1/1     Running   0          86s
nginx-demo-68fb94b6d9-2m7cg   1/1     Running   0          86s
```

上がっていればOKなので、続いてServiceクラスタ外部から接続できるようにします。
```ctr:nginx-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    component: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30000
  type: NodePort
```

これを適用します。
```
kubectl apply -f nginx-service.yml
```

外部から接続します。
`https://<Raspberry piのIPアドレス>:30000`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332364/771165b9-9e30-5ce7-76ee-9d227523bd93.png)

問題なく接続できました。

#### 5.ローリングアップデートを試す。
ここで終わるのも味気ないのでローリングアップデートを試してみます。といってもこれもすぐに終わりますが。
nginxのバージョンを変更します。

```ctl:nginx-pod.yml
apiVersion: v1
kind: Deployment
metadata:
  name: nginx-demo
  labels:
    component: nginx
spec: 
  replicas: 3
  selector:
    matchLabels:
      component: nginx
  template:
    metadata:
      labels:
       component: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.23 ##ここを変更
```

`1.23`に変更します。では、適用し、状況をみていきます。
```
kubectl apply -f nginx-pod.yml
```

直後はこんな感じ。Podが入れ替わろうとしてますね。

```
sudo kubectl get pods
NAME                          READY   STATUS              RESTARTS   AGE
nginx-demo-68fb94b6d9-46vpk   1/1     Running             0          10m
nginx-demo-68fb94b6d9-2m7cg   1/1     Running             0          10m
nginx-demo-65bf5bd8c8-hpq4g   1/1     Running             0          17s
nginx-demo-68fb94b6d9-c94j7   1/1     Terminating         0          10m
nginx-demo-65bf5bd8c8-q5mdt   0/1     ContainerCreating   0          4s
```

その後完全に入れ替わりました。
```
sudo kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
nginx-demo-65bf5bd8c8-hpq4g   1/1     Running   0          28s
nginx-demo-65bf5bd8c8-q5mdt   1/1     Running   0          15s
nginx-demo-65bf5bd8c8-cx752   1/1     Running   0          11s
```

Deploymentを利用しているのでローリングアップデートが行われて、入れ替え中もnginxのページは繋がったままでした。

k3sだと少ないリソースのマシンでも十分使えますし、個人でk8sを利用したい場合にも便利ですね。


#### 参考

https://k3s.io/

あとはサイボウズさんの新人研修の内容を参考にしました。
というか、ほぼ丸パクリに近いですね。手順やリソース名は異なりますが。
k3sでなにかデプロイするか、といっても手頃なアプリケーションがあればと思ってたら面白い記事を見つけたのでラズパイ上に展開してみました。
サイボウズさんの研修内容は[こちら](https://blog.cybozu.io/entry/2022/09/07/135414)
直接参考にしたのはこちらです。
https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html