如何将运行 python 程序的 pod 与另一个运行数据库的 pod 连接
How can I connect a pod which runs a python program with another pod which runs a database
我创建了一个用 Python 编写的简单程序,它与 redis 数据库交互,获取存储在我的数据库中的元素列表并对它们进行排序。
PYTHON 代码:
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 之间的连接有问题。
关于我做错了什么有什么建议吗?
你做得对,我在本地测试了你的代码,当你将错误的数据库主机名传递给你的 python 脚本时,它失败了,所以你有输出 The sorted array : []
这意味着与数据库的连接已正确建立。
但是,你要知道,在Kubernetes(或docker)中部署这种one-executing脚本,容器将一次又一次地重启,因为它只有运行s一次然后停止。
因此,如果您不希望出现此错误,只需将您的脚本设为 运行 连续运行的应用程序或使用 kubernetes 作业,例如,如果您想要 运行 它需要时手动。
另一件事:由于 redis 是有状态的应用程序,请考虑在 Kubernetes 中使用 StatefulSet
对象而不是 Deployment
。但由于与问题无关,所以你可以随时进行。
一点建议:你应该在环境变量的python代码中传递你的redis数据库的host
配置,如果有一天你需要在别处执行容器会更好你只需修改环境变量而不是重建你的 docker 图像。
未来的一个大问题:看看你的 Python Kubernetes 服务,它包含选择器:app: go-redis-app
而不是 app: sorting-app
基本上是python问题,不是Kubernetes数据库连接问题,干得好。
我创建了一个用 Python 编写的简单程序,它与 redis 数据库交互,获取存储在我的数据库中的元素列表并对它们进行排序。
PYTHON 代码:
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 之间的连接有问题。 关于我做错了什么有什么建议吗?
你做得对,我在本地测试了你的代码,当你将错误的数据库主机名传递给你的 python 脚本时,它失败了,所以你有输出 The sorted array : []
这意味着与数据库的连接已正确建立。
但是,你要知道,在Kubernetes(或docker)中部署这种one-executing脚本,容器将一次又一次地重启,因为它只有运行s一次然后停止。
因此,如果您不希望出现此错误,只需将您的脚本设为 运行 连续运行的应用程序或使用 kubernetes 作业,例如,如果您想要 运行 它需要时手动。
另一件事:由于 redis 是有状态的应用程序,请考虑在 Kubernetes 中使用 StatefulSet
对象而不是 Deployment
。但由于与问题无关,所以你可以随时进行。
一点建议:你应该在环境变量的python代码中传递你的redis数据库的host
配置,如果有一天你需要在别处执行容器会更好你只需修改环境变量而不是重建你的 docker 图像。
未来的一个大问题:看看你的 Python Kubernetes 服务,它包含选择器:app: go-redis-app
而不是 app: sorting-app
基本上是python问题,不是Kubernetes数据库连接问题,干得好。