共用方式為


教學課程:使用適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器在 AKS 上部署 Django

適用於: 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

在本快速入門中,您會使用 Azure CLI 透過適用於 PostgreSQL 的 Azure 資料庫彈性伺服器在 Azure Kubernetes Service (AKS) 叢集上部署 Django 應用程式。

AKS 是一項受控 Kubernetes 服務,可讓您快速部署及管理叢集。 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器是完全受控的資料庫服務,其設計目的是要在資料庫管理功能和設定方面提供更細微的控制和彈性。

注意

本快速入門假設您已有 Kubernetes 概念的基本知識以及 Django 和 PostgreSQL。

必要條件

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

  • 在新的瀏覽器視窗中啟動 Azure Cloud Shell。 您也可以在本機電腦上安裝 Azure CLI。 如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。
  • 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。 本文需要最新版本的 Azure CLI。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。

建立資源群組

Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。 我們將使用 az-group-create 命令在 eastus 位置建立資源群組 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

建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體

使用 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 HubAzure Container Registry

重要

如果您使用 Azure Container Regdistry (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 資料庫彈性伺服器執行個體的 SERVERNAMEYOUR-DATABASE-USERNAMEYOUR-DATABASE-PASSWORD 更新下方的 env 區段。

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-svcK服務,以透過外部 IP 公開應用程式。

測試應用程式

當應用程式執行時,Kubernetes 服務會將應用程式前端公開至網際網路。 此程序可能需要幾分鐘才能完成。

若要監視進度,請使用 kubectl get service 命令搭配 --watch 引數。

kubectl get service python-svc --watch

一開始,django-app 服務的 EXTERNAL-IP 會顯示為「擱置中」

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 應用程式,您都必須執行資料庫移轉或收集靜態檔案。 您可以使用 $ 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 服務主體的考量和刪除。 如果您使用受控識別,則身分識別會由平台負責管理,您不需要刪除。

下一步