我在使用Google Cloud Platform创建的Kubernetes Cluster上配置My Dockerized Django + PostgreSQL数据库应用程序时遇到了很多问题。
当我将Docker Hub的PostgreSQL映像和我的Django Web应用程序的映像部署到Kubernetes集群时,如何从settings.py文件中指定DATABASES.default.HOST?
以下是我希望我的应用运行的方式。当我在本地运行应用程序时,我想使用SQLITE DB,为了做到这一点,我在settings.py文件中进行了以下更改:
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 Cluster,在Kubernetes Pod对象内部时,将运行Docker容器(我的Dockerized Django应用程序)。在创建容器时,我还创建了环境变量DB
并将其设置为True。因此,当我部署应用程序时,我使用PostgreSQL数据库。
注意:如果有人有任何其他建议我应该如何区分本地和生产开发,请发表评论。
以下是我的Dockerfile的样子:
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
以下是我的docker-compose文件的样子:
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-compose文件(command: python src/manage.py runserver --settings=agents.config.settings
)中指定的命令可能会产生异常并使Pods无限循环崩溃。
注意:我已经为Kubernetes(部署定义/服务/机密/卷文件)创建了所有必需的配置文件。这是我的github链接:https://github.com/StefanCepa/agent-technologies-bachelor
任何帮助将不胜感激!提前谢谢大家!
答案 0 :(得分:2)
您必须为postgres pod创建一个service(群集IP)才能使其“可访问”。创建服务时,您可以<service name>.default:<port>
access创建服务。但是,将postgres(或任何数据库)作为一个简单的pod运行是危险的(只要你或k8重新创建pod或将其扩展,你就会丢失数据)。您可以使用service或使用statefulSets正确安装。
获得地址后,您可以将其放入env variable并通过settings.py
访问该地址修改强>: 将其放入您的部署yaml(example):
env:
- name: POSTGRES_HOST
value: "postgres-service.default"
- name: POSTGRES_PORT
value: "5432"
- name: DB
value: "DB"
在你的settings.py
中'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': os.getenv('POSTGRES_HOST'),
'PORT': os.getenv('POSTGRES_PORT'),
答案 1 :(得分:1)
以下是我的发现:
apiVersion: v1
kind: PersistentVolume
metadata:
labels:
type: local
name: task-pv-volume
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
hostPath:
path: /tmp/data
persistentVolumeReclaimPolicy: Retain
data:
user: c3RlZmFuX3JhZG9uamlj #stefan_radonjic
passowrd: sdfsdfsd #cepajecar995
因此,postgres实例无法启动。我通过运行命令kubectl describe pods
来查看事件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