共用方式為


將 Django 應用程式部署到 Azure Kubernetes 服務並使用 Azure Database for PostgreSQL

在這個快速入門中,你將使用 Azure CLI 部署一個 Django 應用程式,搭配 Azure Kubernetes Service(AKS)叢集,並使用 Azure Database for PostgreSQL 彈性伺服器。

AKS 是一個託管 Kubernetes 服務,你可以用它快速部署和管理叢集。 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器是一項完全受控的資料庫服務,旨在針對資料庫管理功能與組態設定提供更精細的控制與彈性。

備註

本快速入門假設您對 Kubernetes 概念、Django 和 PostgreSQL 有基本瞭解。

先決條件

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

  • 在新的瀏覽器視窗中啟動 Azure Cloud Shell。 您也可以在您的本機電腦上安裝 Azure CLI。 如果你用的是本地安裝,請用 az login 指令登入。 請遵循您終端機上顯示的步驟,完成驗證程序。
  • 執行 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 叢集,請使用 Kubernetes 命令列用戶端 kubectl。 如果您使用 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 空資料庫。 這個快速入門指南使用 postgres 資料庫。
  • 自動產生伺服器名稱、管理員使用者名稱、管理員密碼、資源群組名稱(如果你在本地還沒指定的話),以及與資源群組相同的位置。
  • 透過使用公開存取參數,你可以建立一個擁有公開存取權限的伺服器,讓任何擁有正確使用者名稱和密碼的客戶端都能存取。
  • 由於指令使用本地上下文,它會在資源群組 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

更新 ALLOWED_HOSTS 內的 settings.py 以確保 Django 應用程式使用分配給 Kubernetes 應用程式的外部 IP。

ALLOWED_HOSTS = ['*']

更新 DATABASES={ } 檔案中的 settings.py 區段。 程式碼片段會從 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

建置您的映像

請確認您在終端機的my-django-app目錄中,並使用cd指令。 執行下列命令來建置您的布告欄映像:

docker build --tag myblog:latest .

將您的映像部署至 Docker HubAzure Container Registry

這很重要

如果你使用 Azure 容器登錄檔(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 定義複製。

這很重要

env 區段中,更新為適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體所使用的 SERVERNAMEYOUR-DATABASE-USERNAMEYOUR-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 的數量和配置。 你建立一個名為 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 應用程式,你都需要執行資料庫遷移或收集靜態檔案。 你可以用 $ kubectl exec <pod-name> -- [COMMAND]. 來執行這些 Django shell 指令。 執行指令前,你需要先用 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 群組刪除 指令移除資源群組、容器服務及所有相關資源。

az group delete --name django-project --yes --no-wait

備註

當你刪除叢集時,AKS 叢集使用的 Microsoft Entra 服務主體不會被移除。 如需有關如何移除服務主體的步驟,請參閱 AKS 服務主體的考量和刪除。 如果你使用受管理身份,平台會管理該身份,不需要移除。