在 Kubernetes Engine 上執行 Django

您可以輕鬆開始開發在 Google Kubernetes Engine 中執行的 Django 應用程式,且由於您建立的應用程式會在所有 Google 產品所採用的基礎架構上執行,因此您可以確定,無論使用者只有幾人還是有數百萬人,應用程式都可調度資源,為所有使用者提供服務。

本教學課程假設您已熟悉 Django 網路開發流程,其中將協助您逐步瞭解正式的 Django 教學課程應用程式

建議您先進行該項教學課程,然後再進行此項教學課程,特別是在您初次接觸 Django 開發的情況下。應用程式模型代表包含問題的意見調查,您可利用 Django 管理控制台與模型互動。

本教學課程需要使用 Python 2.7 或 Python 3.4 以上版本,另外您也必須安裝 Docker

事前準備

請在完成下列各步驟後勾選核取方塊。

  1. check_box_outline_blank check_box 在 Google Cloud Platform 主控台中建立專案。
    如果您尚未建立專案,請立即建立。專案可讓您管理應用程式的所有 Google Cloud Platform 資源,包括部署、存取權控管、計費和服務。
    1. 開啟 GCP 主控台
    2. 在頂端的下拉式選單中,選取 [Create a project] (建立專案)
    3. 按一下 [Show advanced options] (顯示進階選項),然後在「App Engine location」 (App Engine 位置) 底下選取位在美國的地點。
    4. 為您的專案命名。
    5. 記下專案 ID,這組 ID 可能與專案名稱不同。專案 ID 會在指令和設定中用到。
  2. check_box_outline_blank check_box 為專案啟用計費功能,並申請免費試用。

    如果您尚未為專案啟用計費功能,請立即啟用計費功能,並申請免費試用。啟用計費功能後,應用程式就能使用計費資源,例如執行執行個體和儲存資料。 在免費試用期間,您不需要為任何服務付費。

  3. check_box_outline_blank check_box 安裝 Cloud SDK。

    如果您尚未安裝 Cloud SDK,請立即安裝並初始化 Google Cloud SDK。這個 Cloud SDK 包含的工具和程式庫可讓您在 GCP 上建立及管理資源。

  4. check_box_outline_blank check_box 為您的專案啟用 API

    這會將您導向 GCP 主控台,並自動啟用本教學課程使用的 API:Cloud SQL Admin API 和 Compute Engine API。

下載及執行應用程式

在您完成必要條件後,即可下載及部署 Django 範例應用程式。以下章節將逐步引導您設定、執行及部署範例。

複製 Django 應用程式

Django 範例應用程式的程式碼位於 GitHub 的 GCP Python 範例存放區。

將存放區複製到本機電腦中:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

前往包含程式碼範例的目錄:

cd python-docs-samples/container_engine/django_tutorial

您也可以下載 zip 格式的範例,然後解壓縮該檔案。

設定您的本機環境

部署作業完成後,應用程式會使用 App Engine 環境內建的 Cloud SQL Proxy 與您的 Cloud SQL 執行個體進行通訊。不過,如要在本機測試應用程式,您就必須在開發環境安裝並使用 Proxy 本機副本。

進一步瞭解 Cloud SQL Proxy

如要在 Cloud SQL 執行個體上執行基本的管理工作,您可以使用 PostgreSQL 用戶端。

安裝 Cloud SQL Proxy

下載並安裝 Cloud SQL Proxy。Cloud SQL Proxy 在本機執行時會連線至您的 Cloud SQL 執行個體。

Linux 64 位元

  1. 下載 Proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. 將 Proxy 設定為可執行:
    chmod +x cloud_sql_proxy
    

Linux 32 位元

  1. 下載 Proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. 將 Proxy 設定為可執行:
    chmod +x cloud_sql_proxy
    

macOS 64 位元

  1. 下載 Proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. 將 Proxy 設定為可執行:
    chmod +x cloud_sql_proxy
    

macOS 32 位元

  1. 下載 Proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. 將 Proxy 設定為可執行:
    chmod +x cloud_sql_proxy
    

