使用 GKE Data Cache 加快有狀態工作負載的讀取效能


本指南說明如何在 Google Kubernetes Engine (GKE) 叢集中使用 GKE 資料快取,提升讀取密集型有狀態應用程式的效能。GKE 資料快取是受管理區塊儲存空間解決方案,可加快在 GKE 上執行的有狀態應用程式 (例如資料庫) 的讀取作業。

資料快取只能搭配 GKE Standard 叢集使用。本指南將逐步說明如何啟用 GKE Data Cache,包括建立新的 GKE Standard 叢集或節點集區,以及佈建具有 Data Cache 加速功能的 GKE 附加磁碟。

關於 GKE 資料快取

透過 GKE 資料快取,您可以在 GKE 節點上使用本機 SSD 做為永久儲存空間 (例如永久磁碟或 Hyperdisk) 的快取層。使用本機 SSD 可縮短磁碟讀取延遲時間,並提高有狀態工作負載的每秒查詢次數 (QPS),同時盡量減少記憶體需求。GKE Data Cache 支援所有類型的永久磁碟Hyperdisk 做為備份磁碟。

如要為應用程式使用 GKE Data Cache,請設定已連結本機 SSD 的 GKE 節點集區。您可以將 GKE 資料快取設定為使用所有或部分連結的本機 SSD。GKE 資料快取解決方案使用的本機 SSD 會使用標準加密方式加密靜態資料 Google Cloud

優點

GKE 資料快取具備下列優勢:

  • 提高傳統資料庫 (例如 MySQL 或 Postgres) 和向量資料庫每秒處理的查詢率。
  • 盡量縮短磁碟延遲時間,提升有狀態應用程式的讀取效能。
  • 由於 SSD 位於節點本機,因此資料補水和補水速度更快。資料補水是指從永久儲存空間將必要資料載入本機 SSD 的初始程序。資料重整是指節點回收後,還原本機 SSD 資料的程序。

部署架構

下圖顯示 GKE 資料快取設定範例,其中有兩個 Pod 各自執行一個應用程式。這些 Pod 在同一個 GKE 節點上執行。每個 Pod 都會使用個別的本機 SSD 和備份永久磁碟。

GKE Data Cache 的部署架構
圖 1. GKE Data Cache 的部署架構。

部署模式

您可以透過下列兩種模式設定 GKE 資料快取:

  • 直寫 (建議):應用程式寫入資料時,資料會同步寫入快取和基礎永久磁碟。writethrough 模式可避免資料遺失,適用於大多數實際運作工作負載。
  • 回寫:應用程式寫入資料時,資料只會寫入快取。接著,資料會非同步寫入永久磁碟 (在背景中)。writeback 模式可提升寫入效能,適合需要速度的工作負載。但這個模式會影響可靠性。如果節點意外關閉,未排清的快取資料就會遺失。

目標

本指南將說明如何:

需求條件和規劃

請確認您符合下列使用 GKE 資料快取的規定:

  • GKE 叢集必須執行 1.32.3-gke.1440000 以上版本。
  • 節點集區必須使用支援本機 SSD 的機型。詳情請參閱支援的機器系列

規劃

規劃 GKE 資料快取儲存容量時,請考慮下列事項:

  • 每個節點可同時使用 GKE 資料快取的 Pod 數量上限。
  • 預計會使用 GKE 資料快取的 Pod 快取大小需求。
  • GKE 節點上可用的本機 SSD 總容量。 如要瞭解哪些機器類型預設會附加本機 SSD,以及哪些機器類型需要您附加本機 SSD,請參閱「選擇有效的本機 SSD 磁碟數量」。
  • 如果是第三代或更新的機型 (預設會附加一定數量的本機 SSD),請注意,資料快取的本機 SSD 是從該機器的可用總數中保留。
  • 檔案系統的額外負荷,可能會減少本機 SSD 的可用空間。舉例來說,即使節點有兩個本機 SSD,總原始容量為 750 GiB,但由於檔案系統的負擔,所有資料快取磁碟區的可用空間可能較少。部分本機 SSD 容量保留給系統使用

