使用 Persistent Disk 和 Cloud SQL 在 GKE 中部署 WordPress

本教學課程說明如何使用 MySQL 資料庫,在 Google Kubernetes Engine (GKE) 中設定單一備用資源 WordPress 部署項目。您可以使用 Cloud SQL (提供代管的 MySQL 版本),不必安裝 MySQL。WordPress 會使用 PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC) 儲存資料。

PV 代表叢集中的儲存空間磁碟區,由管理員佈建,或由 Kubernetes 動態佈建,以滿足 PVC 中的要求。PVC 是使用者對特定儲存空間級別的儲存空間要求,可由 PV 滿足。PV 和 PVC 不受 Pod 生命週期影響,且在重新啟動、重新排程,甚至是刪除 Pod 時,仍會保留資料。WordPress 會使用永久磁碟做為儲存空間,支援 PV。

背景

WordPress 是網誌工具,會使用關聯式資料庫儲存網誌文章及其相關物件和中繼資料,並使用本機檔案系統儲存素材資源,例如網誌文章中的圖片。本教學課程使用 Docker Hub 的官方 WordPress Docker 映像檔。

一般來說,容器的根檔案系統不適合儲存永久資料。您在 GKE 上執行的容器通常是可拋棄的實體,如果節點故障或其他原因導致容器無法使用,叢集管理員可以刪除、逐出或重新排程任何容器。節點故障時,儲存至容器根檔案系統的所有資料都會遺失。

使用由 Persistent Disk 支援的 PV,即可將 WordPress 平台資料儲存在容器外。這樣一來,即使刪除容器,資料仍會保留。使用預設儲存空間級別時,如果 Pod 重新排程至其他節點,永久磁碟 (以及資料) 不會隨 Pod 一起移動。移動資料的方式有很多種,但這不在本教學課程的範圍內。詳情請參閱「使用 Persistent Disk 的永久磁碟區」。

WordPress 需要 PV 來儲存資料。在本教學課程中,您將使用預設儲存空間級別動態建立 Persistent Disk,並為 Deployment 建立 PVC。

目標

  • 建立 GKE 叢集。
  • 建立由永久磁碟支援的 PV 和 PVC。
  • 建立 MySQL 適用的 Cloud SQL 執行個體。
  • 部署 WordPress。
  • 設定 WordPress 網誌。

費用

在本文件中,您會使用下列 Google Cloud計費元件:

您可以使用 Pricing Calculator,根據預測用量估算費用。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. 在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

    Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。

  4. 在 Cloud Shell 中啟用 GKE 和 Cloud SQL Admin API:
    gcloud services enable container.googleapis.com sqladmin.googleapis.com
    

設定環境

  1. 在 Cloud Shell 中,設定 Google Cloud CLI 的預設區域:

    gcloud config set compute/region region
    

    更改下列內容:

  2. 將 PROJECT_ID 環境變數設為Google Cloud 專案 ID (project-id)。

    export PROJECT_ID=project-id
    

  3. 從 GitHub 存放區下載應用程式資訊清單檔案:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 切換至含有 wordpress-persistent-disks 檔案的目錄:

    cd kubernetes-engine-samples/quickstarts/wordpress-persistent-disks
    
  5. 設定 WORKING_DIR 環境變數:

    WORKING_DIR=$(pwd)
    

    在本教學課程中,您會使用 YAML 格式的資訊清單檔案建立 Kubernetes 物件。

建立 GKE 叢集

建立 GKE 叢集,用於託管 WordPress 應用程式容器。

  • 在 Cloud Shell 中,建立名為 persistent-disk-tutorial 的 GKE 叢集:

    CLUSTER_NAME=persistent-disk-tutorial
    gcloud container clusters create-auto $CLUSTER_NAME
    

    建立後,請連線至新叢集:

    gcloud container clusters get-credentials $CLUSTER_NAME --location REGION
    

建立由 Persistent Disk 支援的 PV 和 PVC

建立 PVC,做為 WordPress 所需的儲存空間。GKE 預設會安裝 StorageClass 資源,讓您動態佈建由 Persistent Disk 支援的 PV。您可以使用 wordpress-volumeclaim.yaml 檔案建立部署作業所需的 PVC。