Windows 64 位元

https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe 上按一下滑鼠右鍵,然後選取 [Save Link As] (另存連結為) 來下載 Proxy。將檔案重新命名為 cloud_sql_proxy.exe

Windows 32 位元

https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe 上按一下滑鼠右鍵,然後選取 [Save Link As] (另存連結為) 來下載 Proxy。將檔案重新命名為 cloud_sql_proxy.exe
如果這裡沒有列出您的作業系統,您也可以從原始碼編譯 Proxy

建立 Cloud SQL 執行個體

  1. 建立 PostgreSQL 適用的 Cloud SQL 執行個體。

    將執行個體命名為 polls-instance 或類似名稱。執行個體可能需要幾分鐘的時間才能準備就緒。執行個體準備就緒之後,會顯示在執行個體清單中。

  2. 現在請使用 Cloud SDK 來執行下列指令,其中 [YOUR_INSTANCE_NAME] 是您 Cloud SQL 執行個體的名稱。
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    在輸出中,記下 [CONNECTION_NAME] 顯示的值。

    [CONNECTION_NAME] 值的格式為 [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME]

初始化 Cloud SQL 執行個體

  1. 使用上一步的 [CONNECTION_NAME] 值啟動 Cloud SQL Proxy。

    Linux/macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    [YOUR_INSTANCE_CONNECTION_NAME] 改成您在上一步記下的 [CONNECTION_NAME] 值。

    這個步驟會將本機電腦連線至 Cloud SQL 執行個體,以利進行本機測試。本機測試應用程式期間請讓 Cloud SQL Proxy 全程保持運作。

  2. 建立 Cloud SQL 使用者與資料庫。

    GCP 主控台

    1. 針對您的 Cloud SQL 執行個體 polls-instance使用 GCP 主控台建立新資料庫。例如,您可以使用 polls 這個名稱。
    2. 針對您的 Cloud SQL 執行個體 polls-instance使用 GCP 主控台建立新使用者

    Postgres 用戶端

    1. 在單獨的指令列分頁中,安裝 Postgres 用戶端
      sudo apt-get install postgresql
    2. 使用 Postgres 用戶端或類似程式連線至執行個體。系統提示時,請使用您設定的根密碼。
      psql --host 127.0.0.1 --user postgres --password
    3. 使用下列指令,在 Cloud SQL 資料庫中建立需要的資料庫、使用者與存取權限。將 [POSTGRES_USER][POSTGRES_PASSWORD] 改成您想要用的使用者名稱和密碼。
      CREATE DATABASE polls;
      CREATE USER [POSTGRES_USER] WITH PASSWORD '[POSTGRES_PASSWORD]';
      GRANT ALL PRIVILEGES ON DATABASE polls TO [POSTGRES_USER];
      GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [POSTGRES_USER];
      

建立服務帳戶

Proxy 需要具有您 Cloud SQL 執行個體編輯者權限的服務帳戶。如需進一步瞭解服務帳戶,請參閱 GCP 驗證指南

  1. 前往 Google Cloud Platform 主控台的「Service accounts」(服務帳戶) 頁面。

    前往「Service accounts」(服務帳戶) 頁面

  2. 如有需要,請選取包含您的 Cloud SQL 執行個體的專案。
  3. 按一下 [Create service account] (建立服務帳戶)
  4. 在「建立服務帳戶」對話方塊中,提供服務帳戶的描述性名稱。
  5. 在「Role」(角色) 部分,選取下列其中一個角色:
    • Cloud SQL > Cloud SQL 用戶端
    • Cloud SQL > Cloud SQL 編輯者
    • Cloud SQL > Cloud SQL 管理員
  6. 將「服務帳戶 ID」變更為您可以辨識的專屬值,以便日後能夠在有需要的情況下輕鬆找到這個服務帳戶。
  7. 按一下 [Furnish a new private key] (提供一組新的私密金鑰)
  8. 預設金鑰類型為 JSON,這是要使用的正確值。
  9. 按一下 [Create] (建立)

    私密金鑰檔案就會下載到您的機器。您可以將它移到其他位置。請保障金鑰檔案的安全。

