將Django項目部署到Kubernetes


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:

  1. 基于Dockerfile構(gòu)建Docker映像
  2. 標(biāo)記該映像并將其推送到Docker注冊表(例如Docker Hub)
  3. 為我們的Django應(yīng)用程序部署帶有Kubernetes部署的Helm圖表
  4. 啟動端口轉(zhuǎn)發(fā)以訪問localhost上的應(yīng)用程序(以及在瀏覽器中打開)
  5. 流式傳輸您的容器的日志
  6. 監(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使用熱重載來更新正在運行的容器。

自己嘗試:

  1. 更改您的Hello World刹悴!文件中的語句:$PROJECT_NAME/pages/views.py
  2. 重新加載瀏覽器行楞,看看更改如何立即生效。

獎勵:添加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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市散休,隨后出現(xiàn)的幾起案子媒楼,更是在濱河造成了極大的恐慌,老刑警劉巖戚丸,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件划址,死亡現(xiàn)場離奇詭異,居然都是意外死亡限府,警方通過查閱死者的電腦和手機夺颤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胁勺,“玉大人世澜,你說我怎么就攤上這事∈鹚耄” “怎么了寥裂?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵嵌洼,是天一觀的道長。 經(jīng)常有香客問我封恰,道長麻养,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任诺舔,我火速辦了婚禮鳖昌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘低飒。我一直安慰自己遗遵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布逸嘀。 她就那樣靜靜地躺著车要,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崭倘。 梳的紋絲不亂的頭發(fā)上翼岁,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音司光,去河邊找鬼琅坡。 笑死,一個胖子當(dāng)著我的面吹牛残家,可吹牛的內(nèi)容都是我干的榆俺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼坞淮,長吁一口氣:“原來是場噩夢啊……” “哼茴晋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起回窘,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤诺擅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啡直,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烁涌,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年酒觅,在試婚紗的時候發(fā)現(xiàn)自己被綠了撮执。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡舷丹,死狀恐怖抒钱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤继效,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布症杏,位于F島的核電站,受9級特大地震影響瑞信,放射性物質(zhì)發(fā)生泄漏厉颤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一凡简、第九天 我趴在偏房一處隱蔽的房頂上張望逼友。 院中可真熱鬧,春花似錦秤涩、人聲如沸帜乞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黎烈。三九已至,卻和暖如春匀谣,著一層夾襖步出監(jiān)牢的瞬間照棋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工武翎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烈炭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓宝恶,卻偏偏與公主長得像符隙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垫毙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容