教學課程:使用 適用於 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 資源所在的邏輯群組。 讓我們使用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

下列範例輸出顯示先前步驟中建立的單一節點。 請確定節點的狀態為 [ 就緒] :

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 中樞Azure Container Registry

重要

如果您使用 Azure Container Registry (ACR),請執行 az aks update 命令以附加 ACR 帳戶與 AKS 叢集。

az aks update -n djangoappcluster -g django-project --attach-acr <your-acr-name>

建立 Kubernetes 指令清單檔案

Kubernetes 指令清單檔案會定義叢集所需的狀態,例如要執行的容器映像。 讓我們在下列 YAML 定義中建立名為 djangoapp.yaml 的指令清單檔案並複製。

重要

使用 適用於 PostgreSQL 的 Azure 資料庫 SERVERNAME彈性伺服器實例的、 YOUR-DATABASE-PASSWORDYOUR-DATABASE-USERNAME更新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-svc ,以透過外部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 位址從擱置變更為實際的公用 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。 建議使用 您自己的憑證啟用 TLS。
  • 您可以啟用 叢集的 HTTP 路由 。 啟用 HTTP 路由時,它會在 AKS 叢集中設定輸入控制器。 部署應用程式時,此解決方案也會針對應用程式端點建立可公開存取的 DNS 名稱。

執行資料庫移轉

對於任何 django 應用程式,您必須執行資料庫移轉或收集靜態檔案。 您可以使用 來執行這些 django 殼層 $ kubectl exec <pod-name> -- [COMMAND]命令。 執行命令之前,您需要使用 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 服務主體考慮和刪除。 如果您使用受控識別,則身分識別是由平臺管理,且不需要移除。

下一步