透過 Managed Lustre CSI 驅動程式,在 GKE 上存取 Managed Lustre 執行個體

本指南說明如何在 GKE 中,透過動態佈建功能,使用 Managed Lustre CSI 驅動程式建立新的 Kubernetes 磁碟區。透過 Managed Lustre CSI 驅動程式,您可以視需要建立由 Managed Lustre 執行個體支援的儲存空間,並以磁碟區的形式存取這些儲存空間,用於有狀態的工作負載。

事前準備

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

  • 啟用 Google Cloud Managed Lustre API 和 Google Kubernetes Engine API。
  • 啟用 API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

設定環境變數

設定下列環境變數:

export CLUSTER_NAME=CLUSTER_NAME
export PROJECT_ID=PROJECT_ID
export NETWORK_NAME=LUSTRE_NETWORK
export IP_RANGE_NAME=LUSTRE_IP_RANGE
export FIREWALL_RULE_NAME=LUSTRE_FIREWALL_RULE
export LOCATION=ZONE
export CLUSTER_VERSION=CLUSTER_VERSION

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • PROJECT_ID:您的 Google Cloud 專案 ID
  • LUSTRE_NETWORK:共用虛擬私有雲 (VPC) 網路,GKE 叢集和受管理 Lustre 執行個體都位於這個網路中。
  • LUSTRE_IP_RANGE:為虛擬私有雲網路對等互連與 Managed Lustre 建立的 IP 位址範圍名稱。
  • LUSTRE_FIREWALL_RULE:防火牆規則的名稱,可允許來自 IP 位址範圍的 TCP 流量。
  • ZONE:GKE 叢集的地理區域,例如 us-central1-a
  • CLUSTER_VERSION:GKE 叢集版本。

設定虛擬私有雲網路

建立 Managed Lustre 執行個體和 GKE 叢集時,您必須指定相同的虛擬私有雲網路,或是使用對等互連的虛擬私有雲網路時,透過 Network Connectivity Center 連線。

  1. 如要啟用服務網路,請執行下列指令:

    gcloud services enable servicenetworking.googleapis.com \
        --project=${PROJECT_ID}
    
  2. 建立虛擬私有雲網路。將 --mtu 旗標設為 8896,可提升 10% 的效能。

    gcloud compute networks create ${NETWORK_NAME} \
        --subnet-mode=auto --project=${PROJECT_ID} \
        --mtu=8896
    
  3. 建立 IP 位址範圍。

    gcloud compute addresses create ${IP_RANGE_NAME} \
        --global \
        --purpose=VPC_PEERING \
        --prefix-length=20 \
        --description="Managed Lustre VPC Peering" \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID}
    
  4. 取得與您在上一個步驟中建立的範圍相關聯的 CIDR 範圍。

    CIDR_RANGE=$(
      gcloud compute addresses describe ${IP_RANGE_NAME} \
          --global  \
          --format="value[separator=/](address, prefixLength)" \
          --project=${PROJECT_ID}
    )
    
  5. 建立防火牆規則,允許來自您建立的 IP 位址範圍的 TCP 流量。

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
        --allow=tcp:988,tcp:6988 \
        --network=${NETWORK_NAME} \
        --source-ranges=${CIDR_RANGE} \
        --project=${PROJECT_ID}
    
  6. 如要為專案設定網路對等互連,請確認您具備必要的 IAM 權限,特別是 compute.networkAdminservicenetworking.networksAdmin 角色。

    1. 前往 Google Cloud 控制台 >「IAM 與管理」,然後搜尋專案擁有者主體。
    2. 按一下鉛筆圖示,然後點選「+ 新增其他角色」
    3. 選取「Compute Network Admin」或「Service Networking Admin」
    4. 按一下 [儲存]
  7. 連結對等互連。

    gcloud services vpc-peerings connect \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID} \
        --ranges=${IP_RANGE_NAME} \
        --service=servicenetworking.googleapis.com
    

設定受管理 Lustre CSI 驅動程式

本節說明如何視需要啟用及停用受管理的 Lustre CSI 驅動程式。

Lustre 通訊埠

