ラズパイでpythonプログラムを実行するとき、プログラムが止まってたり、ラズパイがストールしたりすること多いですよね。今回はkubernetesを使って冗長化してみました。
設定その他は
こちらを御覧ください。
①pythonコードとdocer fileの準備 ※ワーカーノードで作業します
まずはpythonコードを作り指定のフォルダに格納します。※home/pi/dなど
なんでもいいのですが、下記コードではtwitter のお天気botを作っています。
(apiキーなどは消しています。ファイル名はtwitter2.pyとしています)
import os
from twython import Twython
import time
import requests, json
a = 0
while a < 10:
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_KEY = ""
ACCESS_SECRET = ""
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
apiKey = ""
baseUrl = "http://api.openweathermap.org/data/2.5/weather?"
cityName = "kanagawa"
completeUrl = baseUrl + "appid=" + apiKey + "&q=" + cityName
response = requests.get(completeUrl)
cityData = response.json()
temp = cityData["main"]["temp"] - 273.15
temp2= round(temp,2)
api.update_status(status= '今の天気は'+ cityData["weather"][0]["description"] + '温度は'+ str(temp2) +'℃だよ')
time.sleep(3000)
このプログラムをコンテナ化しdocker image を作成するためにdocer fileを作ります。
ファイル名はDockerfileとしてください。
FROM python:3.5
RUN pip install twitter
RUN pip install twython
COPY twitter2.py home/pi/d/twitter2.py
CMD ["python3", "home/pi/d/twitter2.py"]
FROMで環境を指定。COPYでファイルをローカルからコンテナへコピー、
CMDでpythonを実行しています。
このファイルをディレクトリを作りpythonファイルと同じフォルダに入れます。
②docker imageの作成と確認
下記コマンドでdocker imageを作成します。Dockerfileとpythonコードが格納されているフォルダを指定します。
docker build -t twitter /home/pi/d/
※この場合コンテナ名はtwitterになります。
docker psコマンドで動作しているか確認します。下記のようであれば動作しています。
CONTAINER ID IMAGE COMMAND
cd12338b6d7b 7ae540f0d0f0 "python3 home/pi/d/t…"
COMMAND が"/pause"になっていれば動作していません。コンテナIDを指定してログを確認することができます。
docker logs cd12338b6d7b
エラーが出ていなければ何もでないはずです。
③kuberntesへデプロイ
マスターノードでマニュフェストを作ります。ワーカーノードで作成したdocker imageを
指定してください。 ※今回はtwitter.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: twitter
spec:
selector:
matchLabels:
role: app
replicas: 3
template:
metadata:
labels:
role: app
spec:
containers:
- name: twitter
image: twitter
imagePullPolicy: Never
ports:
このときimagePullPolicy: Neverを入れてください。これはローカルのdocker imageを読み込む設定となります。
あとはこのマニュフェストを指定してデプロイします。
kubectl apply -f twitter.yaml
うまくいけば kubectl get pod コマンドでpodが replicasで指定した数だけ作成されRunningとなればOKです。
NAME READY STATUS
twitter-6f697c9d74-4v5gt 1/1 Running
twitter-6f697c9d74-64q9j 1/1 Running
twitter-6f697c9d74-l7cw7 1/1 Running
これでpythonプログラムをラズパイ複数台で冗長化できました。一台ストールしてもプログラムは動き続けることができ、復帰も容易です。 1台での動作が不安であればkubernetesは便利かもしれません。
ちょっと設定が面倒ですが…。