本文將深入淺出地介紹如何在 GKE 集群中掛載 Google Cloud Storage (GCS),讓您的應用程式能輕鬆、安全地存取雲端儲存的資料。我們將逐步說明必要的步驟,包含建立必要的服務帳戶、設定權限,以及在 Pod 中使用 PersistentVolume 和 PersistentVolumeClaim 掛載 GCS。
而將 GCS 掛載到 GKE 集群有諸多用途。 例如,在訓練大型 AI 模型時,可以將訓練資料儲存在 GCS 中,GKE Pod 即可直接存取這些資料,加速訓練過程並降低儲存成本。 這篇文章將說明如何配置必要的卷,確保您的應用程式能順利讀寫 GCS 中的資料。
Google Cloud Storage (GCS) 是一個高度可擴展且耐用的物件儲存服務,適用於各種資料儲存需求,從網站內容和備份到媒體檔案和機器學習資料集。GCS 提供統一的 API,讓您可以輕鬆地透過全球網路存取資料,並提供多種儲存類別選項,以最佳化成本和效能。
可以選擇不同的儲存類別,例如標準儲存、近線儲存、冷線儲存和封存儲存,以滿足不同的存取頻率和資料生命週期需求。GCS 也提供強大的安全功能,包括資料加密和存取控制,以確保資料的安全性。
此外,GCS 與其他 GCP 服務緊密整合,例如 BigQuery、Cloud Functions 和 Kubernetes,可以輕鬆地建構資料處理和分析流程。透過簡單易用的控制台和命令列工具,您可以輕鬆管理和監控您的儲存桶和物件。無論您是個人開發者還是大型企業,GCS 都能提供可靠且經濟高效的雲端儲存解決方案。
到GKE Cluster 頁面中打開 Cloud Storage FUSE CSI 驅動程式,或使用 Teraaform 設定開啟。
Terraform 參數
module "gke" {
gcs_fuse_csi_driver = true #Cloud Storage FUSE CSI 驅動程式
}
使用 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 = {
}
},
建立一個名稱為 ithome-gcs-demo 的Bucket
在 Bucket 內創建資料夾 download,上傳兩張圖片檔案放在此資料夾內
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 字段下配置注釋。
默認情況下,邊車容器配置了以下資源請求,並且未設置資源限制:
如需覆蓋這些值,您可以選擇指定注解 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-sidecar 的 Init Containers
因為我有使用 external dns,所以 DNS 紀錄會自動添加,可以查看 Day9 教學。
打開 Ingress 的網址,gcs-demo.demoit.shop
本文介紹了如何在 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 了。