Source: Lukas Gentele
本教程旨在为希望使用Kubernetes构建和部署Django项目时探索Kubernetes并提高生产率的Django开发人员提供指南。本教程独立于任何云平台。无论是使用Minikube或Docker桌面创建的本地单节点集群,还是GKE,AKS或EKS中的完全托管集群,一切都可以与任何Kubernetes集群一起使用。
即使您还没有Kubernetes集群,也可以执行本教程。如果您已经有集群,那就更好了!让我们开始吧。
1.创建Django项目
如果您已经有一个Django项目,则可以跳过此步骤,但是请确保requirements.txt
在项目的根目录中有一个(运行pip freeze > requirements.txt
创建它)。
在创建新的Django项目之前,让我们使用我们希望Django项目位于的目录定义一个变量:
PROJECT_DIR=/c/Users/[username]/django # win (git-bash)
PROJECT_DIR=/home/[username]/django # mac, linux (bash)
如果您使用的是旧版Docker Toolbox(例如,因为使用的是Windows Home Edition),则$PROJECT_DIR
需要位于用户的主目录中,例如/c/Users/[username]
。
如果您在Windows上使用Docker桌面,请确保您拥有在Docker设置中将项目标记为Shared Drive的驱动器。
我们还应该为项目名称定义一个变量:
PROJECT_NAME=mysite
# warning: Django only allows characters a-z, no -, space or anything else
现在,我们使用Docker创建一个新的Django项目:
mkdir $PROJECT_DIR
docker run --rm -v /$PROJECT_DIR:/app -w //app python bash -c "pip install django && django-admin startproject $PROJECT_NAME && pip freeze > $PROJECT_NAME/requirements.txt"
cd $PROJECT_DIR/$PROJECT_NAME
现在将我们的Django项目容器化。
2.集装箱项目
当然,我们可以手动创建一个Dockerfile,Kubernetes清单或什至Helm图表,但这需要大量工作并且容易出错。因此,让我们使用DevSpace将Django项目自动化容器化。DevSpace是Kubernetes的云原生开发工具。它是开源的,您可以从GitHub安装它。
在计算机上安装DevSpace之后,可以使用以下命令对Django项目进行容器化:
devspace init
DevSpace将提出几个问题:
-
python
用作编程语言的项目 - 一个监听端口
8000
如果不确定Docker注册表或其他问题,只需选择DevSpace为您推荐的默认选项即可。
将项目容器化后,DevSpace将a添加Dockerfile
到项目中。将以下Dockerfile中的最后一行更改为:
CMD ["app.py"]
to:
CMD ["manage.py", "runserver"]
现在我们准备将Django项目部署到Kubernetes。
3.选择Kubernetes集群
如果您已经有一个Kubernetes集群,请使用以下命令告诉DevSpace将项目部署到哪个名称空间:
devspace use namespace [my-namespace]
如果尚不存在,DevSpace将在部署期间创建此名称空间。在部署项目之前,请确保您处于正确的kube上下文中。
没有Kubernetes集群吗?
如果没有Kubernetes集群,则可以使用由DevSpace赞助的免费Kubernetes命名空间。使用此命令创建一个:
devspace create space mysite
DevSpace将自动为您配置kube-context,以便您可以使用任何Kubernetes工具(例如kubectl,Kustomize,Skaffold或Helm)使用此名称空间。
4.Develop
在以生产方式部署项目之前,让我们首先开始开发模式:
devspace dev
该命令告诉DevSpace:
- 基于Dockerfile构建Docker映像
- 标记该映像并将其推送到Docker注册表(例如Docker Hub)
- 为我们的Django应用程序部署带有Kubernetes部署的Helm图表
- 启动端口转发以访问localhost上的应用程序(以及在浏览器中打开)
- 流式传输您的容器的日志
- 监视文件更改,如果有文件更改,则重新启动应用程序
您可以自定义DevSpace配置文件中会发生什么devspace.yaml
,这devspace init
将为项目创建。
之后devspace dev
成功部署,你应该看到的Django的命令行内日志输出,浏览器将打开与我们的Django的网站呈现出美丽的欢迎页面:
现在,该创建/pages
文件夹了。运行以下命令来创建它:
devspace enter python manage.py startapp pages
添加pages文件夹后,我们需要添加pages.apps.PagesConfig
到内的INSTALLED_APPS
数组$PROJECT_NAME/settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pages.apps.PagesConfig',
]
是时候添加Hello World页面了。
添加“ Hello World”视图
编辑文件$PROJECT_NAME/pages/views.py
,使其看起来像这样:
from django.http import HttpResponse
def homePageView(request):
return HttpResponse('Hello, World!')
现在,创建$PROJECT_NAME/pages/urls.py
具有以下内容的文件:
from django.urls import path
from .views import homePageView
urlpatterns = [
path('', homePageView, name='home')
]
添加“ Hello World”页面的最后一步是将代码更改为$PROJECT_NAME/urls.py
:
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
to:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')),
]
而已!现在,您可以重新加载浏览器,并且您会看到DevSpace实时更新了Django应用程序-无需部署项目,因为DevSpace使用热重载来更新正在运行的容器。
自己尝试:
- 更改您的Hello World!文件中的语句:
$PROJECT_NAME/pages/views.py
- 重新加载浏览器,看看更改如何立即生效。
奖励:添加PostgreSQL数据库
在添加Postgres数据库之前,请确保已终止devspace dev
,例如使用CTRL+C
。
首先,我们需要requirements.txt
使用以下命令将适用于Python的Postgres驱动程序添加至我们:
docker run --rm -v /$PROJECT_DIR:/app -w //app python bash -c "pip install psycopg2 && pip freeze | grep psycopg2 >> $PROJECT_NAME/requirements.txt"
现在我们需要告诉DevSpace我们也想部署PostgreSQL数据库。为此,我们需要将以下deployments
部分更改为devspace.yaml
:
deployments:
- name: mysite # this line may be different for you
helm:
componentChart: true
values:
containers:
# this line may be different for you
- image: dscr.io/${DEVSPACE_USERNAME}/mysite
service:
ports:
- port: 8000
to:
deployments:
- name: database
helm:
chart:
name: stable/postgresql
values:
postgresqlDatabase: "db_mysite"
postgresqlUsername: "db_user"
postgresqlPassword: ${DB_PASSWORD}
resources:
requests:
memory: 0
cpu: 0
- name: mysite # this line may be different for you
helm:
componentChart: true
values:
containers:
# this line may be different for you
- image: dscr.io/${DEVSPACE_USERNAME}/mysite
env:
- name: DB_HOST
value: "database-postgresql"
- name: DB_NAME
value: "db_mysite"
- name: DB_USER
value: "db_user"
- name: DB_PASSWORD
value: ${DB_PASSWORD}
service:
ports:
- port: 8000
如果我们再次部署项目,DevSpace现在将启动PostgreSQL数据库容器。但是,在执行此操作之前,我们需要配置Django项目以连接到数据库。
因此更改$PROJECT_NAME/settings.py
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
to:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': os.environ.get('DB_HOST'),
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
}
}
现在,让我们使用以下命令重新部署我们的Django项目:
devspace dev -b
devspace dev
进行此更改后,第一次运行时,DevSpace将要求您定义用于变量的数据库密码DB_PASSWORD
。
注意该-b
标志,它是的快捷方式--force-rebuild
。它告诉DevSpace我们不想使用热重载,而是要重建Docker映像并完全重新部署项目。当重要设置更改而无法使用热重载进行更新时,这通常非常有用settings.py
。
再次看到日志时,您可以中止操作devspace dev
,也可以打开其他终端并检查PostgreSQL数据库的日志以确保它准备就绪,然后再继续。您可以通过以下方式查看日志,以检查其是否已准备就绪:
devspace logs -f
将数据库连接添加到Django应用后,我们需要运行迁移。我们可以使用以下命令执行此操作:
devspace enter python manage.py migrate
DevSpace将询问您应在哪个容器中执行迁移。确保选择Django应用程序。
5.部署
如果完成构建应用程序并要发布它,则不应该通过devspace dev
进行开发,这是为了开发。对于类似生产的部署,可以使用以下命令:
devspace deploy
将Django成功部署到Kubernetes之后,您可以devspace dev
通过运行以下命令使该项目在公共URL上可用或通过localhost(使用类似于的端口转发)访问它:
devspace open
下一步是什么?
我希望本教程可以帮助很多人开始在Kubernetes上部署Django项目。很难在一个教程中涵盖所有细节,我想写这篇文章的后续文章。如果您有任何问题或想让我在下一篇文章中写的东西,请发表评论。
我目前的计划是写另一篇文章,内容涉及如何使用自动缩放,数据库高可用性和多阶段Docker构建来使基于Kubernetes的Django项目就绪。
翻译自:https://medium.com/better-programming/deploy-django-projects-to-kubernetes-d1c9584036a5