GKE Managed Lustre CSI 驅動程式會使用不同的通訊埠與 Managed Lustre 執行個體通訊,具體取決於 GKE 叢集版本和現有的 Managed Lustre 設定。

  • 預設通訊埠 (建議):對於執行 1.33.2-gke.4780000 以上版本的新 GKE 叢集,驅動程式預設會使用通訊埠 988 進行 Lustre 通訊。

  • 舊版通訊埠:在下列情況下,請使用通訊埠 6988,並在 gcloud 指令中附加 --enable-legacy-lustre-port 旗標:

    • 較早的 GKE 版本:如果 GKE 叢集執行的版本早於 1.33.2-gke.4780000--enable-legacy-lustre-port 旗標可解決 GKE 節點上 gke-metadata-server 的通訊埠衝突問題。
    • 現有 Lustre 執行個體:如要連線至以 gke-support-enabled 旗標建立的現有 Managed Lustre 執行個體,無論叢集版本為何,都必須gcloud 指令中加入 --enable-legacy-lustre-port。如果沒有這個標記,GKE 叢集就無法掛接現有的 Lustre 執行個體。如要瞭解 gke-support-enabled 標記,請參閱「建立執行個體」中的選用標記說明。

您可以將新叢集和現有叢集設定為使用預設連接埠 988 或舊版連接埠 6988

在新 GKE 叢集上啟用 Managed Lustre CSI 驅動程式

以下各節說明如何在新的 GKE 叢集上啟用 Managed Lustre CSI 驅動程式。

使用預設通訊埠 988

如要在建立執行 1.33.2-gke.4780000 版以上的新 GKE 叢集時啟用 Managed Lustre CSI 驅動程式,請執行下列指令:

Autopilot

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver

標準

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver

使用舊版通訊埠 6988

如要在建立執行 1.33.2-gke.4780000 之前版本的 GKE 叢集時啟用代管 Lustre CSI 驅動程式,請執行下列指令:

Autopilot

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver \
    --enable-legacy-lustre-port

標準

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver \
    --enable-legacy-lustre-port

在現有 GKE 叢集上啟用 Managed Lustre CSI 驅動程式

以下各節說明如何在現有 GKE 叢集上啟用 Managed Lustre CSI 驅動程式。

使用預設通訊埠 988

如要在執行 1.33.2-gke.4780000 以上版本的現有 GKE 叢集上啟用 Managed Lustre CSI 驅動程式,請執行下列指令:

  gcloud container clusters update ${CLUSTER_NAME} \
      --location=${LOCATION} \
      --update-addons=LustreCsiDriver=ENABLED

使用舊版通訊埠 6988

如要在現有 GKE 叢集上啟用代管 Lustre CSI 驅動程式,可能需要使用舊版通訊埠 6988 並新增 --enable-legacy-lustre-port 標記。在下列情況中,這個標記是必要條件:

  • 如果 GKE 叢集執行的版本早於 1.33.2-gke.4780000
  • 如果您打算將這個叢集連線至以 gke-support-enabled 旗標建立的現有 Managed Lustre 執行個體。

    gcloud container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-legacy-lustre-port
    

現有叢集必須升級節點

在現有叢集上啟用 Managed Lustre CSI 驅動程式時,系統可能會重新建立節點,以便更新 Managed Lustre 用戶端所需的核心模組。如要立即使用,建議手動升級節點集區。

發布版本中的 GKE 叢集會根據排定的推出時間升級,視維護時間範圍而定,升級作業可能需要幾週時間。如果使用靜態 GKE 版本,則需要手動升級節點集區。

在節點升級完全完成前,CSI 驅動程式 Pod 可能會在待更新的節點上發生當機迴圈。如果 CSI 驅動程式 Pod 記錄中顯示 Operation not permitted 錯誤,表示需要升級或重建節點。

節點集區升級後,CPU 節點在Google Cloud 控制台或 CLI 輸出中,可能會顯示使用 GPU 映像檔。例如:

config:
  imageType: COS_CONTAINERD
  nodeImageConfig:
    image: gke-1330-gke1552000-cos-121-18867-90-4-c-nvda

這是正常現象。GPU 映像檔會在 CPU 節點上重複使用,以安全地安裝 Managed Lustre 核心模組。系統不會向您收取 GPU 使用費。

停用 Managed Lustre CSI 驅動程式

您可以使用 Google Cloud CLI,在現有 GKE 叢集上停用 Managed Lustre CSI 驅動程式。

gcloud container clusters update ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --update-addons=LustreCsiDriver=DISABLED

