iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Kubernetes

異世界生存戰記:30天煉成GKE大師系列 第 19

Day19 GKE 共享的魔法卷軸(二):硬碟可以掛載的話,那 Cloud Storage 也可以嗎?

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20241003/20169017iNTR96R2um.png

前言

本文將深入淺出地介紹如何在 GKE 集群中掛載 Google Cloud Storage (GCS),讓您的應用程式能輕鬆、安全地存取雲端儲存的資料。我們將逐步說明必要的步驟,包含建立必要的服務帳戶、設定權限,以及在 Pod 中使用 PersistentVolume 和 PersistentVolumeClaim 掛載 GCS。

而將 GCS 掛載到 GKE 集群有諸多用途。 例如,在訓練大型 AI 模型時,可以將訓練資料儲存在 GCS 中,GKE Pod 即可直接存取這些資料,加速訓練過程並降低儲存成本。 這篇文章將說明如何配置必要的卷,確保您的應用程式能順利讀寫 GCS 中的資料。

Cloud Storage 介紹

Google Cloud Storage (GCS) 是一個高度可擴展且耐用的物件儲存服務,適用於各種資料儲存需求,從網站內容和備份到媒體檔案和機器學習資料集。GCS 提供統一的 API,讓您可以輕鬆地透過全球網路存取資料,並提供多種儲存類別選項,以最佳化成本和效能。

可以選擇不同的儲存類別,例如標準儲存、近線儲存、冷線儲存和封存儲存,以滿足不同的存取頻率和資料生命週期需求。GCS 也提供強大的安全功能,包括資料加密和存取控制,以確保資料的安全性。

此外,GCS 與其他 GCP 服務緊密整合,例如 BigQuery、Cloud Functions 和 Kubernetes,可以輕鬆地建構資料處理和分析流程。透過簡單易用的控制台和命令列工具,您可以輕鬆管理和監控您的儲存桶和物件。無論您是個人開發者還是大型企業,GCS 都能提供可靠且經濟高效的雲端儲存解決方案。

示範

到GKE Cluster 頁面中打開 Cloud Storage FUSE CSI 驅動程式,或使用 Teraaform 設定開啟。
https://ithelp.ithome.com.tw/upload/images/20241003/20169017T78Pacaxho.png

Terraform 參數

module "gke" {
  gcs_fuse_csi_driver  = true #Cloud Storage FUSE CSI 驅動程式
}

使用適用於 GKE IAM Workload Identity 配置對 Cloud Storage 存儲桶的訪問權限

使用 Day6的教學,創建 K8s SA: example-sa 使其和 GCP SA: demo2-cluster-example-sa 綁定,具有 roles/storage.objectUser 的權限

    example = {
      gcp_service_account           = "demo2-cluster-example-sa"
      k8s_service_account           = "example-sa"
      k8s_service_account_namespace = "example"
      use_existing_gcp_sa           = false
      use_existing_k8s_sa           = false
      roles = [
        "roles/storage.objectUser"
      ],
      additional_projects = {
      }
    },

創建 Cloud Storage

建立一個名稱為 ithome-gcs-demo 的Bucket

https://ithelp.ithome.com.tw/upload/images/20241003/20169017VHSmi5rikS.png
在 Bucket 內創建資料夾 download,上傳兩張圖片檔案放在此資料夾內

https://ithelp.ithome.com.tw/upload/images/20241003/20169017Al3BWbXHTz.png

指定 Pod 注釋

CSI 驅動程序依賴 Pod 注解來確定 Pod 是否使用受 Cloud Storage 支持的卷。如果驅動程序檢測到必要的注解,則會將名為 gke-gcsfuse-sidecar 的邊車容器注入工作負載 Pod。Cloud Storage FUSE 實例在 Side Car 容器內運行,並為您的工作負載裝載 Cloud Storage 存儲桶。

如需使 CSI 驅動程序能夠裝載 Cloud Storage 存儲桶,請確保在 Kubernetes 工作負載類型(例如 Pod、Job、Deployment 或 StatefulSet)其 spec.template.metadata.annotations 字段下配置注釋。

默認情況下,邊車容器配置了以下資源請求,並且未設置資源限制:

  • 250m CPU
  • 256 MiB 內存
  • 5 GiB 臨時存儲

如需覆蓋這些值,您可以選擇指定注解 gke-gcsfuse/ [cpu-limit|memory-limit|ephemeral-storage-limit|cpu-request|memory-request|ephemeral-storage-request],如以下示例所示:

