今日は誰に役立つかわからないネタです。
Pi-Stopを複数借りることができたので、OSCのラズパイクラスターのデモ用にKubernetes上のPodでアプリを動かすとLEDがピカピカいうのを試してみたいなと思い、試してみることにしました。
用意するもの
- microSD
- Raspberry Pi 3以降
- Raspbian buster Lite
- Pi-Stop
手順
- microSDにRaspbian Lite busterを書き込みます。
- Pi-Stopを差し込みます(今回はGnd:6、Green:8、Amber:10、Red:12)。
- 電源を入れて、Raspbianを起動します。
- こんなファイルを作って、Pythonスクリプトファイルとして保存します(
pika2.py
)。
from gpiozero import LED from time import sleep green = LED(14) yellow = LED(15) red = LED(18) for t in range(0,5): green.on() sleep(5) green.off() yellow.on() sleep(2) yellow.off() red.on() sleep(5) red.off()
これはPython3でもPython2でも動作します。Pythonモジュールとしてpython-gpiozero
(Python3の場合はpython3-gpiozero
)をインストールします。
今回はgpiozeroを使いました。
- 次のように実行すると、LEDをピカピカできます。ちなみにGPIOを叩くにはroot権限が必要なので、
sudo -i
とかでroot権限に切り替えてから実行してください。
# python pika2.py
では、これをDockerのコンテナーやKubernetes Pod上でピカピカさせてみましょう(誰得)。
Dockerコンテナーでピカピカさせる
- Raspbian busterには
docker.io
というパッケージが用意されており、比較的新しいバージョンのDocker CEをaptコマンドでインストールできます。
% sudo apt update && sudo apt install docker.io -y
- Raspbianはarmhfアーキテクチャーです。ARMのイメージが必要なので、今回は
raspbian/stretch
を使います。
% sudo docker image pull raspbian/stretch
- コンテナーを作成します。
--privileged=true
か、--device /dev/gpiomem
を設定するのを忘れないでください。-v
オプションでpika2.pyを保存したディレクトリーを指定しています。
-v /home/pi/test:/root
はホストの/home/pi/test
パスをコンテナーの/root
にマウントするように指定しています。-w
オプションはworkdirを指定しています。これは多くのDockerイメージは/
が初期のパスとしてログインされるためです。cd /root
と手動で移動する必要がなくなります。
% sudo docker container run --name=cont1 --device /dev/gpiomem -v /home/pi/test:/root -w /root -it raspbian/stretch bash
- コンテナーでPythonの
gpiozero
モジュールをインストールして、スクリプトを実行します。ピカピカします。
# apt update && apt install python-gpiozero -y # python pika2.py
Kubernetesでピカピカさせる
Raspberry PiにKubernetesを構築するのはかなり大変です。私が持っているのはRaspberry Pi 3なので、CPUコアは4コアあっていいのですが、メモリーは1GBしかないためです。国内でもRaspberry Pi 4が使えるようになれば、ここら辺は軽減できるかもしれませんね。
というわけで、今回はk3sを使ってKubernetesを動かします。
- 先ずはk3sでKubernetesを動かします。
# curl -sfL https://get.k3s.io | sh -
- 動作完了までは少々時間がかかるので、待っている間にこんなYAMLを書きます。
apiVersion: v1 kind: Pod metadata: name: ledpika spec: containers: - name: ledpika image: raspbian/stretch volumeMounts: - mountPath: /root name: my-volume securityContext: privileged: true volumes: - name: my-volume hostPath: path: /home/pi/test
Podを作成してシェルに入ります。
# kubectl create -f testpod.yml # kubectl exec -it ledpika bash
Pod内で実行します。ピカピカします。
# apt update && apt install python-gpiozero -y && python pika2.py
Kubernetes Podでもピカピカが成功しました。 というわけで、「コンテナーでLチカしてみる」でした。
イメージを作りました
KubernetesのYAMLをいっぱい書くのすら面倒になったので、RaspbianとPythonのコードを仕込んだイメージを作ってみました(本当は社内で「Dockerイメージでも作ったら?」と言われたのが理由です)。
これを使ってDockerコンテナーで利用するには、次のコマンドを実行してください。ピカピカします。
# docker run --device /dev/gpiomem -it ytooyama/rpi-pika2:latest
これを使ってKubernetes Podを作るには、次のYAMLを書いてkubectl create -f
してください。
apiVersion: v1 kind: Pod metadata: name: ledpika spec: containers: - name: ledpika image: ytooyama/rpi-pika2:latest securityContext: privileged: true
Podを作ります。
# kubectl create -f pika2.yml
そうすると、ピカピカを5回繰り返してクラッシュし、再起動され...を繰り返します。 しばらくピカピカします(Podをdeleteして終了してください)。
NAME READY STATUS RESTARTS AGE ledpika 0/1 CrashLoopBackOff 3 6m13s ledpika 1/1 Running 4 6m23s ledpika 0/1 Completed 4 7m25s ledpika 0/1 CrashLoopBackOff 4 7m39s
10/24 追記
Workerを増やした場合はDeployment APIを使ったほうがいいと思いますので、サンプルのYAMLを貼り付けておきます。
このようなファイルを作り、kubectl apply -f
でPodを作ってください。
YAMLファイルのreplicas: 1
のところを増やして、kubectl apply -f...
を実行するか、起動後にkubectl scale deployment ledpika --replicas=x
(xにレプリカ数を入力)を実行するとスケールします。
apiVersion: apps/v1 kind: Deployment metadata: name: ledpika spec: replicas: 1 selector: matchLabels: app: ledpika template: metadata: labels: app: ledpika spec: containers: - name: ledpika image: ytooyama/rpi-pika2:latest securityContext: privileged: true