忍者ブログ

設備のマニアどっとこむ

IoT開発、設備・DIYのブログ!

ラズパイで書いたpythonコードをkubernetesで冗長化した話。

ラズパイで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は便利かもしれません。
ちょっと設定が面倒ですが…。






拍手[0回]

PR

コメント

翻訳(Translate)

プロフィール

HN:
佐々木 雅史
性別:
男性
自己紹介:
2021年 ラズパイ、M5stackを用いたIoT開発を専門で受注するアルティメンテを設立。代表を務める。
・2020年ラズパイコンテスト優良賞受賞
・設備系資格多数(電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトなど)

AD

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30