在本快速入門中,您將使用 Azure CLI 在 Azure Kubernetes Service (AKS) 叢集上部署 Django 應用程式,並搭配適用於 PostgreSQL 的 Azure 資料庫彈性伺服器。
AKS 是一項受控 Kubernetes 服務,可讓您快速部署及管理叢集。 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器是一項完全受控的資料庫服務,旨在針對資料庫管理功能與組態設定提供更精細的控制與彈性。
備註
本快速入門假設您對 Kubernetes 概念、Django 和 PostgreSQL 有基本瞭解。
先決條件
如果您沒有 Azure 帳戶,請在開始之前建立 免費帳戶 。
- 在新的瀏覽器視窗中啟動 Azure Cloud Shell。 您也可以在您的本機電腦上安裝 Azure CLI。 如果您是使用本機安裝,請使用 az login 命令以 Azure CLI 登入。 請遵循您終端機上顯示的步驟,完成驗證程序。
- 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。 本文需要最新版本的 Azure CLI。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。
建立資源群組
Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。 讓我們在 eastus 位置使用 az group create 命令來建立名為 django-project 的資源群組。
az group create --name django-project --location eastus
備註
資源群組的位置是儲存資源群組中繼資料的地方。 如果您在建立資源時未指定其他區域,這也是您的資源在 Azure 中執行的位置。
下列範例輸出顯示已成功建立資源群組:
{
"id": "/subscriptions/<guid>/resourceGroups/django-project",
"location": "eastus",
"managedBy": null,
"name": "django-project",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
建立 AKS 叢集
使用 az aks create 命令來建立 AKS 叢集。 下列範例會建立名為 djangoappcluster 且具有一個節點的叢集。 建立叢集需要幾分鐘的時間才能完成。
az aks create --resource-group django-project --name djangoappcluster --node-count 1 --generate-ssh-keys
幾分鐘後,命令會完成並傳回關於叢集的 JSON 格式資訊。
備註
建立 AKS 叢集時,系統會自動建立第二個資源群組來儲存 AKS 資源。 請參閱為何會使用 AKS 建立兩個資源群組?。
連接至叢集
若要管理 Kubernetes 叢集,請使用 kubectl (Kubernetes 命令列用戶端)。 如果您使用 Azure Cloud Shell,則 kubectl 已安裝。
備註
如果是在本機執行 Azure CLI,請執行 az aks install-cli 命令來安裝 kubectl。
若要設定由 kubectl 連線至您的 Kubernetes 叢集,請使用 az aks get-credentials 命令。 此命令會下載認證,並設定 Kubernetes CLI 來使用這些認證。
az aks get-credentials --resource-group django-project --name djangoappcluster
若要驗證針對您叢集的連線,請使用 kubectl get 命令來傳回叢集節點的清單。
kubectl get nodes
下列輸出範例會顯示上一個步驟中建立的單一節點。 確保節點的狀態為 Ready:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-31718369-0 Ready agent 6m44s v1.12.8
建立彈性伺服器實例
使用 az postgreSQL flexible-server create 命令來建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。 下列命令會使用服務預設值以及來自 Azure CLI 本機內容的值來建立伺服器:
az postgres flexible-server create --public-access all
建立的伺服器具有下列屬性:
- 初次佈建伺服器時,系統會建立一個名為
postgres的全新空資料庫。 我們將在本快速入門中使用此資料庫。 - 自動產生的伺服器名稱、管理員使用者名稱、管理員密碼、資源群組名稱 (若尚未在本機內容中指定),且位於與資源群組相同的地點。
- 使用 public-access 引數可讓您建立支援公用存取的伺服器,任何具有正確使用者名稱與密碼的用戶端皆可進行存取。
- 由於命令使用本機內容,因此會在
django-project資源群組與eastus區域中建立伺服器。
建置您的 Django Docker 映像
建立新的 Django 應用程式,或使用現有的 Django 專案。 請確保您的程式碼位於此資料夾結構中:
└───my-djangoapp
└───views.py
└───models.py
└───forms.py
├───templates
. . . . . . .
├───static
. . . . . . .
└───my-django-project
└───settings.py
└───urls.py
└───wsgi.py
. . . . . . .
└─── Dockerfile
└─── requirements.txt
└─── manage.py
更新 settings.py 中的 ALLOWED_HOSTS,確保 Django 應用程式使用指派給 kubernetes 應用程式的外部 IP。
ALLOWED_HOSTS = ['*']
更新 settings.py 檔案中的 DATABASES={ } 區段。 下列程式碼片段會從 Kubernetes 資訊清單檔案中讀取資料庫主機、使用者名稱和密碼。
DATABASES={
'default':{
'ENGINE':'django.db.backends.postgresql_psycopg2',
'NAME':os.getenv('DATABASE_NAME'),
'USER':os.getenv('DATABASE_USER'),
'PASSWORD':os.getenv('DATABASE_PASSWORD'),
'HOST':os.getenv('DATABASE_HOST'),
'PORT':'5432',
'OPTIONS': {'sslmode': 'require'}
}
}
產生 requirements.txt 檔案
建立 requirements.txt 檔案,以列出 Django 應用程式的相依項目。 以下是 requirements.txt 檔案的範例。 您可使用 pip freeze > requirements.txt,為現有的應用程式產生 requirements.txt 檔案。
Django==2.2.17
postgres==3.0.0
psycopg2-binary==2.8.6
psycopg2-pool==1.1
pytz==2020.4
建立 Dockerfile
建立名為 Dockerfile 的新檔案,並複製下列程式碼片段。 此 Dockerfile 用於設定 Python 3.8 並安裝 requirements.txt 檔案中所列的所有需求項目。
# Use the official Python image from the Docker Hub
FROM python:3.8.2
# Make a new directory to put our code in.
RUN mkdir /code
# Change the working directory.
WORKDIR /code
# Copy to code folder
COPY . /code/
# Install the requirements.
RUN pip install -r requirements.txt
# Run the application:
CMD python manage.py runserver 0.0.0.0:8000
建置您的映像
請確保您已在終端機中使用 cd 命令切換至 my-django-app 目錄。 執行下列命令來建置您的布告欄映像:
docker build --tag myblog:latest .
將您的映像部署至 Docker Hub 或 Azure Container Registry。
這很重要
如果您使用 Azure Container Registry (ACR),請執行 az aks update 將 ACR 帳戶連結至 AKS 叢集。
az aks update --name djangoappcluster --resource-group django-project --attach-acr <your-acr-name>
建立 Kubernetes 資訊清單檔
Kubernetes 資訊清單檔會定義所需的叢集狀態,例如要執行哪些容器映像。 讓我們建立名為 djangoapp.yaml 的資訊清單檔,並複製下列 YAML 定義。
這很重要
請根據您的適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體,更新下方 env 區段中的 SERVERNAME、YOUR-DATABASE-USERNAME 與 YOUR-DATABASE-PASSWORD。
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-app
spec:
replicas: 1
selector:
matchLabels:
app: django-app
template:
metadata:
labels:
app: django-app
spec:
containers:
- name: django-app
image: [DOCKER-HUB-USER-OR-ACR-ACCOUNT]/[YOUR-IMAGE-NAME]:[TAG]
ports:
- containerPort: 8000
env:
- name: DATABASE_HOST
value: "SERVERNAME.postgres.database.azure.com"
- name: DATABASE_USER
value: "YOUR-DATABASE-USERNAME"
- name: DATABASE_PASSWORD
value: "YOUR-DATABASE-PASSWORD"
- name: DATABASE_NAME
value: "postgres"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- django-app
topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Service
metadata:
name: python-svc
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8000
selector:
app: django-app
將 Django 部署至 AKS 叢集
使用 kubectl apply 命令來部署應用程式並指定 YAML 資訊清單的名稱:
kubectl apply -f djangoapp.yaml
下列範例輸出顯示已成功建立部署和服務:
deployment "django-app" created
service "python-svc" created
django-app 部署可讓您說明部署的詳細資料,例如應用程式要使用的映像、Pod 數量以及 Pod 組態。 系統會建立 python-svc 服務,透過外部 IP 公開應用程式。
測試應用程式
當應用程式執行時,Kubernetes 服務會將應用程式前端公開至網際網路。 此程序可能需要幾分鐘才能完成。
若要監視進度,請使用 kubectl get service 命令搭配 --watch 引數。
kubectl get service python-svc --watch
一開始 django-app 服務的 EXTERNAL-IP 會顯示為 pending。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-app LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
當 EXTERNAL-IP 位址從 pending 變成實際的公用 IP 位址時,請使用 CTRL-C 停止 kubectl 監看式流程。 下列範例輸出顯示指派給服務的有效公用 IP 位址:
django-app LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m
現在,請在網頁瀏覽器中開啟服務的外部 IP 位址 (http://<service-external-ip-address>) 並檢視 Django 應用程式。
備註
- 目前 Django 網站未使用 HTTPS。 如需有關 HTTPS 以及如何為 AKS 設定應用程式路由的詳細資訊,請參閱具有應用程式路由附加元件的受控 NGINX 輸入。
執行資料庫移轉
針對任何 Django 應用程式,您都需要執行資料庫移轉或收集靜態檔案。 您可以使用 $ kubectl exec <pod-name> -- [COMMAND] 執行這些 Django 殼層命令。 在執行命令之前,您必須使用 kubectl get pods尋找 Pod 名稱。
$ kubectl get pods
您會看到如下的輸出:
NAME READY STATUS RESTARTS AGE
django-app-5d9cd6cd8-l6x4b 1/1 Running 0 2m
找到 Pod 名稱之後,您可以使用 $ kubectl exec <pod-name> -- [COMMAND] 命令執行 django 資料庫移轉。 請注意,/code/ 是上方 Dockerfile 中定義的專案工作目錄。
$ kubectl exec django-app-5d9cd6cd8-l6x4b -- python /code/manage.py migrate
輸出看起來會像
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
. . . . . .
如果遇到問題,請執行 kubectl logs <pod-name> 查看應用程式擲回的例外狀況。 如果應用程式運作成功,執行 kubectl logs 您會看到如下的輸出。
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
December 08, 2020 - 23:24:14
Django version 2.2.17, using settings 'django_postgres_app.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
清除資源
若要避免 Azure 費用,您應該清除不需要的資源。 當不再需要叢集時,請使用 az group delete 命令來移除資源群組、容器服務以及所有相關資源。
az group delete --name django-project --yes --no-wait
備註
當您刪除叢集時,AKS 叢集所使用的 Microsoft Entra 服務主體並不會被移除。 如需有關如何移除服務主體的步驟,請參閱 AKS 服務主體的考量和刪除。 如果您使用受控識別,則該識別由平台管理,不需要手動移除。