初めての投稿となります。優しく見守っていただけると幸いです。
1.今回の内容
初心者向けの内容です。Raspberry pi 4 model Bにk3sをデプロイし、nginxをデプロイ、Serviceで外部ノードに公開をします。
k3sについてはこちら。
要するに、IoTやエッジ向けの小さなk8sですね。
エッジ環境向けなので、クラウド上で必要となるような機能などを削いだことによって軽量化されています。
元々はRancher Labsが開発したのもですが、Rancher Labsが2020年にSUSEに買収されたみたいです。
どうせならOSはopenSUSEにすればよかったかも。
SUSEについてはこちら
環境
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をデプロイします。
以下のようなファイルです。
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クラスタ外部から接続できるようにします。
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
問題なく接続できました。
5.ローリングアップデートを試す。
ここで終わるのも味気ないのでローリングアップデートを試してみます。といってもこれもすぐに終わりますが。
nginxのバージョンを変更します。
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を利用したい場合にも便利ですね。
参考
あとはサイボウズさんの新人研修の内容を参考にしました。
というか、ほぼ丸パクリに近いですね。手順やリソース名は異なりますが。
k3sでなにかデプロイするか、といっても手頃なアプリケーションがあればと思ってたら面白い記事を見つけたのでラズパイ上に展開してみました。
サイボウズさんの研修内容はこちら
直接参考にしたのはこちらです。
https://cybozu.github.io/introduction-to-kubernetes/introduction-to-kubernetes.html