本頁說明如何為 Distributed Cloud 連線叢集設定儲存空間,包括:
為 Symcloud Storage 設定 Distributed Cloud connected
Distributed Cloud connected 節點不會直接向工作負載公開本機儲存空間。Distributed Cloud Connected 使用 Rakuten Symcloud Storage,這項第三方解決方案可做為本機儲存空間抽象層,在每個 Distributed Cloud Connected 節點上執行,並讓叢集中所有 Distributed Cloud Connected 節點上執行的工作負載都能使用本機儲存空間。
Container Storage Interface (CSI) 是許多主要儲存空間供應商支援的開放標準 API,可讓 Kubernetes 向容器化工作負載公開任意儲存空間系統。在 Distributed Cloud connected 中,Symcloud Storage 是受支援的代管 CSI 儲存空間解決方案。啟用 Symcloud Storage 後,系統會為您設定必要的 Kubernetes StorageClasses。然後設定工作負載,使用適當的儲存空間級別。
Symcloud Storage 是從 Google Cloud Marketplace 部署,並受其中所述條款約束。Google 僅提供有限的支援,協助您在 Distributed Cloud Connected 中使用 Symcloud Storage,並可能會聘僱第三方供應商提供協助。Distributed Cloud 連線軟體更新包含 Symcloud Storage 的軟體更新。
這個版本的 Distributed Cloud 連結網路方案隨附並支援 Symcloud Storage 6.0.0-226。這個版本的 Distributed Cloud connected 不支援其他版本的 Symcloud Storage。
取得 Symcloud Storage 授權
您必須從 Google Cloud Marketplace 取得 YAML 格式的 Symcloud Storage 授權:
必要條件
開始之前,請先完成下列步驟:
- 為目標 Distributed Cloud connected 專案設定記錄和監控。
- 建立目標 Distributed Cloud connected 叢集。
- 設定 Distributed Cloud 網路,讓目標 Distributed Cloud 連線叢集中的 Pod 可以連線至 Google Cloud 資料中心。
- 在每個 Distributed Cloud 節點上,繫結您不希望由 Symcloud Storage 抽象化的每個
local-block持久磁碟區。如果取消繫結已繫結的永久磁碟區,安裝 Symcloud Storage 時,系統會清除該永久磁碟區的內容。local-block如需操作說明,請參閱 Kubernetes 說明文件中的「繫結」。
在 Distributed Cloud 連線節點上安裝 Symcloud Storage
如要在 Distributed Cloud 連線節點上安裝 Symcloud Storage,請完成下列步驟:
使用下列指令將 Symcloud Storage 授權套用至叢集。將
LICENSE_FILE替換為 Symcloud Storage 授權檔案的完整路徑和名稱。kubectl apply -f LICENSE_FILE -n robin-admin
使用下列指令驗證
RobinCluster服務和所有 Symcloud Storage 節點的狀態:kubectl describe robinclusters -n robinio
指令會傳回類似以下內容的輸出結果:
[...] Status: [...] Phase: Ready robin_node_status: [...] Status: Ready [...] Status: Ready [...] Status: Ready [...]服務和節點的預期狀態為
Ready。
將 Symcloud Storage 設為預設儲存空間級別
請使用下列指令,將 Symcloud Storage 設為 Distributed Cloud 連線叢集的預設儲存空間級別。將 STORAGE_CLASS 替換為其中一個 Symcloud 儲存空間類別。
kubectl patch storageclass STORAGE_CLASS -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
如要進一步瞭解如何設定預設儲存空間級別,請參閱 Kubernetes 說明文件中的「變更預設的 StorageClass」一文。
Symcloud Storage 級別
本節說明 Symcloud Storage 可在 Distributed Cloud 連線叢集上啟用的儲存空間類別。Distributed Cloud Connected 上的 Symcloud Storage 不支援 robin-rwx 儲存空間級別,也不支援任何自訂設定的 RWX 檔案系統模式磁碟區。如要進一步瞭解 Symcloud 儲存空間類別,請參閱「在 Kubernetes 中使用 Robin CNS」。
robin 儲存空間級別
robin 儲存空間類別是基本的 Read Write-Once (RWO) 儲存空間類別。以下範例說明如何建立類別例項:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
robin-immediate 儲存空間級別
robin-immediate 儲存空間級別與 robin 相同,但系統會在建立對應的永久磁碟區要求後,立即建立永久磁碟區。下列範例說明如何例項化類別:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin-immediate
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
robin-repl-3 儲存空間級別
robin-repl-3 是 RWO 儲存空間類別,具有三個副本,可跨越多個 Distributed Cloud 節點。以下範例說明如何建立類別的例項:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: robin-repl-3
labels:
app.kubernetes.io/instance: robin
app.kubernetes.io/managed-by: robin.io
app.kubernetes.io/name: robin
provisioner: robin
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
parameters:
replication: "3"
faultdomain: host
為工作負載設定抽象化的 Symcloud Storage 磁碟區
本節提供範例,說明如何使用 Symcloud Storage 類別,為 Distributed Cloud 連線工作負載設定抽象化儲存空間。如要進一步瞭解如何設定 Symcloud Storage 磁碟區,請參閱「在 Kubernetes 中使用 Robin CNS」。
在檔案系統模式中設定 ext4 RWO 磁碟區
以下範例說明如何使用 ext4 檔案系統,在檔案系統模式中為 RWO 磁碟區設定永久磁碟區聲明。將 STORAGE_CLASS 替換為其中一個 Symcloud 儲存空間類別。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-fs-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
在區塊模式中設定 RWO 磁碟區
以下範例說明如何為區塊模式中的 RWO 磁碟區設定持續性磁碟區聲明。將 STORAGE_CLASS 替換為其中一個 Symcloud Storage 類別。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-block-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
volumeMode: Block
修改現有磁碟區的設定
以下範例說明如何使用註解,修改現有 Symcloud Storage LZ4 壓縮 RWO 磁碟區的設定。將 STORAGE_CLASS 替換為其中一個 Symcloud Storage 類別。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: compressed-rwo-fs-pvc
annotations:
robin.io/compression: LZ4
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
以下範例說明如何使用註解,透過 xfs 檔案系統修改現有 Symcloud Storage RWO 磁碟區的設定。將 STORAGE_CLASS 替換為其中一個 Symcloud Storage 類別。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: rwo-xfs-pvc
annotations:
robin.io/fstype: xfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: STORAGE_CLASS
設定 Symcloud Storage CLI 用戶端
Symcloud Storage 提供指令列介面 (CLI) 用戶端,可用於管理 Symcloud Storage 設定。如要在 Distributed Cloud 連線叢集上設定用戶端,請完成下列步驟:
取得
RobinCluster服務執行個體使用的 Symcloud Storage 映像檔路徑,該執行個體部署在 Distributed Cloud 連線叢集上,並依下列方式設定環境變數:image_robin=$(kubectl get robincluster -o jsonpath='{.items[].spec.image_robin}') image_registry_path=$(kubectl get robincluster -o jsonpath='{.items[].spec.image_registry_path}') ROBIN_CNS_IMAGE="$image_registry_path/$image_robin"使用以下內容建立
robincli資源:kind: Deployment apiVersion: apps/v1 metadata: name: robincli namespace: default labels: name: robincli spec: replicas: 1 selector: matchLabels: name: robincli template: metadata: annotations: product: robin labels: name: robincli spec: containers: - name: robincli image: ROBIN_CNS_IMAGE workingDir: /root command: ["/bin/bash","-c","mkdir -p /root/.robin; ln -s -t /usr/lib/python3.7/site-packages/ /opt/robin/current/python3/site-packages/robincli /opt/robin/current/python3/site-packages/stormgr_def.py /opt/robin/current/python3/site-packages/stormgr_lib.py; /opt/robin/current/bin/robin client add-context robin-master.robinio --set-current; while true; do sleep 10000; done"] resources: requests: memory: "10Mi" cpu: "100m"將
ROBIN_CNS_IMAGE替換為您在步驟 1 中取得的完整存放區路徑和映像檔名稱。將
robincli資源套用至 Distributed Cloud 已連結叢集。首次安裝時,Symcloud Storage 會在
robinio命名空間中產生default-admin-user密碼,並隨機產生密碼。請使用下列指令取得這些登入憑證:取得使用者名稱:
kubectl -n robinio get secret default-admin-user -o jsonpath='{.data.username}' | base64 -d取得密碼:
kubectl -n robinio get secret default-admin-user -o jsonpath='{.data.password}' | base64 -d
登入新建立的 Pod,然後執行用戶端:
kubectl exec -it robincli -- bash
在 StatefulSet 中參照儲存空間級別
以下範例說明如何在 StatefulSet 工作負載中參照 Symcloud Storage 儲存空間級別。
這個範例假設您使用的是預先設定的 robin-repl-3 儲存空間級別,該級別會提供在三個不同 worker 節點之間複製的磁碟區,以確保高可用性。
為高可用性設定 StatefulSet 時,請在設定中加入下列最佳做法:
- 無頭服務:StatefulSet 需要與
serviceName欄位相符的無頭服務。無頭服務是指沒有叢集 IP 的服務。clusterIP: None這項服務會為集合中的每個 Pod 指派穩定的 DNS 主機名稱。 - Pod 反親和性:如果您使用
robin-repl-3等複寫儲存空間級別,資料就會安全地鏡像到多個 worker 節點。不過,如果 Kubernetes 將所有應用程式 Pod 排定在同一個 worker 節點上,單一節點中斷可能會導致應用程式停止運作。設定 Pod 反親和性可確保 Pod 分散在不同的工作節點上,讓運算可用性與儲存空間備援相符。
以下範例展示完整的設定,包括無 Head 服務 (nginx) 和設定了 Pod 反相依性的 StatefulSet,並參照 robin-repl-3 儲存空間類別。如果工作負載儲存空間需求隨著時間增加,您可以編輯 PersistentVolumeClaim 中的儲存空間要求,動態調整磁碟區大小。
statefulset.yaml
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: "kubernetes.io/hostname" containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: # Reference the storage class in this specification - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi # Symcloud Storage classes support dynamic volume expansion if more storage is needed storageClassName: robin-repl-3 # References the Symcloud storage class
Symcloud Storage 的限制
搭配 Distributed Cloud connected 使用 Symcloud Storage 時,只有在 Distributed Cloud connected 叢集包含三個以上的 Distributed Cloud connected 節點時,才能實現高可用性。
從叢集中移除使用 Symcloud Storage 的節點
Symcloud Storage 磁碟區副本會儲存在 Distributed Cloud 連線叢集內的工作站節點上。如果從叢集中移除節點,儲存在該節點的 Symcloud Storage 磁碟區資料就會無法使用。為避免這種情況,請採取下列任一做法:
- 如要拆除整個叢集,請先移除工作負載和對應的 Symcloud Storage 永久磁碟區,再拆除叢集本身。
- 如要從叢集中移除特定節點,請務必先遷移儲存在這些節點上的工作負載資料,再從叢集中移除節點。如需操作說明,請參閱「從磁碟撤離磁碟區」。
設定本機儲存空間結構定義
儲存空間結構定義是將一或多個分割區邏輯分組。每個分區都是邏輯上獨立的儲存單元。系統會依序在叢集上建立分割區,直到實體磁碟空間用盡為止。每個儲存空間結構都有不重複的識別名稱。
如要為 Distributed Cloud 連線叢集建立新的本機儲存空間結構定義,請向 Google 提出要求。測試結構定義並在叢集上建立完成後,您就可以使用 gcloud CLI 套用結構定義。
將結構定義套用至叢集後,就無法再修改。如要變更現有結構定義,請先向 Google 申請刪除現有結構定義,然後申請建立新的結構定義來取代。
定義本機儲存空間結構定義的分區
如要要求本機儲存空間結構定義,請先定義該結構定義的分區。
分區具有下列屬性:
- 大小。您可以指定以二進位位元組為單位的分割區大小,也可以讓分割區使用本機磁碟上的所有剩餘空間。
- 類型。您可以將磁碟分割區設定為 Kubernetes PersistentVolume (PV) 或 Linux 本機磁碟區。
- 模式。您可以將儲存在分割區中的磁碟區設定為區塊磁碟區或檔案系統磁碟區。如果是永久磁碟區分割區,分割區的儲存空間級別分別為
local-block或local-disks。如果是本機磁碟區分割區,您可以指定所含檔案系統的繫結和掛接點。
要求本機儲存空間結構定義
如要為 Distributed Cloud 連線叢集要求新的本機儲存空間結構定義,請與 Google 支援團隊聯絡,並提供要在結構定義中建立的每個分割區大小、類型、模式,以及 (選用) 掛接點和繫結點。
收到要求後,我們會執行一系列測試,確保結構定義穩健無虞,然後在 Distributed Cloud 連線叢集上建立結構定義。
預設本機儲存空間結構定義
Distributed Cloud 連線隨附下列預設本機儲存空間結構定義:
default_control_plane_node。這個結構定義會定義下列分割區:- 檔案系統模式下的 100 GB 本機磁碟區分區。
- 區塊模式下的永久磁碟區分割區,會佔用剩餘的可用磁碟空間。
default_worker_node。這個結構定義會在區塊模式中定義 410 GB 的永久磁碟區。
將本機儲存空間結構定義套用至叢集
如要將本機儲存空間結構定義套用至 Distributed Cloud 連線叢集,請執行下列其中一項操作:
如要將本機儲存空間結構定義套用至叢集的控制層節點,請在建立叢集時使用
--control-plane-node-storage-schema標記。詳情請參閱「建立叢集」。如要將本機儲存空間結構定義套用至叢集的 worker 節點,請在為叢集建立節點集區時使用
--node-storage-schema。詳情請參閱「建立節點集區」。
成功建立叢集或節點集區後,Distributed Cloud connected 會建立本機儲存空間結構定義中定義的分割區。
疑難排解
如果 PersistentVolumeClaims 意外處於待處理狀態,或工作負載無法附加磁碟區,請執行本節列出的疑難排解步驟。
PersistentVolumeClaim 仍處於待處理狀態
如果 PersistentVolumeClaim 仍處於 Pending 狀態,請檢查儲存空間級別的 volumeBindingMode。預先設定的 Symcloud Storage 類別會使用 volumeBindingMode: WaitForFirstConsumer,將磁碟區佈建作業延後到排定參照該聲明的 Pod 時才執行。確認工作負載 Pod 已順利排定時間。
如果 Pod 排程已完成,但聲明仍處於待處理狀態,或是磁碟區附加作業失敗,請確認 Symcloud Storage 控制層和節點層級常駐程式的健康狀態。
驗證控制層健康狀態
如要確認 Symcloud Storage 控制層運作正常,且已準備好佈建磁碟區,請執行 kubectl describe 指令,檢查 RobinCluster 自訂資源的狀態:
kubectl describe robinclusters -n robinio
在指令輸出中,確認 Phase 為 Ready。
確認儲存空間精靈的健康狀態
如要確認所有節點層級的儲存空間精靈 Pod 都在執行中,請執行 kubectl get 指令:
kubectl get pods -n robinio
在指令輸出中,確認所有 Pod 都處於 Running 狀態。如果工作負載排程在儲存空間 Daemon Pod 失敗的節點上,無論中央 RobinCluster 狀態為何,磁碟區附加作業都會停滯。
聯絡支援團隊
如果 Symcloud Storage 控制層狀態不是 Ready,或任何儲存空間 Daemon Pod 不處於 Running 狀態,請與 Google 支援聯絡。提交支援單時,請提供您執行的疑難排解指令輸出內容。