停用 CSI 驅動程式後,GKE 會自動重建節點,並解除安裝 Managed Lustre 核心模組。

使用 Managed Lustre CSI 驅動程式建立新磁碟區

下列各節說明在 GKE 中建立由 Managed Lustre 執行個體支援的 Kubernetes 磁碟區時,通常會執行的程序:

  1. 建立 StorageClass
  2. 使用 PersistentVolumeClaim 存取磁碟區
  3. 建立會耗用磁碟區的工作負載

建立 StorageClass

啟用代管 Lustre CSI 驅動程式後,GKE 會自動建立 StorageClass,用於佈建代管 Lustre 執行個體。StorageClass 取決於 Managed Lustre 效能層級,可以是下列其中一項:

  • lustre-rwx-125mbps-per-tib
  • lustre-rwx-250mbps-per-tib
  • lustre-rwx-500mbps-per-tib
  • lustre-rwx-1000mbps-per-tib

GKE 會為每個支援的 Managed Lustre 效能層級提供預設的 StorageClass。這樣一來,您就能使用內建的 StorageClass,不必自行定義,簡化 Managed Lustre 執行個體的動態佈建程序。

如果是區域叢集,CSI 驅動程式會在與叢集相同的區域中,佈建 Managed Lustre 執行個體。如果是地區叢集,系統會在地區內的其中一個區域佈建執行個體。

以下範例說明如何建立具有特定拓撲需求的自訂 StorageClass:

  1. 將下列資訊清單儲存至名為 lustre-class.yaml 的檔案:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: lustre-class
    provisioner: lustre.csi.storage.gke.io
    volumeBindingMode: Immediate
    reclaimPolicy: Delete
    parameters:
      perUnitStorageThroughput: "1000"
      network: LUSTRE_NETWORK
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - us-central1-a
    

    如需 StorageClass 支援的完整欄位清單,請參閱 Managed Lustre CSI 驅動程式參考說明文件

  2. 執行下列指令來建立 StorageClass:

    kubectl apply -f lustre-class.yaml
    

使用 PersistentVolumeClaim 存取 Volume

本節說明如何建立 PersistentVolumeClaim 資源,該資源會參照 Managed Lustre CSI 驅動程式的 StorageClass。

  1. 將下列資訊清單儲存至名為 lustre-pvc.yaml 的檔案:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: lustre-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 9000Gi
      storageClassName: lustre-class
    

    如需 PersistentVolumeClaim 支援的完整欄位清單,請參閱受管理 Lustre CSI 驅動程式參考說明文件

  2. 執行下列指令來建立 PersistentVolumeClaim:

    kubectl apply -f lustre-pvc.yaml
    

建立工作負載來使用磁碟區

本節提供範例,說明如何建立 Pod,以使用您先前建立的 PersistentVolumeClaim 資源。

多個 Pod 可以共用同一個 PersistentVolumeClaim 資源。

  1. 將下列資訊清單儲存到名為 my-pod.yaml 的檔案。

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
          - name: lustre-volume
            mountPath: /data
      volumes:
      - name: lustre-volume
        persistentVolumeClaim:
          claimName: lustre-pvc
    
  2. 將資訊清單套用至叢集。

    kubectl apply -f my-pod.yaml
    
  3. 確認 Pod 正在執行。PersistentVolumeClaim 佈建完成後,Pod 就會執行。這項作業可能需要幾分鐘才能完成。

    kubectl get pods
    

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

    NAME           READY   STATUS    RESTARTS   AGE
    my-pod         1/1     Running   0          11s
    

搭配使用 fsGroup 與 Managed Lustre 磁碟區

您可以變更已掛接檔案系統的根層級目錄群組擁有權,以符合 Pod SecurityContext 中指定的使用者要求 fsGroup。fsGroup 不會遞迴變更整個已掛接的 Managed Lustre 檔案系統擁有權,只會影響掛接點的根目錄。

疑難排解

如需疑難排解指南,請參閱 Managed Lustre 說明文件的疑難排解頁面

清除所用資源

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

  1. 刪除 Pod 和 PersistentVolumeClaim。

    kubectl delete pod my-pod
    kubectl delete pvc lustre-pvc
    
  2. 檢查 PersistentVolume 狀態。

    kubectl get pv
    

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

    No resources found
    

    系統可能需要幾分鐘的時間,才能完全刪除基礎的 Managed Lustre 執行個體。

後續步驟