metadata:
  annotations:
    gke-gcsfuse/volumes: "true"
    gke-gcsfuse/cpu-limit: "10"
    gke-gcsfuse/memory-limit: 10Gi
    gke-gcsfuse/ephemeral-storage-limit: 1Ti
    gke-gcsfuse/cpu-request: 500m
    gke-gcsfuse/memory-request: 1Gi
    gke-gcsfuse/ephemeral-storage-request: 50Gi

掛載 GCS 的 deployment.yaml 範例,及其service.yaml 和 ingress.yaml。

此 Bucket 中的 download 目錄掛載到 Pod 中 /gcs/download 目錄

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gcs-demo-deployment
  namespace: example
  labels:
    app: gcs-demo
  annotations:
    reloader.stakater.com/auto: "true"
spec:
  selector:
    matchLabels:
      app: gcs-demo
  template:
    metadata:
      labels:
        app: gcs-demo
# 將 GKE CSI 驅動程序啟動 Sidecar 容器所需的 annotations
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/cpu-request: 500m
        gke-gcsfuse/memory-request: 1Gi
        reloader.stakater.com/auto: "true"
    spec:
      serviceAccountName: example-sa # 使用具有存取 GCS 存儲空間的 GKE SA
      volumes:
        # 將剛剛創建的 GCS ithome-gcs-demo Bucket 掛載到 Pod 中
        - name: gcs-fuse-csi-ephemeral
          csi:
            driver: gcsfuse.csi.storage.gke.io
            readOnly: true
            volumeAttributes:
              bucketName: ithome-gcs-demo # Bucket 名稱
              mountOptions: "implicit-dirs"
              gcsfuseLoggingSeverity: warning
      containers:
        - name: gcs-demo
          image: a51907/path-download:v1
          env:
            - name: MOUNT_PATH # 前端網頁中顯示 Pod 的路徑
              value: "/gcs/download"
          imagePullPolicy: Always
          volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /gcs/download
              subPath: "download" # Bucket 中的 download 目錄掛載到 Pod 中 /gcs/download 目錄 
              readOnly: true # 此 Pod 只有讀取權限
          resources:
            requests:
              cpu: 1m
              memory: 10Mi
            limits:
              cpu: 100m
              memory: 100Mi
          ports:
            - containerPort: 3000
              protocol: TCP
          readinessProbe:
            tcpSocket:
              port: 3000
          livenessProbe:
            tcpSocket:
              port: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: gcs-demo-service
  namespace: example
spec:
  type: ClusterIP
  selector:
    app: gcs-demo
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gcs-demo-ingress
  namespace: example
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-demo
spec:
  ingressClassName: external-nginx
  tls:
    - hosts:
        - gcs-demo.demoit.shop
      secretName: gcs-demo-tls
  rules:
    - host: "gcs-demo.demoit.shop"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: gcs-demo-service
                port:
                  number: 3000

可以看到 Pod 在啟動時,會先啟動中一個鏡像為 gke-gcsfuse-sidecarInit Containers

https://ithelp.ithome.com.tw/upload/images/20241003/201690170NvcctOnPl.png

因為我有使用 external dns,所以 DNS 紀錄會自動添加,可以查看 Day9 教學

打開 Ingress 的網址,gcs-demo.demoit.shop

https://ithelp.ithome.com.tw/upload/images/20241003/20169017oWXrE4hrrn.png

總結

本文介紹了如何在 Google Kubernetes Engine (GKE) 上將 Google Cloud Storage (GCS) Bucket 掛載到 Pod,實現靜態網頁託管。通過此方法,可以輕鬆地將前端網頁應用程式部署到 GKE,並將 GCS 作為持久化儲存,提供客戶端對網頁資源的訪問。

文章詳細闡述了設定步驟,包括建立 GCS Bucket、設定 Service Account 及其權限、配置 Kubernetes Secret 和 Volume,以及部署使用該 Volume 的 Pod。

透過 GKE 和 GCS 的整合,可以快速同步檔案,此解決方案可以應用的面向非常廣泛。以今年最流行的項目 AI 來說,在訓練大型 AI 模型時,可以將訓練資料儲存在 GCS 中,訓練使用的 GKE Pod 即可直接存取這些資料,之後將訓練完的資料,放到另一個 GCS 內,讓負責 Inference 的 Pod 掛載訓練完成的資料,方便服務上線,如此一來,即可自動化的達成 AIOps 的 ML Pipeline 了。

參考文件


上一篇
Day18 GKE 共享的魔法卷軸(一):GKE NFS FileStore
下一篇
Day20 Grafana + GCP OAuth API 一鍵登入數據聖殿
系列文
異世界生存戰記:30天煉成GKE大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言