指定資料庫設定

  1. 為本機測試設定資料庫存取權的環境變數。

Linux/macOS

export DATABASE_USER=<your-database-user>
export DATABASE_PASSWORD=<your-database-password>

Windows

set DATABASE_USER=<your-database-user>
set DATABASE_PASSWORD=<your-database-password>

指定 GKE 設定

  1. 這個應用程式會以單一 Kubernetes 設定顯示,名稱為 polls。請在 polls.yaml 中將 <your-project-id> 替換為您的專案 ID。

  2. polls.yaml 中將 <your-cloudsql-connection-string> 替換為下列指令輸出的「connectionName」值。

    gcloud beta sql instances describe [YOUR_INSTANCE_NAME]
    

在本機電腦上執行應用程式

  1. 若要在本機電腦執行 Django 應用程式,您必須設定 Python 開發環境,包括 Python、pip 及 virtualenv。

  2. 建立獨立的 Python 環境,並安裝依附元件:

    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    
  3. 執行 Django 遷移作業以設定模型:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    
  4. 啟動本機網路伺服器:

    python manage.py runserver
    
  5. 透過瀏覽器前往 http://localhost:8000

您應該會看見一個顯示以下文字的簡單網頁:「Hello, world. You're at the polls index」。範例應用程式頁面是由在您電腦上執行的 Django 網路伺服器提供。您準備好繼續進行時,請按下「Ctrl+C」停止本機網路伺服器。

使用 Django 管理控制台

  1. 建立超級使用者:

    python manage.py createsuperuser
    
  2. 執行主要程式:

    python manage.py runserver
    
  3. 透過瀏覽器前往 http://localhost:8000/admin

  4. 使用您在執行 createsuperuser 時建立的使用者名稱及密碼登入管理員網站。

將應用程式部署至 GKE

  1. 將應用程式部署至 Google Cloud Platform 時,應用程式會使用 Gunicorn 伺服器。Gunicorn 不提供靜態內容,所以應用程式會使用 Cloud Storage 提供靜態內容。

    建立 Cloud Storage 值區,並設定為可公開讀取。接著,將 <your-gcs-bucket> 替換為您選擇的值區名稱;舉例來說,您可以將專案 ID 當做值區名稱:

    gsutil mb gs://<your-gcs-bucket>
    gsutil defacl set public-read gs://<your-gcs-bucket>
    
  2. 將所有本機靜態內容收集至單一資料夾:

    python manage.py collectstatic
    
  3. 將靜態內容上傳至 Cloud Storage:

    gsutil rsync -R static/ gs://<your-gcs-bucket>/static
    
  4. mysite/settings.py 中將 STATIC_URL 的值設為這個網址,並將 <your-gcs-bucket> 替換為您的值區名稱。

    http://storage.googleapis.com/<your-gcs-bucket>/static/
    
  5. 如要初始化 GKE,請前往 GCP 主控台,然後等待「Kubernetes Engine is getting ready. This may take a minute or more」訊息消失。

  6. 建立 GKE 叢集:

    gcloud container clusters create polls \
      --scopes "https://www.googleapis.com/auth/userinfo.email","cloud-platform" \
      --num-nodes 4 --zone "us-central1-a"
    

    看看系統是否顯示以下錯誤訊息:「Project [PROJECT_ID] is not fully initialized with the default service accounts.」

    初始化 {container_name_short}}

    如果系統顯示錯誤訊息,請前往主控台將您專案中的 GKE 初始化:

    前往 GKE 頁面

    等待「Kubernetes Engine is getting ready. This can take a minute or more」訊息消失。

  7. 建立叢集之後,請使用與 gcloud 工具整合的 kubectl 指令列工具和您的 GKE 叢集互動。因為 gcloudkubectl 是各自獨立的工具,請務必妥善設定 kubectl,以便和正確的叢集互動:

    gcloud container clusters get-credentials polls --zone "us-central1-a"
    
  8. 您需要使用多組密鑰才能讓 GKE 應用程式連線至您的 Cloud SQL 執行個體;一組是用於執行個體層級存取權 (連線),另外兩組則是用於資料庫存取權。如要進一步瞭解這兩個層級的存取權控管相關資訊,請參閱執行個體存取權控管

    1. 如要為執行個體層級存取權建立密鑰,請提供建立服務帳戶時下載的金鑰所存放的位置:

      kubectl create secret generic cloudsql-oauth-credentials --from-file=credentials.json=[PATH_TO_CREDENTIAL_FILE]
      
    2. 建立資料庫存取權所需的密鑰:

      kubectl create secret generic cloudsql --from-literal=username=[PROXY_USERNAME] --from-literal=password=[PASSWORD]
      
  9. 擷取 Cloud SQL Proxy 的公開 Docker 映像檔。

    docker pull b.gcr.io/cloudsql-docker/gce-proxy:1.05
    
  10. 建立 Docker 映像檔,並將 <your-project-id> 替換為您的專案 ID。

    docker build -t gcr.io/<your-project-id>/polls .
    
  11. docker 設為使用 gcloud 當做憑證輔助程式,以便將映像檔推送至 Google Container Registry

    gcloud auth configure-docker
    
  12. 推送 Docker 映像檔,並將 <your-project-id> 替換為您的專案 ID。

    docker push gcr.io/<your-project-id>/polls
    
  13. 建立 GKE 資源:

    kubectl create -f polls.yaml
    
  14. 建立資源後,叢集中應該會有三個 polls pod,請檢查這些 pod 的狀態:

    kubectl get pods
    

    稍候幾分鐘,等待 pod 狀態變為 Running。如果 pod 無法就緒,或者系統顯示重新啟動,您可以檢視特定 pod 的記錄,瞭解發生了什麼問題:

    kubectl logs <your-pod-id>
    

