如何将运行 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数据库连接问题,干得好。