将Django项目部署到Kubernetes


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:

  1. 基于Dockerfile构建Docker映像
  2. 标记该映像并将其推送到Docker注册表(例如Docker Hub)
  3. 为我们的Django应用程序部署带有Kubernetes部署的Helm图表
  4. 启动端口转发以访问localhost上的应用程序(以及在浏览器中打开)
  5. 流式传输您的容器的日志
  6. 监视文件更改,如果有文件更改,则重新启动应用程序

您可以自定义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使用热重载来更新正在运行的容器。

自己尝试:

  1. 更改您的Hello World!文件中的语句:$PROJECT_NAME/pages/views.py
  2. 重新加载浏览器,看看更改如何立即生效。

奖励:添加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

你可能感兴趣的:(将Django项目部署到Kubernetes)