查看應用程式在 GCP 中的執行狀態

pod 就緒後,您會取得負載平衡器的公開 IP 位址:

kubectl get services polls

請透過瀏覽器前往 EXTERNAL-IP 位址,以查看 Django 的基本到達網頁,並存取管理控制台。

瞭解程式碼

Django 範例應用程式是以標準 Django 工具建立。以下指令將建立專案及意見調查應用程式:

django-admin startproject mysite
python manage.py startapp polls

settings.py 包含 SQL 資料庫設定:

DATABASES = {
    'default': {
        # If you are using Cloud SQL for MySQL rather than PostgreSQL, set
        # 'ENGINE': 'django.db.backends.mysql' instead of the following.
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'polls',
        'USER': os.getenv('DATABASE_USER'),
        'PASSWORD': os.getenv('DATABASE_PASSWORD'),
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

polls.yaml 檔案會指定兩項 Kubernetes 資源,第一項是為 Django 網路應用程式定義一致名稱和私人 IP 位址的服務,第二項則是具有公開外部 IP 位址的 HTTP 負載平衡器

# The polls service provides a load-balancing proxy over the polls app
# pods. By specifying the type as a 'LoadBalancer', Container Engine will
# create an external HTTP load balancer.
# For more information about Services see:
#   https://cloud.google.com/container-engine/docs/services/
# For more information about external HTTP load balancing see:
#   https://cloud.google.com/container-engine/docs/load-balancer
apiVersion: v1
kind: Service
metadata:
  name: polls
  labels:
    app: polls
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: polls

這項服務會提供網路名稱和 IP 位址,GKE pod 則會在服務背景執行應用程式的程式碼。另外,polls.yaml 檔案會指定為 GKE pod 提供陳述式更新的部署作業。這項服務會將其選擇工具和部署作業的標籤進行配對,以便將流量導向部署作業。就這個範例而言,系統會將 polls 選擇工具和 polls 標籤配對。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: polls
  labels:
    app: polls
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: polls
    spec:
      containers:
      - name: polls-app
        # Replace  with your project ID or use `make template`
        image: gcr.io/<your-project-id>/polls
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        env:
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: username
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: password
        ports:
        - containerPort: 8080

      - image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                  "-instances=<your-cloudsql-connection-string>=tcp:5432",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir:
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