首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes + Django / PostgreSQL -当我将PostgreSQL数据库部署到Kubernetes集群时如何指定主机

Kubernetes + Django / PostgreSQL -当我将PostgreSQL数据库部署到Kubernetes集群时如何指定主机
EN

Stack Overflow用户
提问于 2018-05-24 17:58:29
回答 2查看 2.6K关注 0票数 1

我在配置我的Dockerized + PostgreSQL DB应用程序以在Kubernetes集群上工作时遇到了很多问题,这是我使用Google平台创建的。

当我从Docker部署PostgreSQL映像和将Django应用程序映像部署到Kubernetes集群时,如何从settings.py文件中指定PostgreSQL?

下面是我想让我的应用程序工作的方式。当我在本地运行应用程序时,我希望使用SQLITE,为了做到这一点,我在我的settings.py文件中做了以下更改:

代码语言:javascript
复制
if(os.getenv('DB')==None):
    print('Development - Using "SQLITE3" Database')
    DATABASES = {
        'default':{
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR,'db.sqlite3'),
        }
    }
else:
    print('Production - Using "POSTGRESQL" Database')
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'agent_technologies_db',
            'USER': 'stefan_radonjic',
            'PASSWORD': 'cepajecar995',
            'HOST': ,  #???
            'PORT': ,  #???
            }
    }

主要思想是,当我将应用程序部署到Kubernetes集群中的Kubernetes Pod对象中时,将运行一个Docker容器(我的Dockerized应用程序)。在创建容器时,我还创建了环境变量DB,并将其设置为True。因此,在部署应用程序时,我使用PostgreSQL数据库。

备注:如果有其他人建议我应该如何将本地与产品开发分开,请留下评论。

下面是我的Dockerfile的样子:

代码语言:javascript
复制
FROM python:3.6

ENV PYTHONUNBUFFERED 1
RUN mkdir /agent-technologies
WORKDIR /agent-technologies
COPY . /agent-technologies 
RUN pip install -r requirements.txt

EXPOSE 8000

下面是我的坞-撰写文件的样子:

代码语言:javascript
复制
version: '3'
services:
  web:
    build: .
    command: python src/manage.py runserver --settings=agents.config.settings
    volumes: 
      - .:/agent-technologies
    ports: 
      - "8000:8000"
    environment:
      - DB=true

在本地运行应用程序时,它运行得非常好。但是当我试图将它部署到Kubernetes集群时,运行我的应用程序容器的Pod对象在无限循环中崩溃,因为我不知道如何在生产环境中运行应用程序时指定DATABASES.default.HOST。当然,在docker文件(command: python src/manage.py runserver --settings=agents.config.settings)中指定的命令可能会产生异常,并使Pods在无限循环中崩溃。

注意:我已经为Kubernetes创建了所有必要的配置文件(部署定义/服务/秘密/卷文件)。这是我的github链接:https://github.com/StefanCepa/agent-technologies-bachelor

任何帮助都将不胜感激!提前谢谢大家!

EN

回答 2

Stack Overflow用户

发布于 2018-05-24 18:25:36

您必须为postgres吊舱创建一个服务 (集群ip),以使其“可访问”。当您创建一个服务时,您可以通过访问通过<service name>.default:<port>来实现它。然而,将postgres (或任何db)作为一个简单的pod运行是危险的(一旦您或k8s重新创建或者扩展它,您就会丢失数据)。您可以使用服务或使用statefulSets正确地安装它。

一旦你有了地址,你就可以把它放在env变量中,并从你的settings.py中访问它。

编辑:将其放在部署yaml (示例)中:

代码语言:javascript
复制
env:
- name: POSTGRES_HOST
  value: "postgres-service.default"
- name: POSTGRES_PORT
  value: "5432"
- name: DB
  value: "DB"

在你的settings.py里

代码语言:javascript
复制
'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': os.getenv('POSTGRES_HOST'),
'PORT': os.getenv('POSTGRES_PORT'),
票数 4
EN

Stack Overflow用户

发布于 2018-05-26 07:01:54

以下是我的调查结果:

  1. postgres实例取决于持久性卷。我看到了持久容量声明的代码,而不是持久卷本身。所以我必须先创造这个。
代码语言:javascript
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  labels:
    type: local
  name: task-pv-volume
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 1Gi
  hostPath:
    path: /tmp/data
  persistentVolumeReclaimPolicy: Retain
  1. agent-technologies-bachelor/agents/config/kubernetes/postgres/secrets-definition.yml术语密码中有一种类型。
代码语言:javascript
复制
data:
  user: c3RlZmFuX3JhZG9uamlj #stefan_radonjic
  passowrd: sdfsdfsd #cepajecar995

因此postgres实例无法启动。我是通过运行命令kubectl来观察事件发现的。

  1. Docker映像中没有执行应用程序的命令。因此,如果我在cepa995 995/agent_web上运行您的docker映像,它就会退出而不运行任何应用程序。这就是为什么django应用程序没有运行的原因。为了解决这个问题,我修改了Dockerfile,以便在最后添加一个CMD指令。我看到您将这个放到Dockerfile中来构建映像,但是这个命令必须位于Dockerfile本身中。Dockerfile现在看起来是这样的:
代码语言:javascript
复制
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /agent-technologies
WORKDIR /agent-technologies
COPY . /agent-technologies
RUN pip install -r src/requirements.txt
EXPOSE 8000
CMD python src/manage.py runserver 0.0.0.0:8000 --settings=agents.config.settings
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50515478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档