Source: Lukas Gentele
本教程旨在為希望使用Kubernetes構(gòu)建和部署Django項目時探索Kubernetes并提高生產(chǎn)率的Django開發(fā)人員提供指南酣藻。本教程獨立于任何云平臺垒棋。無論是使用Minikube或Docker桌面創(chuàng)建的本地單節(jié)點集群,還是GKE评也,AKS或EKS中的完全托管集群,一切都可以與任何Kubernetes集群一起使用本橙。
即使您還沒有Kubernetes集群艇拍,也可以執(zhí)行本教程。如果您已經(jīng)有集群煞聪,那就更好了!讓我們開始吧逝慧。
1.創(chuàng)建Django項目
如果您已經(jīng)有一個Django項目昔脯,則可以跳過此步驟啄糙,但是請確保requirements.txt
在項目的根目錄中有一個(運行pip freeze > requirements.txt
創(chuàng)建它)。
在創(chuàng)建新的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設(shè)置中將項目標(biāo)記為Shared Drive的驅(qū)動器鲸拥。
我們還應(yīng)該為項目名稱定義一個變量:
PROJECT_NAME=mysite
# warning: Django only allows characters a-z, no -, space or anything else
現(xiàn)在拐格,我們使用Docker創(chuàng)建一個新的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
現(xiàn)在將我們的Django項目容器化。
2.集裝箱項目
當(dāng)然刑赶,我們可以手動創(chuàng)建一個Dockerfile捏浊,Kubernetes清單或什至Helm圖表,但這需要大量工作并且容易出錯角撞。因此呛伴,讓我們使用DevSpace將Django項目自動化容器化勃痴。DevSpace是Kubernetes的云原生開發(fā)工具谒所。它是開源的,您可以從GitHub安裝它沛申。
在計算機上安裝DevSpace之后劣领,可以使用以下命令對Django項目進行容器化:
devspace init
DevSpace將提出幾個問題:
-
python
用作編程語言的項目 - 一個監(jiān)聽端口
8000
如果不確定Docker注冊表或其他問題,只需選擇DevSpace為您推薦的默認(rèn)選項即可铁材。
將項目容器化后尖淘,DevSpace將a添加Dockerfile
到項目中。將以下Dockerfile中的最后一行更改為:
CMD ["app.py"]
to:
CMD ["manage.py", "runserver"]
現(xiàn)在我們準(zhǔn)備將Django項目部署到Kubernetes著觉。
3.選擇Kubernetes集群
如果您已經(jīng)有一個Kubernetes集群村生,請使用以下命令告訴DevSpace將項目部署到哪個名稱空間:
devspace use namespace [my-namespace]
如果尚不存在,DevSpace將在部署期間創(chuàng)建此名稱空間饼丘。在部署項目之前趁桃,請確保您處于正確的kube上下文中。
沒有Kubernetes集群嗎肄鸽?
如果沒有Kubernetes集群卫病,則可以使用由DevSpace贊助的免費Kubernetes命名空間。使用此命令創(chuàng)建一個:
devspace create space mysite
DevSpace將自動為您配置kube-context典徘,以便您可以使用任何Kubernetes工具(例如kubectl蟀苛,Kustomize,Skaffold或Helm)使用此名稱空間逮诲。
4.Develop
在以生產(chǎn)方式部署項目之前帜平,讓我們首先開始開發(fā)模式:
devspace dev
該命令告訴DevSpace:
- 基于Dockerfile構(gòu)建Docker映像
- 標(biāo)記該映像并將其推送到Docker注冊表(例如Docker Hub)
- 為我們的Django應(yīng)用程序部署帶有Kubernetes部署的Helm圖表
- 啟動端口轉(zhuǎn)發(fā)以訪問localhost上的應(yīng)用程序(以及在瀏覽器中打開)
- 流式傳輸您的容器的日志
- 監(jiān)視文件更改幽告,如果有文件更改,則重新啟動應(yīng)用程序
您可以自定義DevSpace配置文件中會發(fā)生什么devspace.yaml
罕模,這devspace init
將為項目創(chuàng)建评腺。
之后devspace dev
成功部署,你應(yīng)該看到的Django的命令行內(nèi)日志輸出淑掌,瀏覽器將打開與我們的Django的網(wǎng)站呈現(xiàn)出美麗的歡迎頁面:
現(xiàn)在蒿讥,該創(chuàng)建/pages
文件夾了。運行以下命令來創(chuàng)建它:
devspace enter python manage.py startapp pages
添加pages文件夾后抛腕,我們需要添加pages.apps.PagesConfig
到內(nèi)的INSTALLED_APPS
數(shù)組$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!')
現(xiàn)在担敌,創(chuàng)建$PROJECT_NAME/pages/urls.py
具有以下內(nèi)容的文件:
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')),
]
而已摔敛!現(xiàn)在,您可以重新加載瀏覽器全封,并且您會看到DevSpace實時更新了Django應(yīng)用程序-無需部署項目马昙,因為DevSpace使用熱重載來更新正在運行的容器。
自己嘗試:
- 更改您的Hello World刹悴!文件中的語句:
$PROJECT_NAME/pages/views.py
- 重新加載瀏覽器行楞,看看更改如何立即生效。
獎勵:添加PostgreSQL數(shù)據(jù)庫
在添加Postgres數(shù)據(jù)庫之前土匀,請確保已終止devspace dev
子房,例如使用CTRL+C
。
首先就轧,我們需要requirements.txt
使用以下命令將適用于Python的Postgres驅(qū)動程序添加至我們:
docker run --rm -v /$PROJECT_DIR:/app -w //app python bash -c "pip install psycopg2 && pip freeze | grep psycopg2 >> $PROJECT_NAME/requirements.txt"
現(xiàn)在我們需要告訴DevSpace我們也想部署PostgreSQL數(shù)據(jù)庫证杭。為此,我們需要將以下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現(xiàn)在將啟動PostgreSQL數(shù)據(jù)庫容器解愤。但是,在執(zhí)行此操作之前乎莉,我們需要配置Django項目以連接到數(shù)據(jù)庫送讲。
因此更改$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'),
}
}
現(xiàn)在,讓我們使用以下命令重新部署我們的Django項目:
devspace dev -b
devspace dev
進行此更改后梦鉴,第一次運行時李茫,DevSpace將要求您定義用于變量的數(shù)據(jù)庫密碼DB_PASSWORD
。
注意該-b
標(biāo)志肥橙,它是的快捷方式--force-rebuild
魄宏。它告訴DevSpace我們不想使用熱重載,而是要重建Docker映像并完全重新部署項目存筏。當(dāng)重要設(shè)置更改而無法使用熱重載進行更新時宠互,這通常非常有用settings.py
味榛。
再次看到日志時,您可以中止操作devspace dev
予跌,也可以打開其他終端并檢查PostgreSQL數(shù)據(jù)庫的日志以確保它準(zhǔn)備就緒搏色,然后再繼續(xù)。您可以通過以下方式查看日志券册,以檢查其是否已準(zhǔn)備就緒:
devspace logs -f
將數(shù)據(jù)庫連接添加到Django應(yīng)用后频轿,我們需要運行遷移。我們可以使用以下命令執(zhí)行此操作:
devspace enter python manage.py migrate
DevSpace將詢問您應(yīng)在哪個容器中執(zhí)行遷移烁焙。確保選擇Django應(yīng)用程序航邢。
5.部署
如果完成構(gòu)建應(yīng)用程序并要發(fā)布它,則不應(yīng)該通過devspace dev
進行開發(fā)骄蝇,這是為了開發(fā)膳殷。對于類似生產(chǎn)的部署,可以使用以下命令:
devspace deploy
將Django成功部署到Kubernetes之后九火,您可以devspace dev
通過運行以下命令使該項目在公共URL上可用或通過localhost(使用類似于的端口轉(zhuǎn)發(fā))訪問它:
devspace open
下一步是什么赚窃?
我希望本教程可以幫助很多人開始在Kubernetes上部署Django項目。很難在一個教程中涵蓋所有細(xì)節(jié)岔激,我想寫這篇文章的后續(xù)文章勒极。如果您有任何問題或想讓我在下一篇文章中寫的東西,請發(fā)表評論鹦倚。
我目前的計劃是寫另一篇文章河质,內(nèi)容涉及如何使用自動縮放冀惭,數(shù)據(jù)庫高可用性和多階段Docker構(gòu)建來使基于Kubernetes的Django項目就緒震叙。
翻譯自:https://medium.com/better-programming/deploy-django-projects-to-kubernetes-d1c9584036a5