這個資訊清單檔案說明要求 200 GB 儲存空間的 PVC。檔案中未定義 StorageClass 資源,因此這個 PVC 會使用預設的 StorageClass 資源,佈建由永久磁碟支援的 PV。

  1. 在 Cloud Shell 中部署資訊清單檔案:

    kubectl apply -f $WORKING_DIR/wordpress-volumeclaim.yaml
    

    系統最多可能需要 10 秒,才能佈建由永久磁碟支援的 PV,並將其繫結至 PVC。您可以使用下列指令檢查狀態:

    kubectl get persistentvolumeclaim
    

    輸出內容會顯示狀態為 Pending 的 PersistentVolumeClaim,大致如下:

    NAME                    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    wordpress-volumeclaim   Pending                                      standard-rwo   5s
    

    在本教學課程中,您稍後會用到這個 PersistentVolumeClaim,因此該物件會維持在 Pending 狀態。

建立 MySQL 適用的 Cloud SQL 執行個體

  1. 在 Cloud Shell 中建立名為 mysql-wordpress-instance 的執行個體:

    INSTANCE_NAME=mysql-wordpress-instance
    gcloud sql instances create $INSTANCE_NAME
    
  2. 將執行個體連線名稱新增為環境變數:

    export INSTANCE_CONNECTION_NAME=$(gcloud sql instances describe $INSTANCE_NAME \
        --format='value(connectionName)')
    
  3. 為 WordPress 建立資料庫,以便儲存資料:

    gcloud sql databases create wordpress --instance $INSTANCE_NAME
    
  4. 建立名為 wordpress 的資料庫使用者,並為 WordPress 設定密碼,以驗證執行個體:

    CLOUD_SQL_PASSWORD=$(openssl rand -base64 18)
    gcloud sql users create wordpress --host=% --instance $INSTANCE_NAME \
        --password $CLOUD_SQL_PASSWORD
    

    如果關閉 Cloud Shell 工作階段,密碼就會遺失。請記下密碼,稍後在教學課程中會用到。

您已完成新 WordPress 網誌的資料庫設定。

部署 WordPress

您必須先建立服務帳戶,才能部署 WordPress。您需要建立 Kubernetes Secret 來保存服務帳戶憑證,並建立另一個 Secret 來保存資料庫憑證。

設定服務帳戶並建立密鑰

  1. 如要讓 WordPress 應用程式透過 Cloud SQL Proxy 存取 MySQL 執行個體,請建立服務帳戶:

    SA_NAME=cloudsql-proxy
    gcloud iam service-accounts create $SA_NAME --display-name $SA_NAME
    
  2. 將服務帳戶電子郵件地址新增為環境變數:

    SA_EMAIL=$(gcloud iam service-accounts list \
        --filter=displayName:$SA_NAME \
        --format='value(email)')
    
  3. 將 cloudsql.client 角色新增至服務帳戶:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  4. 為服務帳戶建立金鑰:

    gcloud iam service-accounts keys create $WORKING_DIR/key.json \
        --iam-account $SA_EMAIL
    

    這個指令會下載 key.json 檔案的副本。

  5. 為 MySQL 憑證建立 Kubernetes Secret:

    kubectl create secret generic cloudsql-db-credentials \
        --from-literal username=wordpress \
        --from-literal password=$CLOUD_SQL_PASSWORD
    
  6. 為服務帳戶憑證建立 Kubernetes Secret:

    kubectl create secret generic cloudsql-instance-credentials \
        --from-file $WORKING_DIR/key.json
    

部署 WordPress

下一步是在 GKE 叢集中部署 WordPress 容器。

wordpress_cloudsql.yaml 資訊清單檔案會說明 Deployment,該 Deployment 會建立執行容器的單一 Pod,其中包含 WordPress 執行個體。這個容器會讀取含有您建立的 cloudsql-db-credentials 密鑰的 WORDPRESS_DB_PASSWORD 環境變數。