定價

系統會按照本機 SSD 和所連永久磁碟的總佈建容量計費,系統會按月收取每 GiB 的費用。

詳情請參閱 Compute Engine 說明文件中的「磁碟定價」一節。

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

設定 GKE 節點以使用資料快取

如要開始使用 GKE Data Cache 加速儲存,節點必須具備必要的本機 SSD 資源。本節說明如何使用指令,在建立新的 GKE 叢集或在現有叢集中新增節點集區時,佈建本機 SSD 並啟用 GKE 資料快取。您無法更新現有節點集區,以使用資料快取。如要在現有叢集上使用資料快取,請在叢集中新增節點集區。

於新叢集

如要建立已設定資料快取的 GKE 叢集,請使用下列指令:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --machine-type=MACHINE_TYPE \
    --data-cache-count=DATA_CACHE_COUNT \
    # Optionally specify additional Local SSDs, or skip this flag
    --ephemeral-storage-local-ssd count=LOCAL_SSD_COUNT

更改下列內容:

  • CLUSTER_NAME:叢集名稱。為要建立的 GKE 叢集提供專屬名稱。
  • LOCATION:新叢集的 Google Cloud 區域或可用區。
  • MACHINE_TYPE:叢集要使用的機器類型,可選用第二代、第三代或後續世代的機器系列,例如 n2-standard-2c3-standard-4-lssd。這是必填欄位,因為本機 SSD 無法與預設的 e2-medium 類型搭配使用。 詳情請參閱可用的機器系列
  • DATA_CACHE_COUNT:要專屬用於預設節點集區中各節點資料快取的本機 SSD 磁碟區數量。每個本機 SSD 的容量為 375 GiB。磁碟區數量上限會因機器類型和區域而異。請注意,部分本機 SSD 容量保留給系統使用
  • (選用) LOCAL_SSD_COUNT:為其他臨時儲存空間需求佈建的本機 SSD 磁碟區數量。如要佈建未用於資料快取的額外本機 SSD,請使用 --ephemeral-storage-local-ssd count 旗標。

    請注意,第三代或更新的機器類型有以下限制:

    • 第三代或更新的機器類型預設會附加特定數量的本機固態硬碟。附加至每個節點的本機 SSD 數量取決於您指定的機器類型。
    • 如果您打算使用 --ephemeral-storage-local-ssd count 標記取得額外的暫時性儲存空間,請務必將 DATA_CACHE_COUNT 的值設為小於機器上可用的本機 SSD 磁碟總數。可用的本機 SSD 總數包括預設附加的磁碟,以及您使用 --ephemeral-storage-local-ssd count 旗標新增的任何磁碟。

這個指令會建立 GKE 叢集,並為預設節點集區執行第二代、第三代或更新的機型,為資料快取佈建本機 SSD,並視需要為其他暫時性儲存空間需求佈建額外的本機 SSD。

這些設定僅適用於預設節點集區。

於現有叢集

如要在現有叢集上使用資料快取,必須建立已設定資料快取的新節點集區。

如要建立已設定資料快取的 GKE 節點集區,請使用下列指令:

gcloud container node-pool create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --machine-type=MACHINE_TYPE \
    --data-cache-count=DATA_CACHE_COUNT \
    # Optionally specify additional Local SSDs, or skip this flag
    --ephemeral-storage-local-ssd count=LOCAL_SSD_COUNT

