在 GKE 上執行的 Django 應用程式會根據流量動態調度資源。
本教學課程假設您熟悉 Django 網頁開發作業。如果您是 Django 開發新手,建議先完成「編寫第一個 Django 應用程式」教學課程,再繼續操作。
本教學課程以 Django 為例,但您也可以將這個部署程序用於其他以 Django 為基礎的架構,例如 Wagtail 和 Django CMS。
本教學課程使用 Django 5,至少需要 Python 3.10。另外您也必須安裝 Docker。
目標
在這個教學課程中,您將執行下列操作:
- 建立並連線至 Cloud SQL 資料庫。
- 建立及使用 Kubernetes Secret 值。
- 將 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, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). 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, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). 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 Auth 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 Auth Proxy。
開始前,請先判斷機器的架構。
如果是在 Linux 或 Mac 上執行,可以執行下列指令來找出這個檔案:
uname -a
Linux 64 位元
- 下載 Cloud SQL Auth Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.linux.amd64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Linux 32 位元
- 下載 Cloud SQL Auth Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.linux.386
- 如果找不到
curl指令,請執行sudo apt install curl並重複下載指令。 - 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
macOS 64 位元
- 下載 Cloud SQL Auth Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/cloud-sql-proxy.darwin.amd64
- 將 Cloud SQL 驗證 Proxy 設為允許執行:
chmod +x cloud-sql-proxy
Mac M1
- 下載 Cloud SQL Auth Proxy:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.0/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.26.0/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.26.0/cloud-sql-proxy.x86.exe 上按一下滑鼠右鍵,然後選取「另存連結為」,即可下載 Cloud SQL Auth Proxy。將檔案重新命名為cloud-sql-proxy.exe。Cloud SQL Auth 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.26.0
其他 OS
如要使用未列出的作業系統,可以從來源編譯 Cloud SQL Auth Proxy。你可以選擇將下載內容移至常見位置,例如
PATH上的位置或主目錄。如果您選擇這麼做,請記得在稍後啟動 Cloud SQL Auth Proxy 時,使用cloud-sql-proxy指令參照您選擇的位置。- 下載 Cloud SQL Auth Proxy:
建立後端服務
本教學課程使用多項 Google Cloud 服務,提供支援已部署 Django 專案的資料庫、媒體儲存空間和密鑰儲存空間。這些服務會部署在特定區域。為提高服務間的效率,所有服務都應部署在同一個區域。如要進一步瞭解離您最近的區域,請參閱「各區域適用的產品」。
設定 PostgreSQL 適用的 Cloud SQL 執行個體
Django 官方支援多個關聯式資料庫,但對 PostgreSQL 的支援最完善。Cloud SQL 支援 PostgreSQL,因此本教學課程選擇使用這類資料庫。
以下章節說明如何為應用程式建立 PostgreSQL 執行個體、資料庫和資料庫使用者。
建立 PostgreSQL 執行個體:
控制台
前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。
點選「建立執行個體」。
按一下「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 設定
這個應用程式會以名為
polls的單一 Kubernetes 設定表示。在polls.yaml中,將<your-project-id>替換為您的Google Cloud 專案 ID (PROJECT_ID)。執行下列指令,並記下
connectionName的值:gcloud sql instances describe INSTANCE_NAME --format "value(connectionName)"在
polls.yaml檔案中,將<your-cloudsql-connection-string>替換為connectionName值。
在本機電腦上執行應用程式
設定好後端服務後,您現在可以在電腦上執行應用程式。這個設定可進行本機開發、建立超級使用者,以及套用資料庫遷移作業。
在另一個終端機中啟動 Cloud SQL Auth Proxy:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAMEWindows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAME這個步驟會建立本機電腦與 Cloud SQL 執行個體的連線,以進行本機測試。在本機測試應用程式時,請持續執行 Cloud SQL Auth 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]替換為您的 bucket 名稱:http://storage.googleapis.com/PROJECT_ID_MEDIA_BUCKET/static/
設定 GKE
如要初始化 GKE,請前往「Clusters」(叢集) 頁面。
在專案中首次使用 GKE 時,您需要等待「Kubernetes Engine 準備就緒。「這可能需要一分鐘以上」訊息才會消失。
-
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. 「這項作業會在一分鐘內完成」訊息才會消失。
建立叢集後,請使用
kubectl指令列工具 (已與 gcloud CLI 整合),與 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.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 工具建立。下列指令會建立專案和 polls 應用程式:
django-admin startproject mysite
python manage.py startapp polls
基本檢視畫面、模型和路徑設定是從「編寫第一個 Django 應用程式」(第 1 部分和第 2 部分) 複製而來。
資料庫配置
settings.py 包含 SQL 資料庫的設定:
Kubernetes Pod 設定
polls.yaml 檔案會指定兩項 Kubernetes 資源。第一個是 Service,可為 Django 網頁應用程式定義一致的名稱和內部 IP 位址。第二個是 HTTP 負載平衡器,具有面向公眾的外部 IP 位址。
這項服務會提供網路名稱和 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