将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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容