在 GKE 上執行的 Django 應用程式會根據流量動態調整規模。
本教學課程假設您已熟悉 Django 網路開發流程,如果您是 Django 開發新手,建議先完成編寫第一個 Django 應用程式,再繼續進行後續步驟。
本教學課程以 Django 為例,但您也可以將這個部署程序用於其他以 Django 為基礎的架構,例如 Wagtail 和 Django CMS。
本教學課程使用 Django 5,至少需要 Python 3.10。另外您也必須安裝 Docker。
目標
在這個教學課程中,您將執行下列操作:
- 建立並連線至 Cloud SQL 資料庫。
- 建立及使用 Kubernetes 密鑰值。
- 將 Django 應用程式部署至 Google Kubernetes Engine。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL, GKE and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud SQL, GKE and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init
準備環境
複製範例應用程式
Django 範例應用程式的程式碼位於 GitHub 的 GoogleCloudPlatform/python-docs-samples 存放區。
您可以下載範例的 ZIP 檔案並解壓縮,也可以將存放區複製到本機電腦:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git前往包含程式碼範例的目錄:
Linux/macOS
cd python-docs-samples/kubernetes_engine/django_tutorialWindows
cd python-docs-samples\kubernetes_engine\django_tutorial
確認 Python 設定
本教學課程會使用 Python 在您的電腦上執行範例應用程式。範例程式碼也需要安裝依附元件
詳情請參閱 Python 開發環境指南。
確認 Python 版本至少為 3.10。
python -V你應該會看到
Python 3.10.0以上版本。建立 Python 虛擬環境並安裝依附元件:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txtWindows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
下載 Cloud SQL 驗證 Proxy,從本機連線至 Cloud SQL
部署作業完成後,應用程式會使用 Google Kubernetes Engine 環境內建的 Cloud SQL Auth Proxy 與您的 Cloud SQL 執行個體進行通訊。不過,如要在本機測試應用程式,您就必須在開發環境安裝並使用 Proxy 本機副本。詳情請參閱 Cloud SQL Auth Proxy 指南。
Cloud SQL Auth Proxy 會使用 Cloud SQL API 與 SQL 執行個體互動。為此,應用程式必須透過 gcloud CLI 進行驗證。
驗證並取得 API 的憑證:
gcloud auth application-default login在本機下載並安裝 Cloud SQL 驗證 Proxy。
Linux 64 位元
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.amd64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Linux 32 位元
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.linux.386
- 如果找不到
curl指令,請執行sudo apt install curl,然後重複下載指令。 - 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
macOS 64 位元
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.amd64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Mac M1
- 下載 Cloud SQL 驗證 Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.darwin.arm64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Windows 64 位元
在 https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x64.exe 上按一下滑鼠右鍵,然後選取「另存連結為」來下載 Cloud SQL Auth Proxy。將檔案重新命名為cloud-sql-proxy.exe。Windows 32 位元
在 https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.21.1/cloud-sql-proxy.x86.exe 上按一下滑鼠右鍵,然後選取「另存連結為」,下載 Cloud SQL Auth Proxy。將檔案重新命名為cloud-sql-proxy.exe。Cloud SQL 驗證 Proxy Docker 映像檔
Cloud SQL 驗證 Proxy 有不同的容器映像檔,例如
distroless、alpine和buster。預設的 Cloud SQL Auth Proxy 容器映像檔使用distroless,其中不含任何殼層。如需殼層或相關工具,請根據alpine或buster下載映像檔。詳情請參閱「Cloud SQL Auth Proxy 容器映像檔」。您可以使用下列指令,透過 Docker 將最新映像檔提取至本機電腦:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.21.1
其他 OS
如果您的作業系統不在上述說明內,可以從原始碼編譯 Cloud SQL Auth Proxy。您可以選擇將下載內容移至常見位置,例如
PATH上的位置或主目錄。如果您選擇這麼做,請務必在稍後啟動 Cloud SQL 驗證 Proxy 時,使用cloud-sql-proxy指令參照您選擇的位置。- 下載 Cloud SQL 驗證 Proxy:
建立後端服務
本教學課程會使用幾項 Google Cloud 服務,提供支援已部署 Django 專案的資料庫、媒體儲存空間和密鑰儲存空間。這些服務部署在特定區域。為提高服務間的效率,所有服務都應部署在同一個區域。如要進一步瞭解您所在地區附近的區域,請參閱「各區域適用的產品」。
設定 PostgreSQL 適用的 Cloud SQL 執行個體
Django 官方支援多個關聯式資料庫,但對 PostgreSQL 的支援度最高。Cloud SQL 支援 PostgreSQL,因此本教學課程選擇使用這類資料庫。
以下章節說明如何為應用程式建立 PostgreSQL 執行個體、資料庫和資料庫使用者。
建立 PostgreSQL 執行個體:
控制台
前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。
點選「建立執行個體」。
按一下「Choose PostgreSQL」(選擇 PostgreSQL)。
在「SQL 版本」部分,選擇「Enterprise」。
在「版本預設設定」中,選擇「沙箱」。
在「Instance ID」(執行個體 ID) 欄位中輸入
INSTANCE_NAME。輸入 postgres 使用者的密碼。
其他欄位皆使用預設值。
點選「建立執行個體」。
執行個體會在幾分鐘內準備就緒。
gcloud
建立 PostgreSQL 執行個體:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_16 \ --tier db-n1-standard-2 \ --region REGION
更改下列內容:
INSTANCE_NAME:Cloud SQL 執行個體名稱PROJECT_ID: Google Cloud 專案 IDREGION:Google Cloud 區域
建立執行個體並準備就緒需要幾分鐘的時間。
在建立的執行個體中建立資料庫:
控制台
- 在執行個體頁面中,前往「資料庫」分頁。
- 按一下 [Create database] (建立資料庫)。
- 在「Database Name」(資料庫名稱) 對話方塊中輸入
DATABASE_NAME。 - 點選「建立」。
gcloud
在最近建立的執行個體中建立資料庫:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME將
DATABASE_NAME替換為執行個體內的資料庫名稱。
建立資料庫使用者:
控制台
- 在執行個體頁面中,前往「Users」(使用者) 分頁。
- 點選「新增使用者帳戶」。
- 在「內建驗證」下方的「選擇驗證方式」對話方塊中:
- 輸入使用者名稱
DATABASE_USERNAME。 - 輸入「
DATABASE_PASSWORD」的密碼 - 按一下「新增」。
gcloud
在最近建立的執行個體中建立使用者:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORD將
PASSWORD替換為安全密碼。
建立服務帳戶
Proxy 需要具有您 Cloud SQL 執行個體編輯者權限的服務帳戶。如要進一步瞭解服務帳戶,請參閱Google Cloud 驗證總覽。
- 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
- 選取含有 Cloud SQL 執行個體的專案。
- 按一下「建立服務帳戶」。
- 在「Service account name」(服務帳戶名稱) 欄位中,輸入服務帳戶的描述性名稱。
- 將「服務帳戶 ID」變更為可辨識的專屬值,然後按一下「建立並繼續」。
-
按一下「選取角色」欄位,然後選取下列其中一個角色:
- Cloud SQL > Cloud SQL 用戶端
- Cloud SQL > Cloud SQL 編輯者
- Cloud SQL > Cloud SQL 管理員
- 按一下「Done」(完成),即完成建立服務帳戶。
- 按一下新服務帳戶的動作選單,然後選取「管理金鑰」。
- 點選「Add key」(新增金鑰) 下拉式選單,然後點選「Create new key」(建立新的金鑰)。
-
確認金鑰類型為 JSON,然後按一下「建立」。
私密金鑰檔案會下載到您的機器中,您可以將它移到其他位置。請妥善保護這個金鑰檔案。
進行資料庫設定
使用下列指令設定資料庫存取權的環境變數。 這些環境變數用於本機測試。
Linux/MacOS
export DATABASE_NAME=DATABASE_NAME
export DATABASE_USER=DATABASE_USERNAME
export DATABASE_PASSWORD=DATABASE_PASSWORD
Windows
set DATABASE_USER=DATABASE_USERNAME
set DATABASE_PASSWORD=DATABASE_PASSWORD
設定 GKE 設定
這個應用程式會以單一 Kubernetes 設定顯示,名稱為
polls。在polls.yaml中,將<your-project-id>替換為您的專案 ID (PROJECT_ID)。Google Cloud執行下列指令,並記下
connectionName的值:gcloud sql instances describe INSTANCE_NAME --format "value(connectionName)"在
polls.yaml檔案中,將<your-cloudsql-connection-string>替換為connectionName值。
在本機電腦上執行應用程式
設定支援服務後,您現在可以在電腦上執行應用程式。這個設定可進行本機開發、建立超級使用者,以及套用資料庫遷移作業。
在另一個終端機中啟動 Cloud SQL 驗證 Proxy:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAMEWindows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME這個步驟會將本機電腦連線至 Cloud SQL 執行個體,以利進行本機測試。在本機測試應用程式期間,請讓 Cloud SQL 驗證 Proxy 全程保持運作。在另一個終端機中執行這項程序,即可在程序執行期間繼續工作。
在原始終端機中,於本機設定專案 ID:
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_IDWindows
set GOOGLE_CLOUD_PROJECT=PROJECT_ID執行 Django 遷移作業,設定模型和資產:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstatic啟動 Django 網路伺服器:
python manage.py runserver 8080在瀏覽器中前往 http://localhost:8080。
如果您使用 Cloud Shell,請按一下「網頁預覽」按鈕,然後選取「透過以下通訊埠預覽:8080」。
該頁面會顯示以下文字:「Hello, world. 你位於意見調查索引頁面。在您電腦上執行的 Django 網路伺服器會提供範例應用程式頁面。
按下
Ctrl/Cmd+C停止本機網路伺服器。
使用 Django 管理控制台
如要登入 Django 的管理控制台,您必須建立超級使用者。由於您在本機可存取資料庫連線,因此可以執行管理指令:
建立超級使用者。系統會提示您輸入使用者名稱、電子郵件地址和密碼。
python manage.py createsuperuser啟動本機網路伺服器:
python manage.py runserver透過瀏覽器前往 http://localhost:8000/admin。
使用您在執行
createsuperuser時建立的使用者名稱及密碼登入管理員網站。
將應用程式部署至 GKE
將應用程式部署至 Google Cloud時,應用程式會使用 Gunicorn 伺服器。Gunicorn 不提供靜態內容,所以應用程式會使用 Cloud Storage 提供靜態內容。
收集及上傳靜態資源
建立 Cloud Storage bucket,並設為可公開讀取。
gcloud storage buckets create gs://PROJECT_ID_MEDIA_BUCKET gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID_MEDIA_BUCKET --member=allUsers role=roles/storage.legacyObjectReader將所有本機靜態內容收集至單一資料夾:
python manage.py collectstatic將靜態內容上傳至 Cloud Storage:
gcloud storage rsync ./static gs://PROJECT_ID_MEDIA_BUCKET/static --recursive在
mysite/settings.py中將STATIC_URL的值設為下列網址,並將[YOUR_GCS_BUCKET]替換為您的值區名稱:http://storage.googleapis.com/PROJECT_ID_MEDIA_BUCKET/static/
設定 GKE
如要初始化 GKE,請前往「Clusters」(叢集) 頁面。
在專案中首次使用 GKE 時,您需要等待「Kubernetes Engine is getting ready. This may take a minute or more」訊息消失。
-
gcloud container clusters create polls \ --scopes "https://www.googleapis.com/auth/userinfo.email","cloud-platform" \ --num-nodes 4 --zone "us-central1-a"如果出現類似
Project is not fully initialized with the default service accounts的錯誤訊息,您可能需要初始化 Google Kubernetes Engine。初始化 GKE
如果系統顯示錯誤訊息,請前往 Google Cloud 主控台,將您專案中的 GKE 初始化。
等待「Kubernetes Engine is getting ready. This can take a minute or more」訊息消失。
建立叢集之後,請使用與 gcloud CLI 整合的
kubectl指令列工具,與 GKE 叢集互動。因為gcloud和kubectl是各自獨立的工具,請務必妥善設定kubectl,以便和正確的叢集互動。gcloud container clusters get-credentials polls --zone "us-central1-a"
設定 Cloud SQL
您需要使用多組密鑰才能讓 GKE 應用程式連線至您的 Cloud SQL 執行個體;一組是用於執行個體層級存取權 (連線),另外兩組則是用於資料庫存取權。如要進一步瞭解這兩個層級的存取權控管相關資訊,請參閱執行個體存取權控管。
如要為執行個體層級存取權建立密鑰,請提供建立服務帳戶時下載的 JSON 服務帳戶金鑰位置
PATH_TO_CREDENTIAL_FILE(請參閱「建立服務帳戶」一節):kubectl create secret generic cloudsql-oauth-credentials \ --from-file=credentials.json=PATH_TO_CREDENTIAL_FILE如要建立資料庫存取密鑰,請使用您在建立後端服務時定義的 SQL 資料庫、使用者名稱和密碼。請參閱「設定 PostgreSQL 適用的 Cloud SQL 執行個體」:
kubectl create secret generic cloudsql \ --from-literal=database=DATABASE_NAME \ --from-literal=username=DATABASE_USERNAME \ --from-literal=password=DATABASE_PASSWORD
擷取 Cloud SQL Proxy 的公開 Docker 映像檔。
docker pull b.gcr.io/cloudsql-docker/gce-proxy建立 Docker 映像檔,並將
<your-project-id>替換為您的專案 ID。docker build -t gcr.io/PROJECT_ID/polls .將 Docker 設為使用
gcloud當做憑證輔助程式,以便將映像檔推送至 Container Registry:gcloud auth configure-docker推送 Docker 映像檔,將
<your-project-id>替換為專案 ID。docker push gcr.io/PROJECT_ID/polls建立 GKE 資源:
,則必須更新kubectl create -f polls.yamlpolls.yaml檔案,以符合這些新名稱。
將應用程式部署至 GKE
建立資源後,叢集中會有三個 polls pod。請檢查這些 pod 的狀態:
kubectl get pods
稍候幾分鐘,等待 pod 狀態顯示為 Running。如果 pod 無法就緒,或者系統顯示重新啟動,您可以檢視特定 pod 的記錄,瞭解發生了什麼問題。[YOUR-POD-ID] 是先前 kubectl get pods 指令傳回的輸出內容。
kubectl logs [YOUR_POD_ID]
查看在 Google Cloud中執行的應用程式
pod 就緒後,您會取得負載平衡器的外部 IP 位址:
kubectl get services polls
記下 EXTERNAL-IP 位址,然後在瀏覽器中前往 http://[EXTERNAL-IP],查看 Django 投票到達網頁並存取管理員控制台。
瞭解程式碼
應用程式範例
Django 範例應用程式是以標準 Django 工具建立。以下指令將建立專案及意見調查應用程式:
django-admin startproject mysite
python manage.py startapp polls
基本檢視區塊、模型和路徑設定是從「編寫第一個 Django 應用程式」(第 1 部分和第 2 部分) 複製而來。
資料庫配置
settings.py 包含 SQL 資料庫設定:
Kubernetes Pod 設定
polls.yaml 檔案會指定兩項 Kubernetes 資源,第一項是為 Django 網路應用程式定義一致名稱和內部 IP 位址的服務,第二項則是具有公開外部 IP 位址的 HTTP 負載平衡器。
這項服務會提供網路名稱和 IP 位址,GKE pod 則會在服務背景執行應用程式的程式碼。另外,polls.yaml 檔案會指定為 GKE pod 提供宣告式更新的部署作業。這項服務會將其選取器和部署作業的標籤進行配對,以便將流量導向部署作業。就這個範例而言,系統會將 polls 選擇工具和 polls 標籤配對。
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除個別資源
如果不想刪除專案,請刪除個別資源。
刪除 Google Kubernetes Engine 叢集:
gcloud container clusters delete polls刪除您推送至 Container Registry 的 Docker 映像檔:
gcloud container images delete gcr.io/PROJECT_ID/polls刪除 Cloud SQL 執行個體:
gcloud sql instances delete INSTANCE_NAME
後續步驟
- 瞭解如何設定 PostgreSQL 以供正式環境使用
- 進一步瞭解 Django on Google Cloud