更改下列內容:

  • NODE_POOL_NAME:節點集區的名稱。為要建立的節點集區提供專屬名稱。
  • CLUSTER_NAME:現有 GKE 叢集的名稱,您要在該叢集中建立節點集區。
  • LOCATION:與叢集相同的 Google Cloud 區域或可用區。
  • MACHINE_TYPE:叢集要使用的機器類型,可選用第二代、第三代或後續世代的機器系列,例如 n2-standard-2c3-standard-4-lssd。這是必填欄位,因為本機 SSD 無法與預設的 e2-medium 類型搭配使用。 詳情請參閱可用的機器系列
  • DATA_CACHE_COUNT:要專屬用於節點集區中各節點資料快取的本機 SSD 磁碟區數量。每個本機 SSD 的容量為 375 GiB。磁碟區數量上限會因機器類型和區域而異。請注意,部分本機 SSD 容量保留給系統使用
  • (選用) LOCAL_SSD_COUNT:為其他臨時儲存空間需求佈建的本機 SSD 磁碟區數量。如要佈建未用於資料快取的額外本機 SSD,請使用 --ephemeral-storage-local-ssd count 旗標。

    請注意,第三代或更新的機器類型有以下限制:

    • 第三代以上的機器類型預設會附加特定數量的本機固態硬碟。附加至每個節點的本機 SSD 數量取決於您指定的機器類型。
    • 如果您打算使用 --ephemeral-storage-local-ssd count 標記取得額外的暫時性儲存空間,請務必將 DATA_CACHE_COUNT 設為小於機器上可用的本機 SSD 磁碟總數。可用的本機 SSD 總數包括預設附加的磁碟,以及您使用 --ephemeral-storage-local-ssd count 旗標新增的任何磁碟。

這個指令會建立 GKE 節點集區,在第二代、第三代或更新的機型上執行,並為資料快取佈建本機 SSD,以及視需要為其他暫時性儲存空間需求佈建額外的本機 SSD。

在 GKE 上為永久儲存空間佈建資料快取

本節提供範例,說明如何為有狀態應用程式啟用 GKE 資料快取,提升效能。

建立具有本機 SSD 的節點集區,用於資料快取

首先,請在 GKE 叢集中建立新的節點集區,並附加本機 SSD。 GKE 資料快取會使用本機 SSD,加快所連結永久磁碟的效能。

下列指令會建立使用第二代機器的節點集區,n2-standard-2

gcloud container node-pools create datacache-node-pool \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --num-nodes=2 \
    --data-cache-count=1 \
    --machine-type=n2-standard-2

更改下列內容:

  • CLUSTER_NAME:叢集名稱。指定要建立新節點集區的 GKE 叢集。
  • LOCATION:與叢集相同的 Google Cloud 區域或可用區。

這項指令會建立符合下列規格的節點集區:

  • --num-nodes=2:將這個集區的節點初始數量設為兩個。
  • --data-cache-count=1:為每個節點指定一個本機 SSD,專供 GKE 資料快取使用。

這個節點集區佈建的本機 SSD 總數為兩個,因為每個節點佈建一個本機 SSD。

建立資料快取 StorageClass

建立 Kubernetes StorageClass,告知 GKE 如何動態佈建使用資料快取的永久磁碟區。

使用下列資訊清單建立並套用名為 pd-balanced-data-cache-scStorageClass

kubectl apply -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: pd-balanced-data-cache-sc
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  data-cache-mode: writethrough
  data-cache-size: "100Gi"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
EOF

資料快取 StorageClass 參數包括:

  • type:指定永久磁碟區的基礎磁碟類型。如需更多選項,請參閱支援的永久磁碟類型Hyperdisk 類型
  • data-cache-mode:使用建議的 writethrough 模式。詳情請參閱「部署模式」。
  • data-cache-size:將本機 SSD 容量設為 100 GiB,做為每個 PVC 的讀取快取。

使用 PersistentVolumeClaim (PVC) 要求儲存空間

建立參照您建立的 pd-balanced-data-cache-sc StorageClass 的 PVC。PVC 會要求啟用資料快取的永久磁碟區。