這個資訊清單檔案也會設定 WordPress 容器,透過在邊車容器中執行的 Cloud SQL Proxy 與 MySQL 通訊。主機位址值是在 WORDPRESS_DB_HOST 環境變數中設定。

  1. 準備檔案,方法是取代 INSTANCE_CONNECTION_NAME 環境變數:

    cat $WORKING_DIR/wordpress_cloudsql.yaml.template | envsubst > \
        $WORKING_DIR/wordpress_cloudsql.yaml
    
  2. 部署 wordpress_cloudsql.yaml 資訊清單檔案:

    kubectl create -f $WORKING_DIR/wordpress_cloudsql.yaml
    

    將這個資訊清單檔案部署到連結至運算節點的 Persistent Disk,需要幾分鐘的時間。

  3. 觀看部署作業,查看狀態是否變更為 running:

    kubectl get pod -l app=wordpress --watch
    

    如果輸出內容顯示 Running 狀態,即可繼續執行下一個步驟。

    NAME                     READY     STATUS    RESTARTS   AGE
    wordpress-387015-02xxb   2/2       Running   0          2m47s
    

公開 WordPress 服務

在上一個步驟中,您部署了 WordPress 容器,但目前無法從叢集外部存取,因為該容器沒有外部 IP 位址。您可以建立並設定附加外部負載平衡器的 Kubernetes 服務,將 WordPress 應用程式公開至網際網路流量。如要進一步瞭解如何在 GKE 中使用服務公開應用程式,請參閱使用指南。

  1. 建立 type:LoadBalancer 的服務:

    kubectl create -f $WORKING_DIR/wordpress-service.yaml
    

    建立負載平衡器需要幾分鐘的時間。

  2. 監控部署作業,等待系統為服務指派外部 IP 位址:

    kubectl get svc -l app=wordpress --watch
    
  3. 輸出內容顯示外部 IP 位址後,即可繼續執行下一個步驟。請注意,您的外部 IP 與下列範例不同。

    NAME        CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
    wordpress   10.51.243.233   203.0.113.3    80:32418/TCP   1m
    
  4. 請記下 EXTERNAL_IP 位址欄位,稍後會用到。

設定 WordPress 網誌

在本節中,您將設定 WordPress 網誌。

  1. 在瀏覽器中前往下列網址,並將 external-ip-address 替換為公開 WordPress 執行個體的服務 EXTERNAL_IP 位址:

    http://external-ip-address
    
  2. 在「WordPress installation」(WordPress 安裝) 頁面選取語言,然後按一下「Continue」(繼續)。

  3. 填寫「Information needed」(所需資訊) 頁面,然後按一下「Install WordPress」(安裝 WordPress)。

  4. 按一下 [Login] (登入)。

  5. 輸入先前建立的使用者名稱和密碼。

  6. 你現在擁有一個網誌網站。如要造訪網誌,請在瀏覽器中前往下列網址:

    http://external-ip-address
    

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

刪除個別資源

如果您使用現有專案,但不想刪除專案,請刪除個別資源。

  1. 刪除服務:

    kubectl delete service wordpress
    

    等待為 wordpress 服務佈建的負載平衡器刪除完成。負載平衡器會在背景以非同步方式刪除。

    觀看刪除程序:

    watch gcloud compute forwarding-rules list
    

    看到下列輸出內容時,表示負載平衡器已刪除:

    Listed 0 items.
    
  2. 刪除部署作業:

    kubectl delete deployment wordpress
    
  3. 刪除 WordPress 的 PVC:

    kubectl delete pvc wordpress-volumeclaim
    

    這個指令也會自動刪除 PV 和永久磁碟。

  4. 刪除 GKE 叢集:

    gcloud container clusters delete $CLUSTER_NAME --location=$REGION
    
  5. 刪除 Cloud SQL 執行個體:

    gcloud sql instances delete $INSTANCE_NAME
    
  6. 從服務帳戶中移除角色:

    gcloud projects remove-iam-policy-binding $PROJECT_ID \
        --role roles/cloudsql.client \
        --member serviceAccount:$SA_EMAIL
    
  7. 刪除服務帳戶:

    gcloud iam service-accounts delete $SA_EMAIL
    

後續步驟