我創建了一個用 Python 撰寫的簡單程式,它與 redis 資料庫互動,獲取存盤在我的資料庫中的元素串列并對它們進行排序。
蟒蛇代碼:
import redis
import numpy as np
r = redis.Redis(host='redis-master', port=6379, db=9, socket_connect_timeout=2, socket_timeout=2)
array = np.array([]);
vector = np.vectorize(int);
while(r.llen('Numbers')!=0):
array = vector(np.append(array, r.lpop('Numbers').decode('utf8')))
sorted_array = np.sort(array);
print("The sorted array : ");
print(sorted_array);
我使用以下 Docker 檔案創建了一個影像:
FROM python:3
WORKDIR /sorting
COPY sorting.py ./
RUN apt-get update
RUN pip3 install numpy
RUN pip3 install redis
CMD python3 sorting.py
同樣對于 redis 部署和服務,我有以下 yaml 檔案:
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-master
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
role: master
tier: backend
replicas: 1
template:
metadata:
labels:
app: redis
role: master
tier: backend
spec:
containers:
- name: master
image: redis
ports:
- name: "redis-server"
containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
app: redis
role: master
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: master
tier: backend
對于python程式部署和服務,我有以下內容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sortingapp
labels:
app: sortingapp
spec:
selector:
matchLabels:
app: sortingapp
replicas: 1
template:
metadata:
labels:
app: sortingapp
spec:
containers:
- name: sortingapp
image: sorting-app:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: sorting-app
spec:
type: NodePort
ports:
- name: http
port: 9090
targetPort: 8080
selector:
app: go-redis-app
我的 redis pod 似乎作業正常,但是當我嘗試運行我的排序應用程式時,它會創建 pod,但狀態是 CrashLoopBackOff。我試圖顯示日志,它顯示了我的 python 程式的列印
The sorted array :
[]
因此,據我了解,app pod 和 redis pod 之間的連接有問題。關于 wjat 我做錯了有什么建議嗎?
uj5u.com熱心網友回復:
你這樣做是正確的,我在本地測驗了你的代碼,當你將錯誤的資料庫主機名傳遞給你的 python 腳本時,它會失敗,所以既然你有輸出The sorted array : []
這意味著與資料庫的連接已經正確建立。
但是,你要知道,通過在 kubernetes(或 docker)中部署這種單執行腳本,容器會一次又一次地重啟,因為它只運行一次就停止。
因此,如果您不希望出現此錯誤,只需使您的腳本成為一個持續運行的應用程式或使用 kubernetes 作業,例如,如果您想在需要時手動運行它。
另一件事:由于 redis 是一個有狀態的應用程式,請考慮StatefulSet
在 kubernetes 中使用物件而不是Deployment
. 但是由于它與問題無關,因此您可以隨時進行。
一點建議:你應該host
在環境變數中的python代碼中傳遞你的redis資料庫的配置,如果有一天你需要在其他地方執行容器,你只需要修改環境變數而不是重建你的docker鏡像會更好。
未來的一個大問題:看看你的 python kubernetes 服務,它包含選擇器:app: go-redis-app
而不是app: sorting-app
基本上是python pb,不是kubernetes資料庫連接問題,干得好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480760.html
標籤:Python Kubernetes 雷迪斯