使用下列資訊清單建立名為 pvc-data-cache 的 PVC,要求至少 300 GiB 的永久磁碟區,並具備 ReadWriteOnce 存取權。

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-data-cache
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 300Gi
  storageClassName: pd-balanced-data-cache-sc
EOF

建立使用 PVC 的 Deployment

建立名為 postgres-data-cache 的 Deployment,執行使用先前建立的 pvc-data-cache PVC 的 Pod。cloud.google.com/gke-data-cache-count 節點選取器可確保 Pod 排程到具有本機 SSD 資源的節點,這些資源是使用 GKE 資料快取時的必要條件。

建立並套用下列資訊清單,設定使用 PVC 部署 Postgres 網頁伺服器的 Pod:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
 name: postgres-data-cache
 labels:
   name: database
   app: data-cache
spec:
 replicas: 1
 selector:
   matchLabels:
     service: postgres
     app: data-cache
 template:
   metadata:
     labels:
       service: postgres
       app: data-cache
   spec:
     nodeSelector:
       cloud.google.com/gke-data-cache-disk: "1"
     containers:
     - name: postgres
       image: postgres:14-alpine
       volumeMounts:
       - name: pvc-data-cache-vol
         mountPath: /var/lib/postgresql/data2
         subPath: postgres
       env:
       - name: POSTGRES_USER
         value: admin
       - name: POSTGRES_PASSWORD
         value: password
     restartPolicy: Always
     volumes:
     - name: pvc-data-cache-vol
       persistentVolumeClaim:
         claimName: pvc-data-cache
EOF

確認 Deployment 是否已成功建立:

kubectl get deployment

Postgres 容器可能需要幾分鐘才能完成佈建,並顯示 READY 狀態。

驗證資料快取佈建

建立 Deployment 後,請確認已正確佈建具有資料快取的永久儲存空間。

  1. 如要確認 pvc-data-cache 是否已成功繫結至持續性磁碟區,請執行下列指令:

    kubectl get pvc pvc-data-cache
    

    輸出結果會與下列內容相似:

    NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                VOLUMEATTRIBUTESCLASS   AGE
    pvc-data-cache   Bound    pvc-e9238a16-437e-45d7-ad41-410c400ae018   300Gi      RWO            pd-balanced-data-cache-sc   <unset>                 10m
    
  2. 如要確認節點上是否已建立資料快取的邏輯磁區管理工具 (LVM) 群組,請按照下列步驟操作:

    1. 取得該節點上 PDCSI 驅動程式的 Pod 名稱:

      NODE_NAME=$(kubectl get pod --output json |  jq '.items[0].spec.nodeName' | sed 's/\"//g')
      kubectl get po -n kube-system -o wide | grep ^pdcsi-node | grep $NODE_NAME
      

      從輸出內容複製 pdcsi-node Pod 的名稱。

    2. 查看 PDCSI 驅動程式記錄檔,瞭解 LVM 群組建立作業:

      PDCSI_POD_NAME="PDCSI-NODE_POD_NAME"
      kubectl logs -n kube-system $PDCSI_POD_NAME gce-pd-driver | grep "Volume group creation"
      

      PDCSI-NODE_POD_NAME 替換為您在上一步複製的實際 Pod 名稱。

      輸出結果會與下列內容相似:

      Volume group creation succeeded for LVM_GROUP_NAME
      

這則訊息會確認節點上的資料快取 LVM 設定正確無誤。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取費用,請刪除您在本指南中建立的儲存空間資源。

  1. 刪除 Deployment。

    kubectl delete deployment postgres-data-cache
    
  2. 刪除 PersistentVolumeClaim。

    kubectl delete pvc pvc-data-cache
    
  3. 刪除節點集區。

    gcloud container node-pools delete datacache-node-pool \
        --cluster CLUSTER_NAME
    

    CLUSTER_NAME 替換為您建立使用資料快取的節點集區的叢集名稱。

後續步驟