无法让 Django 在 k8s 中与 Postgres 对话

Posted

技术标签:

【中文标题】无法让 Django 在 k8s 中与 Postgres 对话【英文标题】:Couldn't Make Django Talk with Postgres in k8s 【发布时间】:2021-10-26 00:22:45 【问题描述】:

我在 minikube 中部署了一个简单的 Django 应用程序。它有两个容器,一个用于 Django 应用程序,一个用于 postgres db。它正在使用 docker-compose,但无法使其在 minikube k8s 集群中运行。当我打开一个终端到容器并 ping 服务时,它没有成功。我没有找到导致此通信错误的原因。

这是一个基本的应用程序,只有一个用于登录或注册的登录页面。登录后,您可以创建一些笔记。在我部署到 minikube 后,我能够访问 127.0.0.1:8000,但是当我输入信息进行注册时,它给出了以下错误。显然,它无法将数据存储在数据库中。

django项目settings.py中的DATABASES部分:

DATABASES = 
'default': 
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'postgres',
    'USER': 'postgres',
    'PASSWORD': 'postgres',
    'HOST': 'db',
    'PORT': '5432',


用于为应用构建镜像的 Dockerfile:

FROM python:2.7

WORKDIR /notejam

COPY ./ ./

RUN pip install -r requirements.txt

EXPOSE 8000

CMD python manage.py runserver 0.0.0.0:8000

部署文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: notejam-deployment
  labels: 
    app: notejam-app
spec:
  selector:
    matchLabels:
      app: notejam-app
  template:
    metadata:
      labels:
        app: notejam-app
    spec:
      volumes:
        - name: postgres-pvc
          persistentVolumeClaim:
            claimName: postgres-pvc
      containers:
      - name: notejam
        image: notejam_k8s
        imagePullPolicy: Never
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8000
      - name: postgres-db
        image: postgres
        imagePullPolicy: Never
        ports:
        - containerPort: 5432
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        env:
        - name: POSTGRES_USERNAME
          valueFrom:
            configMapKeyRef:
              name: postgres-configmap
              key: postgres-username
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: postgres-password
        - name: POSTGRES_DB
          valueFrom:
            configMapKeyRef:
              name: postgres-configmap
              key: postgres-db
        volumeMounts:
          - mountPath: /notejam-db
            name: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: db
spec:
  selector:
    app: notejam-app
  ports:
  - port: 5432
    targetPort: 5432
---
apiVersion: v1
kind: Service
metadata:
  name: notejam-external-service
spec:
  selector:
    app: notejam-app
  type: LoadBalancer
  ports:
  - protocol: TCP 
    port: 8000
    targetPort: 8000

错误:

OperationalError at /signup/

could not connect to server: Connection timed out
    Is the server running on host "db" (10.96.150.207) and accepting
    TCP/IP connections on port 5432?

Request Method:     POST
Request URL:    http://127.0.0.1:8000/signup/
Django Version:     1.6.5
Exception Type:     OperationalError
Exception Value:    

could not connect to server: Connection timed out
    Is the server running on host "db" (10.96.150.207) and accepting
    TCP/IP connections on port 5432?

Exception Location:     /usr/local/lib/python2.7/site-packages/psycopg2/__init__.py in connect, line 127
Python Executable:  /usr/local/bin/python
Python Version:     2.7.18
Python Path:    

['/notejam',
'/usr/local/lib/python27.zip',
'/usr/local/lib/python2.7',
'/usr/local/lib/python2.7/plat-linux2',
'/usr/local/lib/python2.7/lib-tk',
'/usr/local/lib/python2.7/lib-old',
'/usr/local/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/site-packages']

Server time:    Thu, 26 Aug 2021 00:40:58 +0300

【问题讨论】:

你试过这个吗? 'ENGINE': 'django.db.backends.postgresql'source 我更改了 settings.py 然后重建了图像并重新部署了应用程序,但没有运气。它没有用。 您可以在您的问题中添加错误吗?至少其他看到这个问题的人可以更好地帮助你。 是的,当然。 【参考方案1】:

您正尝试在同一个 pod 中将 postgres 作为辅助容器运行。它应该是它自己的部署和服务。多容器 pod 不像 docker compose :)

【讨论】:

所以你的意思是我应该为 postgresql 创建另一个部署 yaml?不过我没明白目的。 @coderanger 感谢您的回答。有效。然后我们应该定义另一个部署,以使它们在不同的 pod 中运行,因为服务提供了 pod 之间的通信。

以上是关于无法让 Django 在 k8s 中与 Postgres 对话的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django API GET 请求中与 websocket 通信?

在自定义命令中与 Django 通道进行数据绑定

Pprint 模块在 32 位系统中与 Django 一起工作缓慢

在 django 中与应用程序服务器/网络服务器进行通信的最佳方式是啥[关闭]

django+uwsgi+docker+k8s

在片段中与 onItemClick 斗争