今天我們要使用Cron job作排程,搭配幾天前用python實現的備份程式。
將應用打包成映像檔。因為在樹梅派上執行的緣故,我的映像檔選擇使用arm版本的python3,需要在樹梅派上打包與運行。接著將必要的檔案放入,
esp8266.py對應到的是在Day 24中的python檔、backup.py對應到Day 25用來備份資料庫的程式碼,dht11.py則是透過GPIO取得dht11感測器資料並直接寫入資料庫的程式。
FROM arm32v7/python:3.7.9
COPY requirements.txt /cmd/requirements.txt
COPY esp8266.py /cmd/esp8266.py
COPY backup.py /cmd/backup.py
COPY dht11.py /cmd/dht11.py
RUN pip3 install -r /cmd/requirements.txt
在一開始測試程式時,我使用virtulenv創建一個乾淨的開發環境,同時將使用到的安裝包匯出程一個檔案後,創建映像檔時便可以將它放入,安裝必要的python套件即可。
certifi==2020.6.20
chardet==3.0.4
dnspython==2.0.0
idna==2.10
influxdb==5.3.0
msgpack==0.6.1
paho-mqtt==1.5.0
python-dateutil==2.8.1
python-etcd==0.4.5
pytz==2020.1
requests==2.24.0
six==1.15.0
urllib3==1.25.10
Adafruit-DHT==1.4.0
build完映像檔後便可以接著下一步。
Cron job是Kubernetes用來作定期排程的資源類型。在這裡我們利用定期排程的特性讓它定時執行備份程式。底下是我的YAML:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: databackup-lightsensor-test
spec:
schedule: "0 */4 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: alan0415/handler-arm:v3
args:
- python3
- /cmd/backup.py
nodeSelector:
name: edge-1
restartPolicy: OnFailure
在YAML中有幾項欄位:
nodeSelector用來指定運行在哪個節點上、restartPolicy則是重新執行的政策,當它運行失敗時會自動重新執行。
# 查看排程
kubectl get cronjob
從Grafana的圖形中可以看到:
在邊緣端的感測器資料圖中,12.多以前的資料被截掉了(因為每4小時備份一次,所以會在每天的0、4、8、12、16、20點進行備份)
透過Grafana取得雲端的資料庫之後也可以看到,在邊緣端上面被截斷的資料有成功備份到雲端資料庫中。