設定 Block Storage for Classic

IBM Cloud Block Storage for Classic 這是一種持久性、高效能的 儲存解決方案,您可以透過 持久性卷宗(PV)將其整合至您的應用程式中。iSCSI Kubernetes 您可以從具有符合您工作負載需求之 GB 大小及 IOPS 的預先定義儲存空間層級中進行選擇。 若要瞭解 IBM Cloud Block Storage for Classic 是否適合您的儲存選項,請參閱 選擇儲存解決方案

使用 IBM Cloud Block Storage for Classic 外掛程式時,請記住下列要求。

IBM Cloud Block Storage for Classic 外掛程式僅適用於在標準基礎架構上佈建的標準 IBM Cloud Kubernetes Service 叢集。 如果您有 VPC 叢集,請參閱 設定 Block Storage for Classic

如果您的叢集無法存取公共網路(例如位於防火牆後方的私有叢集,或僅啟用私有雲服務端點的叢集),請務必安裝 IBM Cloud Block Storage for Classic 外掛程式(版本 1.3.0 或更新版本),以便透過私有網路連線至您的 Block Storage for Classic 執行個體。

Block Storage for Classic實例特定於單一校區多專區區域。 如果您有多區域叢集,請考慮多區域持續性儲存空間選項

經典基礎架構

此頁面上的步驟僅適用於標準叢集。 在 VPC 群集上,預設會安裝 Block Storage for VPC 群集附加元件。 如需詳細資訊,請參閱 設定 Block Storage for VPC

IBM Cloud Block Storage for Classic 的快速入門

在本快速入門指南中,您將透過建立 PVC 以動態佈建磁碟區,在群集中建立 24Gi silver tier Block Storage for Classic 磁碟區。 然後,您建立應用程式部署來裝載 PVC。

第一次在群集中使用 Block Storage for Classic? 安裝 Block Storage for Classic 外掛程式 後,請再回到這裡。

  1. 將下列持續性磁區要求 (PVC) 配置儲存至稱為 pvc.yaml 的檔案。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: block-storage-pvc
      labels:
        billingType: "hourly"
        region: us-east
        zone: wdc07
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 45Gi
      storageClassName: ibmc-block-silver
    
  2. 將配置套用至叢集以建立 PVC。

    kubectl apply -f pvc.yaml
    
  3. 等到 PVC 處於 Bound 狀態。 您可以執行以下指令來查看狀態。

    kubectl get pvc
    
  4. 在 PVC 為 Bound 之後,請建立使用 PVC 的應用程式部署。 將下列部署配置儲存至稱為 deployment.yaml 的檔案。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
    spec:
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - image: nginx # Use the nginx image, or your own containerized app image.
            name: my-container
            command: ["/bin/sh"]
            args: ["-c", "while true; do date \"+%Y-%m-%d %H:%M:%S\"; sleep 3600; done"] # This app prints the timestamp, then sleeps.
            workingDir: /home
            imagePullPolicy: Always
            ports:
              - containerPort: 80
            volumeMounts:
            - name: my-volume
              mountPath: /mount-path
          volumes:
          - name: my-volume
            persistentVolumeClaim:
              claimName: block-storage-pvc
    
  5. 在叢集裡建立部署。

    kubectl apply -f deployment.yaml
    
  6. 請等待直到部署為 Ready。 請執行以下指令,以檢查部署狀態。

    kubectl get deployments
    

    輸出範例

    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-deployment   1/1     1            1           3m19s
    
  7. 列出 Pod 並驗證 my-deployment Pod 是否在執行中。

    kubectl get pods
    

    輸出範例

    NAME                            READY   STATUS    RESTARTS   AGE
    my-deployment-ccdf87dfb-vzn95   1/1     Running   0          5m27s
    
  8. 取得 Pod 日誌以驗證已寫入時間戳記。

    kubectl logs
    

    輸出範例

    2022-01-21 14:18:59
    

您已順利建立使用 Block Storage for Classic的部署! 如需相關資訊,請參閱下列鏈結。

在您的叢集中安裝 IBM Cloud Block Storage for Classic 外掛程式

安裝 IBM Cloud Block Storage for Classic 外掛程式,並搭配 Helm 圖表,以設定 Block Storage for Classic 的預定義儲存類別。 您可以使用這些儲存空間類別來建立 PVC,以佈建應用程式的 Block Storage for Classic。

執行 IBM Cloud Kubernetes Service 版本 1.24 或更新版本的經典群集不需要安裝 IBM Cloud Block Storage for Classic 外掛程式。 依預設,驅動程式和外掛程式安裝在這些叢集上。

開始之前:請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 確保工作者節點套用次要版本的最新修補程式,以使用最新安全設定來執行工作者節點。 修補程式版本也可確保更新工作者節點上的 root 密碼。

    如果您未在過去 90 天內套用更新或重新載入工作者節點,則工作者節點上的 root 使用者密碼會到期,儲存體外掛程式安裝可能會失敗。

    1. 列出工作者節點的現行修補程式版本。
        ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID
        ```
        輸出範例
        ```sh {: screen}
        OK
        ID                                                  Public IP        Private IP     Machine Type           State    Status   Zone    Version
        kube-dal10-crb1a23b456789ac1b20b2nc1e12b345ab-w26   169.xx.xxx.xxx    10.xxx.xx.xxx   b3c.4x16.encrypted     normal   Ready    dal10   1.35_1523*
        ```
        如果您的工作者節點未套用最新修補程式版本,則您會在 CLI 輸出的`*`版本**直欄中看到星號 (**)。
    
    2. 檢閱 [Kubernetes 版本資訊](/docs/containers?topic=containers-cs_versions),以尋找最新變更。
    
    3. 重新載入您的工作者節點,以套用最新的修補程式版本。 在重新載入工作節點之前,請依照「[ibmcloud ks worker reload」指令](/docs/containers?topic=containers-kubernetes-service-cli#worker-reload-cli) 中的說明,安全地重新排程工作節點上所有正在運行的 Pod。 請注意,在重新載入期間,會使用最新的映像檔更新您的工作者節點機器,而且如果資料不是[儲存在工作者節點之外](/docs/containers?topic=containers-storage-plan)即會被刪除。
    
    
  2. 遵循指示,在本端機器上安裝 Helm 第 3 版用戶端。

  3. 將 IBM Cloud Helm 圖表儲存庫新增至您欲使用 IBM Cloud Block Storage for Classic 外掛程式的叢集。

    如果您在 IBM Cloud 帳戶中啟用 VRF 和服務端點,您可以使用私人 IBM Cloud Helm 儲存庫,將影像拉取流量保留在私人網路中。 如果您無法在帳戶中啟用 VRF 或服務端點,請使用公用登錄網域: helm repo add iks-charts https://icr.io/helm/iks-charts

    helm repo add iks-charts https://icr.io/helm/iks-charts
    
  4. 更新 Helm 儲存庫,以擷取此儲存庫中所有 Helm Chart 的最新版本。

    helm repo update
    
  5. 安裝 IBM Cloud Block Storage for Classic 外掛程式,並為您的安裝提供名稱,例如: block-storage-plugin。 安裝外掛程式時,會將預先定義的區塊儲存空間類別新增至叢集。

    helm install <name> iks-charts/ibmcloud-block-storage-plugin -n <namespace>
    

    輸出範例

    NAME:   <name>
    LAST DEPLOYED: Wed Apr 18 10:02:55 2018
    NAMESPACE: default
    STATUS: DEPLOYED
    RESOURCES:
    ==> v1beta1/DaemonSet
    NAME                           DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
    ibmcloud-block-storage-driver  0        0        0      0           0          <none>         0s
    ==> v1beta1/Deployment
    NAME                           DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
    ibmcloud-block-storage-plugin  1        0        0           0          0s
    ==> v1/StorageClass
    NAME                      PROVISIONER        AGE
    ibmc-block-bronze         ibm.io/ibmc-block  0s
    ibmc-block-custom         ibm.io/ibmc-block  0s
    ibmc-block-gold           ibm.io/ibmc-block  0s
    ibmc-block-retain-bronze  ibm.io/ibmc-block  0s
    ibmc-block-retain-custom  ibm.io/ibmc-block  0s
    ibmc-block-retain-gold    ibm.io/ibmc-block  0s
    ibmc-block-retain-silver  ibm.io/ibmc-block  0s
    ibmc-block-silver         ibm.io/ibmc-block  0s
    ==> v1/ServiceAccount
    NAME                           SECRETS  AGE
    ibmcloud-block-storage-plugin  1        0s
    ==> v1beta1/ClusterRole
    NAME                           AGE
    ibmcloud-block-storage-plugin  0s
    ==> v1beta1/ClusterRoleBinding
    NAME                           AGE
    ibmcloud-block-storage-plugin  0s
    NOTES:
    Thank you for installing: ibmcloud-block-storage-plugin.   Your release is named: <name>
    
  6. 驗證安裝。

    kubectl get pod -n <namespace> | grep block
    

    輸出範例

    ibmcloud-block-storage-driver-kh4mt                              1/1       Running   0          27d       10.118.98.19   10.118.98.19
    ibmcloud-block-storage-plugin-58c5f9dc86-pbl4t                   1/1       Running   0          14d       172.21.0.204   10.118.98.19
    

    當您看到一個 ibmcloud-block-storage-plugin Pod 及一個以上 ibmcloud-block-storage-driver Pod 時,安裝即成功。 ibmcloud-block-storage-driver Pod 的數目會等於叢集裡的工作者節點數目。 所有 Pod 都必須處於 Running 狀況。

  7. 請確認已將 Block Storage for Classic 的儲存類別新增至您的叢集。

    kubectl get sc | grep block
    

    輸出範例

    ibmc-block-bronze                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-custom                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-gold                        ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-retain-bronze               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-custom               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-gold                 ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-silver               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-silver                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    
  8. 對於您要在其中佈建區塊儲存空間的每一個叢集重複這些步驟。

現在,您可以繼續建立一個 PVC,佈建應用程式的區塊儲存空間。

更新 IBM Cloud Block Storage 外掛程式

您可以將現有的 IBM Cloud Block Storage 外掛程式升級至最新版本。

開始之前:請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 更新 Helm 儲存庫,以擷取此儲存庫中所有 Helm Chart 的最新版本。

    helm repo update
    
  2. 選用項目:將最新的 Helm Chart 下載至您的本端機器。 然後,將套件解壓縮,並檢閱 release.md 檔案,以找到最新版本資訊。

    helm pull iks-charts/ibmcloud-block-storage-plugin --untar
    
  3. 找出您在叢集中安裝的區塊儲存 Helm 圖表的版本名稱與命名空間。

    helm ls -A
    

    輸出範例

    NAME            NAMESPACE   REVISION    UPDATED                             STATUS      CHART                                   APP VERSION
    block-plugin    default     1           2022-01-21 09:02:46.11622 -0500 EST deployed        bmcloud-block-storage-plugin-v2.1.5
    
  4. 將 IBM Cloud Block Storage 外掛程式升級至最新版本。 包括您先前擷取的版本名稱及名稱空間。

    helm upgrade RELEASE-NAME iks-charts/ibmcloud-block-storage-plugin -n NAMESPACE
    
  5. 選用項目:更新外掛程式時,會取消設定 default 儲存空間類別。 如果您要將預設儲存空間類別設為您選擇的儲存空間類別,請執行下列指令。

    kubectl patch storageclass STORAGECLASS -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    

移除 IBM Cloud Block Storage 外掛程式

若您不希望在叢集中配置和使用 IBM Cloud Block Storage,您可以解除安裝 Helm 圖表。

移除外掛程式不會移除現有的 PVC、PV 或資料。 移除外掛程式時,會從叢集移除所有相關的 Pod 及常駐程式集。 移除外掛程式後,您將無法為叢集配置新的區塊儲存,也無法使用現有的區塊儲存 PVC 和 PV。

開始之前:

若要移除外掛程式,請執行下列動作:

  1. 找出您在叢集中安裝的區塊儲存 Helm 圖表的版本名稱與命名空間。

    helm ls -A
    

    輸出範例

    NAME            NAMESPACE   REVISION    UPDATED                             STATUS   CHART                                  APP VERSION
    block-plugin    default     1           2022-01-21 09:02:46.11622 -0500 EST deployed    ibmcloud-block-storage-plugin-v2.1.5
    
  2. 刪除 IBM Cloud Block Storage 外掛程式。

    helm uninstall NAME -n kube-system
    
  3. 驗證是否已移除區塊儲存空間 Pod。

    kubectl get pods -n kube-system | grep block
    

    如果 CLI 輸出中沒有顯示任何 Pod,則表示已成功移除 Pod。

  4. 驗證是否已移除區塊儲存空間類別。 如果 CLI 輸出中沒有顯示任何儲存空間類別,則表示已順利移除儲存空間類別。

    kubectl get sc | grep block
    

決定區塊儲存空間配置

IBM Cloud Kubernetes Service 為區塊儲存空間提供預先定義的儲存空間類別,您可以使用此類別搭配特定配置來佈建區塊儲存空間。

每個儲存空間類別都會指定您佈建的區塊儲存空間類型,包括可用的大小、IOPS、檔案系統及保留原則。

請務必小心選擇您的儲存空間配置,使其具有足夠的容量來儲存您的資料。 使用儲存類別配置特定類型的儲存空間後,您將無法變更該儲存裝置的類型或保留政策。 不過,如果想要增加您的儲存空間容量及效能,您可以變更大小及 IOPS。 若要變更儲存空間的類型和保留政策,您必須建立一個新的儲存實例,並將資料從舊的儲存實例複製到新的儲存實例中。

  1. 列出 IBM Cloud® Kubernetes Service 中可用的儲存空間類別。

    kubectl get sc | grep block
    

    輸出範例

    ibmc-block-bronze                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-custom                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-gold                        ibm.io/ibmc-block   Delete          Immediate           true                   148m
    ibmc-block-retain-bronze               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-custom               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-gold                 ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-retain-silver               ibm.io/ibmc-block   Retain          Immediate           true                   148m
    ibmc-block-silver                      ibm.io/ibmc-block   Delete          Immediate           true                   148m
    
  2. 檢閱儲存空間類別的配置。

    kubectl describe storageclass STORAGECLASS
    

    如需每一個儲存空間類別的相關資訊,請參閱儲存空間類別參照。 如果您找不到所需的內容,不妨考慮建立自己的自訂儲存類別。 若要開始使用,請參閱自訂的儲存空間類別範例

  3. 選擇您要佈建的區塊儲存空間的類型。

    • 青銅、白銀和黃金儲存等級: 這些儲存等級提供「耐力」儲存空間。 使用耐久性儲存空間,可以選擇預先定義 IOPS 層級的儲存空間大小(以 GB 為單位)。
    • 自訂儲存類別: 此儲存類別會配置「效能型」儲存空間。 使用效能儲存空間,您更能控制儲存空間大小及 IOPS。
  4. 選擇區塊儲存空間的大小及 IOPS。 大小及 IOPS 數目定義 IOPS(每秒的輸入/輸出作業數)總數,此 IOPS 可作為儲存空間有多快的指示器。 您的儲存空間的 IOPS 總數越大,其處理讀取及寫入作業的速度就越快。

    • **銅級、銀級和金級儲存空間類別:**這些儲存空間類別隨附每 GB 固定數目的 IOPS,並佈建在 SSD 硬碟上。 IOPS 總數取決於您選擇的儲存空間大小。 您可以選取所容許大小範圍內的任何整數的 GB 大小,例如 20 Gi、256 Gi 或 11854 Gi。 若要決定 IOPS 總數,您必須將 IOPS 乘以選取的大小。 例如,如果您在隨附每 GB 4 個 IOPS 的銀級儲存空間類別中選取 1000Gi 區塊儲存空間大小,則您的儲存空間總共有 4000 個 IOPS。
    儲存空間類別大小範圍及每 GB IOPS 數目的表格
    儲存空間類別 每 GB 的 IOPS 數目 大小範圍(以 GB 為單位)
    銅級 2 IOPS/GB 20-12000 Gi
    銀級 4 IOPS/GB 20-12000 Gi
    金級 10 IOPS/GB 20-4000 Gi
    • **自訂儲存空間類別:**當您選擇此儲存空間類別時,更能控制您想要的大小及 IOPS。 關於容量,您可以在允許的範圍內選擇任何整數的吉字節。 您選擇的大小決定了可供您使用的 IOPS 範圍。 您可以在指定範圍內選擇一個為 100 的倍數的 IOPS 值。 您選擇的 IOPS 是靜態的,不會隨著儲存空間大小一起調整。 例如,如果您選擇具有 100 IOPS 的 40Gi,則 IOPS 總數會保留 100。 IOPS 與 GB 的比例也會決定為您佈建之硬碟的類型。 舉例來說,若您使用 500Gi 且 IOPS 為 100,則您的 IOPS 對每 GB 的比率為 0.2。 比例小於或等於 0.3 的儲存空間會佈建在 SATA 硬碟上。 如果您的比例大於 0.3,則您的儲存空間會佈建在 SSD 硬碟上。
    Table class size ranges and IOPS
    大小範圍(以 GB 為單位) IOPS 範圍(以 100 的倍數表示)
    20-39 Gi 100-1000 IOPS
    40-79 Gi 100-2000 IOPS
    80-99 Gi 100-4000 IOPS
    100-499 Gi 100-6000 IOPS
    500-999 Gi 100-10000 IOPS
    1000-1999 Gi 100-20000 IOPS
    2000-2999 Gi 200-40000 IOPS
    3000-3999 Gi 200-48000 IOPS
    4000-7999 Gi 300-48000 IOPS
    8000-9999 Gi 500-48000 IOPS
    10000-12000 Gi 1000-48000 IOPS
  5. 選擇是否要在刪除叢集或持續性磁區要求 (PVC) 之後保留您的資料。

    • 如果要保留資料,則請選擇 retain 儲存空間類別。 當您刪除 PVC 時,只會刪除 PVC。 PV、IBM Cloud 基礎架構帳戶中的實體儲存裝置,以及您的資料仍然存在。 若要收回儲存空間,並再次在您的叢集裡使用它,您必須移除 PV,並遵循使用現有區塊儲存空間的步驟。
    • 如果您想要在刪除 PVC 時一併刪除 PV、資料及實體區塊儲存裝置,請選擇沒有 retain 的儲存空間類別。
  6. 選擇您要按小時還是按月計費。 預設值是按小時計費。

為 Block Storage for Classic 設定加密

您可以使用 IBM Key Protect 為 Block Storage for Classic 設定加密。

下列範例說明如何使用 Key Protect 及叢集的必要存取角色來建立服務 ID。 此服務 ID 的認證用來啟用 Block Storage for Classic 磁區的加密。

只要您擁有 Key Protect 範例的 Reader 服務存取角色,以及群集的 Viewer 平台存取角色和 Writer 服務存取角色,就可以透過建立使用個人 API 金鑰的 Kubernetes secret 來啟用加密功能。

請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 請確定您已獲指派 Key Protect 的「編輯者」平台存取角色及「撰寫者」服務存取角色,以便您可以建立自己的根金鑰,用來加密 Block Storage for Classic 實例。 您可以在 IAM 主控台中檢閱 IAM 存取角色。 如需 IAM 角色的相關資訊,請參閱 IAM 存取

  2. 如果您沒有 Key Protect 實例,請 佈建一個

  3. 建立根金鑰。 依預設,會建立沒有到期日的根金鑰。

  4. 建立 IAM 服務 ID。 將 <service_ID_name> 取代為您要指派給服務 ID 的名稱。 此服務 ID 用於從 Block Storage for Classic 磁區存取 Key Protect 實例。

    ibmcloud iam service-id-create <service_ID_name>
    

    輸出範例

    OK
    Service ID test-id is created successfully
    ID            ServiceId-a1a11111-bb11-1111-a11b-1111111a11ba   
    Name          test-id   
    Description      
    CRN           crn:v1:bluemix:public:iam-identity::a/1a1111aa2b11111aaa1a1111aa2aa111::serviceid:ServiceId-a1a11111-bb11-1111-a11b-1111111a11bb   
    Version       1-bb11aa11a0aa1a11a011a1aaaa11a1bb   
    Locked        false
    
  5. 為您的服務 ID 建立一個 API 金鑰。 將 <api-key-name> 取代為 API 金鑰的名稱,並將 <service_ID_name> 取代為您所建立服務 ID 的名稱。 請務必儲存 API 金鑰,因為稍後無法擷取它。 在後續步驟中,此 API 金鑰儲存在叢集裡的 Kubernetes 密鑰中。

    ibmcloud iam service-api-key-create <api_key_name> <service_ID_name>
    
  6. 擷取帳戶中已啟用 IAM 的服務清單,並記下您所建立 Key Protect 實例的名稱。

    ibmcloud resource service-instances
    
  7. 取得您的 Key Protect 實例的 GUID。 此 ID 用來建立服務 ID 的 IAM 服務原則。

    ibmcloud resource service-instance "<instance_name>" | grep GUID
    
  8. 建立 IAM 服務原則,以授與您的服務 ID 對 Key Protect 實例的存取權。 下列指令會將 Key Protect 實例的 Reader 存取權授與您的服務 ID。 「讀者」存取角色是服務 ID 擷取 Key Protect 金鑰所必須具備的最低服務存取角色。 如需相關資訊,請參閱 管理 Key Protect

    ibmcloud iam service-policy-create <service_ID_name> --roles Reader --service-name kms --service-instance <service_instance_GUID>
    
  9. 建立另一個 IAM 服務存取原則,以提供對叢集的服務 ID 存取權。 下列指令會將 檢視者 平台存取角色及 撰寫者 服務存取角色授與叢集的服務 ID。 您可以執行 ibmcloud ks cluster get <cluster_name> 來取得您的叢集 ID。

    ibmcloud iam service-policy-create <service_ID_name> --roles Writer,Viewer --service-name containers-kubernetes --service-instance <cluster_ID>
    
  10. 如果您已安裝 ibmcloud-block-storage-plugin Helm Chart,則必須移除 Helm Chart 並安裝新版本。

    如果您安裝外掛程式時沒有使用 Helm,您必須在安裝新版本之前,手動移除區塊儲存外掛程式部署及所有相關資源。

    helm uninstall <name> <namespace>
    
  11. 安裝 ibmcloud-block-storage-plugin Helm Chart。

    helm install <name> iks-charts/ibmcloud-block-storage-plugin
    
  12. 建立 ibm-block-secrets 名稱空間。

    kubectl create ns ibm-block-secrets
    
  13. 在區塊儲存空間外掛程式的 ibm-block-secrets 名稱空間中建立角色連結。

    kubectl create rolebinding ibmcloud-block-storage-plugin-byok --clusterrole=ibmcloud-block-storage-plugin-byok --serviceaccount=kube-system:ibmcloud-block-storage-plugin --group system:nodes --namespace=ibm-block-secrets
    
  14. 建立名為 secret.yaml 的 Kubernetes 密鑰,其中包含用於存取 Key Protect 服務實例中根金鑰的認證。

    1. 為該機密建立一個設定檔。
        apiVersion: v1
        kind: Secret
        metadata:
          labels:
            kmsConfig: kpc-secretLabel
          name: <secret_name> # Enter a name for your secret. Example: my_secret
          namespace: <namespace> # Enter the name of the namespace where you want to create the secret. The secret must be in same namespace where your app is deployed. Example: default
        stringData:
        config: |-
            {
                "api_key":"<service_id_api_key>", # Enter the API key for the service ID that you created. Example: "AA1aAAaA1a21AAaA1aAAaAa-AA-1AAaaA1aA1aAaaaAA"
                "iam_endpoint":"https://iam.cloud.ibm.com",
                "key_protect_endpoint":"https://<region>.kms.cloud.ibm.com", # Example: "https://us-east.kms.cloud.ibm.com"
                "root_key_crn":"<rook_key_crn>", # Example: "crn:v1:bluemix:public:kms:<region>:a/1ab011ab2b11111aaa1a1111aa1aa111:11aa111a-1111-11a1-a111-a11a111aa111:key:11a11111-1a1a-111a-111a-11111a1a1aa1",
                "version":""
            }
        type: ibm.io/kms-config
        ```
        `stringData.config.key_protect_endpoint`
        :   輸入 Key Protect 實例的地區端點。 如需 Key Protect 端點的清單,請參閱 [地區及端點](/docs/key-protect?topic=key-protect-regions)。
    
        `stringData.config.root_key_crn`
        :   請輸入您所建立的根金鑰的 CRN。 若要擷取根金鑰 CRN,請完成下列步驟。
            1. 導覽至 [IBM Cloud 主控台](https://cloud.ibm.com/resources){: external}中的資源清單。
            2. 按一下 **服務**,然後按一下 Key Protect 實例。
            3.  **動作功能表**上尋找根金鑰,然後按一下 **檢視 CRN**。
            4. 點擊「**複製**」按鈕以複製課程編號 (CRN)。
    
    1. 在叢集裡建立密碼。
    
    ```sh {: pre}
        kubectl apply -f secret.yaml
        ```
    1. 驗證已建立您的密鑰。
    
    ```sh {: pre}
        kubectl get secrets
        ```
    
  15. 在下列選項之間選擇,以建立使用根金鑰加密資料的 Block Storage for Classic 實例。

使用您自己的儲存空間類別來加密磁區資料

您可以先建立自己的儲存空間類別,以部署使用已加密磁區的應用程式。

下列步驟說明如何建立自訂加密儲存空間類別,您可以使用該類別來建立具有相同配置的多個加密區塊儲存空間實例。 如果您想要使用其中一個 IBM提供的儲存空間類別來建立加密 PVC,則可以透過 直接在 PVC 中參照 Key Protect 認證 來執行此動作。

  1. 決定儲存體配置

  2. 建立您自己的儲存空間類別,以使用其中一個 IBM提供的儲存空間類別作為基礎,來佈建已加密的區塊儲存空間實例。 您可以執行 kubectl get sc <storageclass_name> -o yaml 來擷取儲存類別的詳細資料。 下列範例基於 ibmc-block-retain-bronze 儲存類別。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: <name> # Enter the name of the storage class. Example: my_custom_storageclass
    parameters:
      billingType: hourly
      classVersion: "2"
      fsType: ext4
      iopsPerGB: "2"
      sizeRange: '[20-12000]Gi'
      type: Endurance
      encrypted: "true" # Enter "true" to enable encryption.
      encryptionKeySecret: <secret_name> # # #nter the name of the secret that you created earlier.Example: my_secret
      encryptionKeyNamespace: <namespace> # # #nter the namespace where you created your secret. Example: default
    provisioner: ibm.io/ibmc-block
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    
  3. 在叢集裡建立儲存空間類別。

    kubectl apply -f storageclass.yaml
    
  4. 使用您自己的儲存空間類別來建立 PVC,以將 Block Storage for Classic 新增至應用程式。

  5. 驗證 Block Storage for Classic 磁區 的加密。

建立可參照 Block Storage for Classic 密鑰的 PVC

您可以透過建立 PVC 來提供加密的 Block Storage for Classic,PVC 會指定持有 Key Protect 認證的 Kubernetes 秘 密。

下列步驟顯示如何在 PVC 中參照 Key Protect 認證,以建立已加密的 Block Storage for Classic 實例。 若要在每一個 PVC 中建立多個加密磁區,而不指定 Key Protect 認證,您可以 建立自訂加密儲存類別

  1. 檢閱所提供的 Block Storage for Classic 儲存空間類別,以判定哪些儲存空間類別最符合您的應用程式需求。 如果提供的儲存空間類別不符合您的應用程式需求,您可以建立自己的 自訂儲存空間類別

  2. 建立名為 pvc.yaml 且參照 Kubernetes 密鑰 (您在其中儲存 Key Protect 服務認證) 的 PVC 配置檔。 若要建立此密鑰,請參閱 設定 Block Storage for Classic的加密

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <pvc_name> # Enter a name for your PVC.
      annotations:
      volume.beta.kubernetes.io/storage-class: "<storage_class>" # Enter a storage class. To see a list of storageclasses run `kubectl get storageclasses`.
      labels:
        encrypted: "true"
        encryptionKeyNamespace: <namespace> # Enter the namespace where your secret was created.
        encryptionKeySecret: <secret_name> # Enter the name of the secret you created.
    spec:
      accessModes:
        - ReadWriteOnce
        resources:
        requests:
            storage: 20Gi
    
  3. 在叢集裡建立 PVC。

    kubectl apply -f pvc.yaml
    
  4. 請檢查您的 PVC 狀態。

    kubectl get pvc
    
  5. 等待 PVC 連結,然後 建立使用 PVC 的部署

  6. 驗證 Block Storage for Classic 磁區 的加密。

驗證 Block Storage for Classic 磁區的加密

您可以透過檢查磁區裝載路徑來驗證磁區的加密。

  1. 請登入您的 App Pod。 將 <pod_name> 取代為裝載已加密 Block Storage for Classic 磁區的 Pod 名稱。

    kubectl exec <pod_name> -it bash
    
  2. 列出 Pod 的檔案系統。

    df -h
    
  3. 檢閱已加密 Block Storage for Classic 磁區的檔案系統路徑。

    • 已加密磁區的路徑結構為 /dev/mapper/<pvc-ID_encrypted>。 在此範例中,已加密磁區裝載至 Pod 中的 /test 檔案路徑。
        Filesystem                                            Size  Used Avail Use% Mounted on
        overlay                                                98G  8.2G   85G   9% /
        tmpfs                                                  64M     0   64M   0% /dev
        tmpfs                                                 2.0G     0  2.0G   0% /sys/fs/cgroup
        /dev/mapper/pvc-a011a111-1111-1111-111a-aaa1a1111a11_encrypted   20G   45M   20G   1% /test
        ```
    * 未加密磁區的路徑結構為 `dev/mapper/<random_string>`。
    
    ```sh {: screen}
        Filesystem                                     Size  Used Avail Use% Mounted on
        overlay                                         98G   16G   78G  17% /
        tmpfs                                           64M     0   64M   0% /dev
        tmpfs                                          7.9G     0  7.9G   0% /sys/fs/cgroup
        /dev/mapper/3600a09803830476e733f4e477370716e   24G   45M   24G   1% /test
        ```
    

移除您的 Kubernetes 秘 密並不會取消對卷資料的存取權。 如果您已建立僅限 Pod 部署,則必須刪除 Pod。 如果您已建立部署,則必須刪除部署。

將區塊儲存空間新增至應用程式

建立一個持久性卷請求 (PVC),以動態方式為您的叢集配置區塊儲存空間。 動態佈建將自動建立符合的持續性磁區 (PV),並在 IBM Cloud 基礎架構帳戶中訂購實際儲存裝置。

區塊儲存空間隨附一個 ReadWriteOnce 存取模式。 您一次只能將它裝載到叢集裡一個工作者節點上的一個 Pod。

開始之前:

希望在有狀態集合中部署區塊儲存空間嗎? 如需相關資訊,請參閱在有狀態集內使用區塊儲存空間

若要新增區塊儲存空間,請執行下列動作:

  1. 建立配置檔來定義持續性磁區要求 (PVC),以及將配置儲存為 .yaml 檔案。

    • 銅級、銀級、金級儲存空間類別的範例: 下列 .yaml 檔案會建立 "ibmc-block-silver" 儲存空間類別的 block-storage-pvc 要求,每小時計費,大小為 24Gi GB。
        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: block-storage-pvc
          labels:
            billingType: "hourly"
            region: us-south
            zone: dal13
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 24Gi
          storageClassName: ibmc-block-silver
        ```
    -  **使用您自己的儲存空間類別的範例**:
            以下 `.yaml` 檔案會建立一個名為 `block-storage-pvc` 的儲存配額,其儲存類別為 `ibmc-block-retain-custom`,採每小時計費,容量為 `45Gi` 吉位元組,IOPS  `"300"`。
    
    ```yaml {: codeblock}
        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: block-storage-pvc
          labels:
            billingType: "hourly"
            region: us-south
            zone: dal13
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 45Gi
              iops: "300"
          storageClassName: ibmc-block-retain-custom
        ```
    
        `name`
        :   輸入 PVC 名稱。
    
        `billingType`
        :    meta 資料標籤區段中,指定計算儲存體帳單的頻率:「每月」或「每小時」。 預設值為 "hourly"
    
        `region`
        :    meta 資料標籤區段中,指定您要佈建區塊儲存體的地區。 如果指定地區,則也須指定區域。 若未指定區域,或無法找到指定的區域,則儲存空間將建立在與您的叢集相同的區域中。  IBM Cloud Block Storage 外掛程式 1.0.1 版或更新版本支援此選項。 對於較舊的外掛程式版本,如果您有多區域叢集,則會根據循環式基準選取儲存空間佈建所在的區域,以在所有區域均勻地平衡磁區要求。 若要為儲存空間指定區域,您可以先建立[自訂的儲存空間類別](#block_multizone_yaml)。 然後,使用自訂的儲存空間類別建立 PVC。
    
        `zone`
        :    meta 資料標籤區段中,指定您要佈建區塊儲存空間的區域。 如果指定區域,則也須指定地區。 若未指定區域,或於多區域叢集中找不到所指定的區域,則會以輪詢方式選取區域。  IBM Cloud Block Storage 外掛程式 1.0.1 版或更新版本支援此選項。 對於較舊的外掛程式版本,如果您有多區域叢集,則會根據循環式基準選取儲存空間佈建所在的區域,以在所有區域均勻地平衡磁區要求。 若要為儲存空間指定區域,您可以先建立[自訂的儲存空間類別](#block_multizone_yaml)。 然後,使用自訂的儲存空間類別建立 PVC。
    
        `storage`
        :   在規格資源要求區段中,輸入區塊儲存體的大小 (以 GB 為單位)。 儲存空間配置完成後,您將無法變更區塊儲存空間的大小。 請確定指定符合您要儲存的資料量的大小。
    
        `iops`
        :   此選項僅適用於您自己的自訂儲存空間類別 (`ibmc-block-custom / ibmc-block-retain-custom`)。在規格資源要求區段中,指定儲存空間的 IOPS 總計,並選取容許範圍內 100 的倍數。 如果您選擇的 IOPS 不是所列出的 IOPS,則會將 IOPS 無條件進位。
    
        `storageClassName`
        :   在「規格」區段中,請輸入您要用來配置區塊儲存的儲存類別名稱。 您可以選擇使用 [IBM 所提供的儲存類別](#block_storageclass_reference) 之一,或 [自行建立儲存類別](#block_custom_storageclass)。 若未指定儲存類別,該 PV 將以預設儲存類別「`ibmc-file-bronze`」建立。
    
    如果要使用自訂儲存空間類別,請使用對應的儲存空間類別名稱、有效的 IOPS 和大小來建立 PVC。
    {: tip}
    
    
  2. 建立 PVC。

    kubectl apply -f block-storage.yaml
    
  3. 驗證您的 PVC 已建立並已連結至 PV。 此處理程序可能需要幾分鐘的時間。

    kubectl get pvc
    

    輸出範例

    NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    block-storage-pvc              Bound    pvc-1aa1aaaa-11a1-48d1-ab11-11b11111f3bc   45Gi       RWO            ibmc-block-silver   150m
    
  4. 若要將 PV 掛載至您的部署,請建立一個名為 .yaml 的配置檔案,並指定與該 PV 綁定的 PVC。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <deployment_name>
      labels:
        app: <deployment_label>
    spec:
      selector:
        matchLabels:
          app: <app_name>
      template:
        metadata:
          labels:
            app: <app_name>
        spec:
          containers:
          - image: <image_name>
            name: <container_name>
            volumeMounts:
            - name: <volume_name>
              mountPath: /<file_path>
          volumes:
          - name: <volume_name>
            persistentVolumeClaim:
              claimName: <pvc_name>
    
    app
    在 meta 資料中,輸入部署的標籤。
    matchLabels.applabels.app
    在規格選取器及範本 meta 資料中,輸入應用程式的標籤。
    image
    您要使用的容器映像檔名稱。 若要列出 IBM Cloud Container Registry 帳戶中的可用映像檔,請執行 ibmcloud cr image-list
    name
    您要部署至叢集的容器的名稱。
    mountPath
    在儲存器磁區裝載區段中,輸入在儲存器內裝載磁區的目錄絕對路徑。 寫入掛載路徑的資料,會儲存於您的實體區塊儲存實例的根目錄下。 若要讓不同應用程式共用同一個卷,您可以為每個應用程式指定 卷的子路徑
    name
    在容器磁區裝載區段中,輸入要裝載至 Pod 的磁區名稱。
    name
    在磁區區段中,輸入要裝載至 Pod 的磁區名稱。 通常,此名稱與 volumeMounts/name 相同。
    claimName
    在磁區持續性磁區要求區段中,輸入連結您要使用之 PV 的 PVC 名稱。
  5. 建立部署。

    kubectl apply -f <local_yaml_path>
    
  6. 驗證已順利裝載 PV。

    kubectl describe deployment <deployment_name>
    

    裝載點在 Volume Mounts(磁區裝載)欄位中,而磁區在 Volumes(磁區)欄位中。

    Volume Mounts:
        /var/run/secrets/kubernetes.io/serviceaccount from default-token-tqp61 (ro)
        /volumemount from myvol (rw)
    ...
    Volumes:
    myvol:
        Type:    PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:    block-storage-pvc
        ReadOnly:    false
    

在叢集裡使用現有的區塊儲存空間

如果您已有現有的實體儲存裝置,並希望在叢集中使用,可以手動建立 PV 和 PVC,以靜態方式配置儲存空間。

在可以開始將現有儲存空間裝載至應用程式之前,您必須擷取所有適用於 PV 的必要資訊。

檢索您現有區塊儲存的相關資訊

  1. 擷取或產生 IBM Cloud 基礎架構帳戶的 API 金鑰。

    1. 請登入 IBM Cloud 基礎架構入口網站
    2. 依序選取帳戶使用者使用者清單
    3. 尋找您的使用者 ID。
    4. API 金鑰直欄中,按一下產生以產生 API 金鑰,或按一下檢視以檢視現有的 API 金鑰。
  2. 取得您的 IBM Cloud 基礎架構帳戶的 API 使用者名稱。

    1. 使用者清單功能表中,選取您的使用者 ID。
    2. API 存取資訊區段中,尋找您的 API 使用者名稱
  3. 登入 IBM Cloud 基礎架構 CLI 外掛程式。

    ibmcloud sl init
    
  4. 請選擇使用您的 IBM Cloud 基礎架構帳戶的用戶名稱和 API 金鑰進行驗證。

  5. 請輸入您在前幾個步驟中取得的用戶名稱和 API 金鑰。

  6. 列出可用的區塊儲存裝置。

    ibmcloud sl block volume-list
    

    輸出範例

    id          username              datacenter   storage_type                capacity_gb   bytes_used   lunId   
    11111111    IBM01AAA1111111-1     wdc07        endurance_block_storage     45            -            2      
    
  7. 擷取磁區詳細資料。 將 <volume_ID> 取代為您在步驟 6 中擷取的 Block Storage 磁區 ID。

    ibmcloud sl block volume-detail <volume_ID>
    

    輸出範例

    ID                         11111111
    User name                  IBM01AAA1111111-1   
    Type                       endurance_block_storage   
    Capacity (GB)              45   
    LUN Id                     2   
    IOPs                       100   
    Datacenter                 wdc07   
    Target IP                  10.XXX.XX.XXX  
    # of Active Transactions   0   
    Replicant Count            0
    
  8. 記下您要裝載至叢集的 IDCapacityLUN IdDatacenterTarget IP 磁區。 **附註:**若要將現有儲存空間裝載至叢集,您必須在與儲存空間相同的區域中具有工作者節點。 要驗證您的工作節點所屬的區域,請執行 ibmcloud ks worker ls --cluster <cluster_name_or_ID>

建立一個持久卷 (PV) 及其對應的持久卷請求 (PVC)

  1. 選填:若您已使用「retain」儲存類別進行儲存資源配置,當您移除 PVC 時,PV 及實體儲存裝置並不會被移除。 若要在叢集裡重複使用儲存空間,您必須先移除 PV。 列出現有 PV,並尋找屬於持續性儲存空間的 PV。 PV 處於 released 狀況。

    kubectl get pv
    
  2. 移除 PV。

    kubectl delete pv <pv_name>
    
  3. 請確認已移除 PV。

    kubectl get pv
    
  4. 建立 PV 的配置檔。 包括您先前擷取的參數。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "block-storage-pv" # Enter a name for your PV. For example, my-static-pv.
      labels:
         failure-domain.beta.kubernetes.io/region: "<region>" # Example us-east.
         failure-domain.beta.kubernetes.io/zone: "<zone>" # Example: wdc04. See /docs/containers?topic=containers-regions-and-zones#zones-sz
    spec:
      capacity:
        storage: "<storage>"
      accessModes:
        - ReadWriteOnce
      flexVolume:
        driver: "ibm/ibmc-block"
        fsType: "<fs_type>" # Enter ext or xfs
        options:
          "Lun": "<Lun_ID>"
          "TargetPortal": "<TargetPortal>"
          "VolumeID": "<VolumeID>"
          "volumeName": "block-storage-pv" # Enter the same value as your PV name from metadata.name
    
    name
    為您的 PV 取個名字。 例如,block-storage-pv。 請注意,您還必須在 spec.FlexVolume.options 中輸入此值作為 volumeName
    labels
    輸入您先前擷取的地區及區域。 您必須在與持續性儲存空間相同的地區及區域中至少具有一個工作者節點,才能在叢集裡裝載儲存空間。 若要擷取磁區詳細資料,請執行 ibmcloud sl block volume-list 以取得磁區 ID,然後執行 ibmcloud sl block volume-detail <volume_ID> 以取得磁區詳細資料。
    region
    請輸入您的區塊儲存裝置所在的區域。 請注意,您的叢集和區塊儲存空間必須位於相同的地區。 若要查詢您的叢集位置,請執行 ibmcloud ks cluster ls。 如需可用地區及區域的相關資訊,請參閱 地區及區域。 例如,us-east
    zone
    輸入儲存空間磁區所在的區域。 若要擷取磁區詳細資料,請執行 ibmcloud sl block volume-list 以取得磁區 ID,然後執行 ibmcloud sl block volume-detail <volume_ID> 以取得磁區詳細資料。 請注意,若要將區塊儲存空間連接至叢集,您必須在與您要連接的磁區相同的區域中具有可用的工作者節點。 若要尋找工作者節點的區域,請執行 ibmcloud ks worker ls -c <cluster>。 例如,wdc04
    storage
    輸入您要連接至叢集之現有區塊儲存空間磁區的儲存空間大小。 必須以 GB 為單位寫入儲存空間大小,例如 20Gi (20 GB) 或 1000Gi (1 TB)。 若要擷取磁區詳細資料,請執行 ibmcloud sl block volume-list 以取得磁區 ID,然後執行 ibmcloud sl block volume-detail <volume_ID> 以取得磁區的詳細資料。
    fsType
    輸入針對現有區塊儲存空間所配置的檔案系統類型。 請在 ext4xfs 之間選擇。 若未指定此選項,PV 預設值為 ext4。 若定義了錯誤的 fsType,PV 建立會成功,但將 PV 裝載到 Pod 會失敗。 若要擷取磁區詳細資料,請執行 ibmcloud sl block volume-list 以取得磁區 ID,然後執行 ibmcloud sl block volume-detail <volume_ID> 以取得磁區詳細資料。
    Lun
    輸入區塊儲存空間磁區的 LUN ID。 若要擷取磁區詳細資料,請執行 ibmcloud sl block volume-list 以取得磁區 ID,然後執行 ibmcloud sl block volume-detail <volume_ID> 以取得磁區詳細資料。
    TargetPortal
    請輸入您的區塊儲存裝置的 IP 位址。 若要擷取 TargetPortal 參數,請執行 ibmcloud sl block volume-list 以取得磁區 ID,然後執行 ibmcloud sl block volume-detail <volume_ID> 並在輸出中記下 Target IP
    VolumeId
    輸入區塊儲存空間的 ID。 若要擷取磁區詳細資料,請執行 ibmcloud sl block volume-list
    volumeName
    輸入與 PV 名稱相同的值。 例如,block-storage-pv
  5. 在叢集裡建立 PV。

    kubectl apply -f pv.yaml
    
  6. 驗證已建立 PV。

    kubectl get pv
    
  7. 建立另一個配置檔來建立您的 PVC。 為了讓 PVC 符合您先前建立的 PV,您必須對 storageaccessMode 選擇相同的值。 storage-class 欄位必須是空字串。 若這些欄位中有任何一項與 PV 不符,系統便會自動建立一個新的 PV。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: block-storage-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: "20Gi"
      storageClassName: ""
    
  8. 建立您的 PVC。

    kubectl apply -f static-pvc.yaml
    
  9. 驗證已建立 PVC,並將其連結至您先前建立的 PV。 此處理程序可能需要幾分鐘的時間。

    kubectl describe pvc static-pvc
    

    輸出範例

    Name:          static-pvc
    Namespace:     default
    StorageClass:  
    Status:        Bound
    
  10. 選用 將下列範例 Pod 配置儲存為稱為 pod.yaml 的檔案。

    apiVersion: v1
    kind: Pod
    metadata:
      name: block-storage
      labels:
        app: block-storage
    spec:
      containers:
        - name: block-storage
          image: nginx
          command: ["/bin/sh"]
          args: ["-c", "while true; do date \"+%Y-%m-%d %H:%M:%S\"; sleep 3600; done"]
          workingDir: /home
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          volumeMounts:
            - name: block-storage-pv
              mountPath: /home
      volumes:
        - name: block-storage-pv
          persistentVolumeClaim:
            claimName: block-storage-pvc
    
  11. 在您的叢集中建立該 Pod。

    kubectl create -f pod.yaml
    
  12. 在 Pod 處於 Running 狀態之後,取得日誌。

    kubectl logs
    

    輸出範例

    2022-01-21 16:11:00
    

您已順利建立 PV,並將它連結至 PVC。 然後,您會部署及使用區塊儲存空間的應用程式。 叢集使用者現在可以 將 PVC 掛載 至其部署,並開始從該持久性卷讀取及寫入資料。

在有狀態集合中使用區塊儲存空間

如果您具有有狀態應用程式(例如資料庫),則可以建立有狀態集合,以使用區塊儲存空間來儲存應用程式資料。 或者,您也可以使用 IBM Cloud 資料庫即服務,並將資料儲存在雲端。

在將區塊儲存新增至有狀態集時,我需要注意哪些事項?
若要將儲存空間新增至有狀態集合,您可以在有狀態集合 YAML 的 volumeClaimTemplates 區段中指定儲存空間配置。 volumeClaimTemplates 是您 PVC 的基礎,可以包括儲存空間類別以及您要佈建的區塊儲存空間大小或 IOPS。 不過,如果您要在 volumeClaimTemplates 中包括標籤,則在建立 PVC 時,Kubernetes 不會包括這些標籤。 相反地,您必須將標籤直接新增至有狀態集合。

您無法同時部署兩個帶狀態的集合。 如果您嘗試在完整部署不同的有狀態集合之前建立有狀態集合,則有狀態集合的部署可能會導致非預期的結果。

我該如何在特定區域中建立我的有狀態集?
在多區域叢集裡,您可以指定要在有狀態集合 YAML 的 spec.selector.matchLabelsspec.template.metadata.labels 區段中建立有狀態集合的區域及地區。 或者,您也可以將這些標籤新增至自訂的儲存空間類別,並在有狀態集合的 volumeClaimTemplates 區段中使用此儲存空間類別。
我能否將 PV 與我的有狀態 Pod 的綁定延遲,直到該 Pod 準備就緒為止?
是,您可以為 PVC 建立自己的儲存空間類別,其中包括 volumeBindingMode: WaitForFirstConsumer 欄位。
要為有狀態集 (stateful set) 新增區塊儲存,有哪些選項?
如果您要在建立有狀態集合時自動建立 PVC,請使用動態佈建。 您也可以選擇使用有狀態集合來預先佈建 PVC 或使用現有 PVC

建立有狀態集時使用動態佈建來建立 PVC

如果您要在建立有狀態集合時自動建立 PVC,請使用此選項。

開始之前:請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

請完成下列步驟,以驗證叢集裡所有現有的有狀態集是否已完全部署。 如果某個有狀態集仍在部署中,您將無法開始建立您的有狀態集。 您必須等到叢集裡的所有有狀態集合皆已完整部署,才能避免非預期的結果。

  1. 列出叢集裡的現有有狀態集合。

    kubectl get statefulset --all-namespaces
    

    輸出範例

    NAME              DESIRED   CURRENT   AGE
    mystatefulset     3         3         6s
    
  2. 檢視每個有狀態集合的 Pod 狀態,確定已完成有狀態集合的部署。

    kubectl describe statefulset <statefulset_name>
    

    輸出範例

    Name:               nginx
    Namespace:          default
    CreationTimestamp:  Fri, 05 Oct 2022 13:22:41 -0400
    Selector:           app=nginx,billingType=hourly,region=us-south,zone=dal10
    Labels:             app=nginx
    billingType=hourly
    region=us-south
    zone=dal10
    Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"podManagementPolicy":"Par..."
    Replicas:           3 desired | 3 total
    Pods Status:        0 Running / 3 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
    Labels:  app=nginx
    billingType=hourly
    region=us-south
    zone=dal10
    ...
    

    當您在 CLI 輸出的 Replicas 區段中找到的抄本數目等於 Pods Status 區段中的 Running Pod 數目時,即已完整部署有狀態集合。 如果尚未完整部署有狀態集合,請先等到部署完成之後,再繼續。

  3. 建立有狀態集的配置檔,以及您用來公開有狀態集的服務。 下列範例顯示如何將 NGINX 部署為具有三個抄本的有狀態集合。 對於每個抄本,都會根據 ibmc-block-retain-bronze 儲存空間類別中所定義的規格,來佈建 20 GB 的區塊儲存裝置。 所有儲存裝置都會佈建在 dal10 區域。 由於無法從其他區域存取區塊儲存,因此 StatefulSet 的所有副本也皆部署於位於 dal10 的工作節點上。

    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: nginx
    spec:
      serviceName: "nginx"
      replicas: 3
      podManagementPolicy: Parallel
      selector:
        matchLabels:
        app: nginx
        billingType: "hourly"
        region: "us-south" # Enter the region where your cluster is located.
        zone: "dal10"
    template:
      metadata:
      labels:
          app: nginx
          billingType: "hourly"
          region: "us-south"
          zone: "dal10"
      spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myvol
        mountPath: /usr/share/nginx/html
    volumeClaimTemplates:
    - metadata:
        name: myvol
        spec:
        accessModes:
        - ReadWriteOnce
        resources:
            requests:
            storage: 20Gi
            iops: "300" #required only for performance storage
        storageClassName: ibmc-block-retain-bronze
    

    下列範例顯示如何將 NGINX 部署為具有三個抄本的有狀態集合。 有狀態集合未指定區塊儲存空間建立所在的地區及區域。 相反地,有狀態集合會使用反親緣性規則,確保 Pod 分散到各工作者節點和區域。 透過定義 topologykey: failure-domain.beta.kubernetes.io/zone,若某個工作節點與具有 app: nginx 標籤的 Pod 位於同一區域,則 Kubernetes 排程器將無法將 Pod 排程至該工作節點。 對於每個有狀態集合 Pod,會建立兩個 PVC(如 volumeClaimTemplates 區段中所定義),但會將建立區塊儲存空間實例延遲到排定用於使用儲存空間的有狀態集合 Pod。 此設定稱為「具拓撲意識的卷排程」。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-block-bronze-delayed
    parameters:
      billingType: hourly
      classVersion: "2"
      fsType: ext4
      iopsPerGB: "2"
      sizeRange: '[20-12000]Gi'
      type: Endurance
    provisioner: ibm.io/ibmc-block
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    ---
    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: 3
      podManagementPolicy: "Parallel"
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - nginx
                  topologyKey: failure-domain.beta.kubernetes.io/zone
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: myvol1
              mountPath: /usr/share/nginx/html
            - name: myvol2
              mountPath: /tmp1
      volumeClaimTemplates:
      - metadata:
          name: myvol1
        spec:
          accessModes:
          - ReadWriteOnce # access mode
          resources:
            requests:
              storage: 20Gi
          storageClassName: ibmc-block-bronze-delayed
      - metadata:
          name: myvol2
        spec:
          accessModes:
          - ReadWriteOnce # access mode
          resources:
            requests:
              storage: 20Gi
          storageClassName: ibmc-block-bronze-delayed
    
    name
    輸入有狀態集合的名稱。 您輸入的名稱將用於建立您的 PVC 的名稱,格式為:<volume_name>-<statefulset_name>-<replica_number>
    serviceName
    輸入您要用來公開有狀態集合的服務名稱。
    replicas
    輸入有狀態集合的抄本數目。
    podManagementPolicy
    輸入您要用於有狀態集合的 Pod 管理原則。
    • OrderedReady:選取此選項時,有狀態集的複本將依序部署。 例如,如果您已指定三個抄本,則 Kubernetes 會為您的第一個抄本建立 PVC、等待 PVC 連結、部署有狀態集合抄本,以及將 PVC 裝載至抄本。 部署完成之後,會部署第二個抄本。 如需有關此選項的更多資訊,請參閱 OrderedReady Pod 管理
    • 並行:選取此選項後,所有有狀態集(stateful set)複本的部署將同時啟動。 如果您的應用程式支援平行部署抄本,則請使用此選項來儲存您 PVC 及有狀態集合抄本的部署時間。
    matchLabels
    在「規格選擇器」區段中,請輸入您希望納入狀態化集(stateful set)及 PVC 中的所有標籤。 您在有狀態集(stateful set)的 volumeClaimTemplates 中包含的標籤,不會被 Kubernetes 識別。 您可能想要包含的範例標籤如下:
    • 區域與 分區:若您希望所有有狀態集(stateful set)的複本及 PVC 皆建立於某個特定分區中,請同時新增這兩項標籤。 您也可以在所使用的儲存空間類別中指定區域及地區。 若您未指定區域和區域,且擁有多區域叢集,系統將以輪詢方式選取用於配置儲存的區域,以將卷請求均勻地分佈至所有區域。
    • billingType: 請輸入您要為 PVC 使用的計費類型。 請選擇 hourlymonthly。 若未指定此標籤,所有 PVC 皆會以「每小時計費」類型建立。
    labels
    在規格範本 meta 資料區段中,輸入您新增至 spec.selector.matchLabels 區段的相同標籤。
    affinity
    在 spec 範本的 spec 區段中,請指定您的反親和性規則,以確保您的 StatefulSet Pod 能分散部署於各工作節點和區域之間。 此範例顯示偏好不要在工作者節點上排定有狀態集合 Pod 的反親緣性規則,其中 Pod 具有 app: nginx 標籤。 如果工作者節點與具有 topologykey: failure-domain.beta.kubernetes.io/zone 標籤的 Pod 位於相同的區域,則 app: nginx 會進一步限制此反親緣性規則,以及防止在工作者節點上排定 Pod。 使用此反親緣性規則,您可以跨各工作者節點和區域達到反親緣性。
    name
    在規格磁區要求範本 meta 資料區段中,輸入磁區的名稱。 請使用您在「spec.containers.volumeMount.name」區段中定義的相同名稱。 您在此處輸入的名稱將用於建立您的 PVC 名稱,格式為:<volume_name>-<statefulset_name>-<replica_number>
    storage
    在規格磁區要求範本規格資源要求區段中,輸入區塊儲存體的大小 (GB)。
    iops
    在規格磁區要求範本規格資源要求區段中,如果您要佈建 效能儲存體,請輸入 IOPS 數目。 如果您使用耐久性儲存空間類別,並指定 IOPS 數目,則會忽略 IOPS 數目。 相反地,會使用儲存空間類別中所指定的 IOPS。
    storageClassName
    在規格磁區要求範本規格區段中,輸入您要使用的儲存類別。 若要列出現有的儲存類別,請執行 kubectl get sc | grep block。 若未指定儲存類別,該 PVC 將採用叢集中設定的預設儲存類別進行建立。 請確保預設儲存類別使用「ibm.io/ibmc-block」配置程式,以便您的有狀態集能透過區塊儲存進行配置。
  4. 建立有狀態集合。

    kubectl apply -f statefulset.yaml
    
  5. 等待部署有狀態集合。

    kubectl describe statefulset <statefulset_name>
    

    若要查看 PVC 的現行狀態,請執行 kubectl get pvc。 您的 PVC 名稱格式為 <volume_name>-<statefulset_name>-<replica_number>

利用現有 PVC 透過有狀態集合進行靜態配置

您可以在使用有狀態集合來建立有狀態集合或使用現有 PVC 之前,預先佈建 PVC。

如果您在建立有狀態集合時動態佈建 PVC,則會根據有狀態集合 YAML 檔案中所使用的值來指派 PVC 名稱。 若要讓有狀態集合使用現有 PVC,則 PVC 名稱必須符合使用動態佈建時所自動建立的名稱。

開始之前:請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 如果您要在建立有狀態集合之前預先佈建有狀態集合的 PVC,請遵循將區塊儲存空間新增至應用程式中的步驟 1-3,以建立每個有狀態集合抄本的 PVC。 請務必以符合以下格式的名稱建立您的 PVC:<volume_name>-<statefulset_name>-<replica_number>
volume_name

請在您的有狀態集(stateful set)的「spec.volumeClaimTemplates.metadata.name」區段中,指定您想要的名稱,例如 nginxvol

statefulset_name

請在您的有狀態集(stateful set)的「metadata.name」區段中,指定您想要的名稱,例如 nginx_statefulset

replica_number

請輸入您的複本編號,編號從 0 開始。

例如,如果您必須建立三個有狀態集合抄本,請建立具有下列名稱的三個 PVC:nginxvol-nginx_statefulset-0nginxvol-nginx_statefulset-1nginxvol-nginx_statefulset-2

要為現有儲存裝置建立 PVC 和 PV 嗎? 使用靜態佈建,以建立 PVC 和 PV。

  1. 遵循動態佈建:在建立有狀態集合時建立 PVC 中的步驟,以建立有狀態集合。 您的 PVC 名稱遵循以下格式:<volume_name>-<statefulset_name>-<replica_number>。 請務必使用有狀態集合規格中的下列 PVC 名稱值: spec.volumeClaimTemplates.metadata.name : 請輸入您 PVC 名稱的 <volume_name>
metadata.name

請輸入您 PVC 名稱的 <statefulset_name>

spec.replicas

請輸入您要為該有狀態集建立的複本數量。 抄本數目必須等於您先前所建立的 PVC 數目。

如果您的 PVC 位於不同的區域中,請勿在您的狀態化集合中包含區域或區域標籤。

  1. 列出叢集裡的 Pod,以驗證在有狀態集抄本 Pod 中使用 PVC。 識別屬於有狀態集合的 Pod。

    kubectl get pods
    
  2. 驗證現有 PVC 已裝載至有狀態集合抄本。 請檢閱 CLI 輸出之 ClaimName 區段中的 Volumes

    kubectl describe pod <pod_name>
    

    輸出範例

    Name:           nginx-0
    Namespace:      default
    Node:           10.xxx.xx.xxx/10.xxx.xx.xxx
    Start Time:     Fri, 05 Oct 2022 13:24:59 -0400
    ...
    Volumes:
    myvol:
      Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
      ClaimName:  myvol-nginx-0
    ...
    

變更現有儲存裝置的大小及 IOPS

如果您要增加儲存空間容量或效能,則可以修改現有磁區。

如需計費的相關問題,以及尋找如何使用 IBM Cloud 主控台來修改儲存空間的步驟,請參閱擴充 Block Storage 容量調整 IOPS。 您從主控台進行的更新不會反映在持續性磁區 (PV) 中。 若要將此資訊新增至 PV,請執行指令 kubectl patch pv <pv_name> ,並在 PV 的「 標籤註解 」區段中手動更新容量和 IOPS 數值。

  1. 列出叢集裡的 PVC,並記下 VOLUME 直欄中關聯 PV 的名稱。

    kubectl get pvc
    

    輸出範例

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    myvol            Bound     pvc-01ac123a-123b-12c3-abcd-0a1234cb12d3   20Gi       RWO            ibmc-block-bronze    147d
    
  2. 如果您想要變更區塊儲存空間的 IOPS 和大小,請先在 PV 的 metadata.labels.IOPS 區段編輯 IOPS。 您可以增加或減少 IOPS 值。 確保輸入您擁有的儲存空間類型支援的 IOPS。 例如,如果具有 4 IOPS 的耐久性區塊儲存空間,則可以將 IOPS 變更為 2 或 10。 如需更多支援的 IOPS 值,請參閱決定區塊儲存空間配置

    kubectl edit pv <pv_name>
    

    若要透過 CLI 變更 IOPS,還必須變更區塊儲存空間的大小。 如果要僅變更 IOPS,而不變更大小,則必須透過主控台要求 IOPS 變更

  3. 編輯 PVC 並在 PVC 的 spec.resources.requests.storage 區段中新增大小。 可以變更為更大的大小,但不能超過儲存空間類別設定的上限容量。 您無法縮小現有儲存空間的容量。 若要查看儲存空間類別的可用大小,請參閱決定區塊儲存空間配置

    kubectl edit pvc <pvc_name>
    
  4. 驗證是否已要求磁區擴充。 在 CLI 輸出的 FileSystemResizePendingConditions** 區段中看到 ** 訊息時,表示已順利要求磁區擴充。

    kubectl describe pvc <pvc_name>
    

    輸出範例

    ...
    Conditions:
    Type                      Status  LastProbeTime                     LastTransitionTime                Reason  Message
    ----                      ------  -----------------                 ------------------                ------  -------
    FileSystemResizePending   True    Mon, 01 Jan 0001 00:00:00 +0000   Thu, 25 Apr 2022 15:52:49 -0400           Waiting for user to (re-)start a pod to finish file system resize of volume on node.
    
  5. 列出裝載了 PVC 的所有 Pod。 如果 Pod 已裝載 PVC,則會自動處理磁區擴充。 如果 Pod 未裝載 PVC,則必須將 PVC 裝載到 Pod,以便可以處理磁區擴充。

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
    

    已掛載的儲存區將以以下格式回傳:<pod_name>: <pvc_name>

  6. 如果 Pod 未裝載 PVC,請建立 Pod 或部署並裝載 PVC。 如果 Pod 裝載了 PVC,請繼續執行下一步。

  7. 驗證 CLI 輸出的 Labels 區段中的大小和 IOPS 是否已變更。 此處理程序可能需要幾分鐘的時間才能完成。

    kubectl describe pv <pv_name>
    

    輸出範例

    ...
    Labels:       CapacityGb=50
    Datacenter=dal10
    IOPS=500
    
  8. 請登入掛載該 PVC 的 Pod。

    kubectl exec <pod-name> -it -- bash
    
  9. 執行下列指令,以使用主機二進位檔。

    chroot /host
    
  10. 調整檔案系統大小。

    sudo resize2fs <filesystem-path>
    

    範例指令

    sudo resize2fs /dev/vdg
    
  11. 驗證檔案系統已調整大小。

    df -h
    

備份及還原資料

區塊儲存空間會佈建至與叢集裡工作者節點相同的位置。 儲存空間是在叢集化伺服器上由 IBM 管理,以在伺服器關閉時提供可用性。 不過,如果整個位置失敗,則不會自動備份區塊儲存空間,且可能無法存取它們。 若要避免資料遺失或損壞,您可以設定定期備份,以在需要時使用它們來還原您的資料。

檢閱區塊儲存空間的下列備份及還原選項:

設定定期 Snapshot

您可以針對區塊儲存空間設定定期 Snapshot,這是唯讀映像檔,會擷取實例在某個時間點的狀況。

若要儲存 Snapshot,您必須在區塊儲存空間上要求 Snapshot 空間。 Snapshot 儲存於相同區域內的現有儲存空間實例上。 如果使用者意外從磁區移除重要資料,您可以從 Snapshot 還原資料。 \n \n ** 若要為磁區建立 Snapshot ,請完成下列步驟。

  1. 請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  2. 登入 ibmcloud sl CLI。

    ibmcloud sl init
    
  3. 列出叢集裡的現有 PV。

    kubectl get pv
    
  4. 取得您要建立 Snapshot 空間之 PV 的詳細資料,並記下磁區 ID、大小及 IOPS。 其容量與 IOPS 數值會顯示在 CLI 輸出結果的「標籤」區段中。

    kubectl describe pv <pv_name>
    
  5. 要查找卷標識碼,請檢視 CLI 輸出中的「ibm.io/network-storage-id」註解。

  6. 使用您在前一個步驟中擷取的參數,建立現有磁區的 Snapshot 大小。

    ibmcloud sl block snapshot-order <volume_ID> --size <size> --tier <iops>
    
  7. 等待要建立的 Snapshot 大小。 當 CLI 輸出中的「快照大小 (GB)」從 0 變更為您訂購的大小時,即表示快照大小已成功配置。

    ibmcloud sl block volume-detail <volume_ID>
    
  8. 為您的磁區建立 Snapshot,並記下為您建立的 Snapshot ID。

    ibmcloud sl block snapshot-create <volume_ID>
    
  9. 驗證已順利建立 Snapshot。

    ibmcloud sl block snapshot-list <volume_ID>
    
  10. 設定 Snapshot 排程。 如需 Snapshot 排程可用選項的相關資訊,請參閱 CLI 文件

    ibmcloud sl block snapshot-enable VOLUME_ID <OPTIONS>
    
  11. 若要將資料從 Snapshot 還原至現有磁區,請執行下列指令。

    ibmcloud sl block snapshot-restore <volume_ID> <snapshot_ID>
    

將快照複製到另一個區域

若要在發生區域失敗時保護資料,您可以將 Snapshot 抄寫至另一個區域中設定的區塊儲存空間實例。

資料只能從主要儲存空間抄寫至備份儲存空間。 您無法將複製的區塊儲存實例掛載至叢集。 當主要儲存空間失敗時,您可以手動將抄寫的備份儲存空間設為主要儲存空間。 然後,您可以將它裝載至叢集。 還原主要儲存空間之後,您可以從備份儲存空間中還原資料。

複製儲存體

您可以在與原始儲存空間實例相同的區域中複製區塊儲存空間實例

在建立複本的時間點,複本具有與原始儲存空間實例相同的資料。 與抄本不同,請使用複本作為獨立於原始儲存空間實例外的儲存空間實例。 若要複製,請先設定磁區的 Snapshot。

將資料備份至 IBM Cloud® Object Storage

您可以使用 ibm-backup-restore 的 Helm 圖表,在您的叢集中啟動一個備份與還原 Pod。

這個 Pod 包含一個 Script,它會針對叢集裡的任何持續性磁區要求 (PVC) 執行一次性或定期備份。 資料會儲存在您於區域中設定的 IBM Cloud® Object Storage 實例中。

區塊儲存空間是以 RWO 存取模式進行裝載。 此存取容許一次僅將一個 Pod 裝載至區塊儲存空間。 若要備份資料,必須從儲存空間中卸載應用程式 Pod,將其裝載到備份 Pod,備份資料,然後將儲存空間重新裝載到應用程式 Pod。

若要讓資料有更高的可用性,並在發生區域失敗時保護應用程式,請設定第二個 Object Storage 實例,並在區域之間抄寫資料。 若需從您的 Object Storage 實例中還原資料,請使用 Helm 圖表所提供的還原 Pod。

在 Pod 和容器之間複製資料

您可以使用 kubectl cp [ 指令](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#cp){: external} ,將檔案和目錄複製到叢集中的 Pod 或特定容器內,或從其中複製出來。

請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

當您執行 kubectl cp 指令時,如果您未指定具有 -c 的儲存器,則該指令會使用 Pod 中第一個可用的儲存器。

將資料從您的本地端機器複製到叢集中的某個 Pod。

kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>

將叢集內某個 Pod 中的資料複製到您的本地端電腦。

kubectl cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>

將資料從您的本地端機器複製到您叢集中的某個 Pod 內所執行的特定容器中。

kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath> -c CONTAINER

儲存空間類別參照

銅級

名稱
ibmc-block-bronze
ibmc-block-retain-bronze
類型
耐久性儲存體
檔案系統
ext4
每 GB 的 IOPS 數目
2
大小範圍(以 GB 為單位)
20-12000 Gi
硬碟
SSD
收回原則
ibmc-block-bronze: 刪除
ibmc-block-retain-bronze: 保留

銀級

名稱
ibmc-block-silver
ibmc-block-retain-silver
類型
耐久性儲存體
檔案系統
ext4
每 GB 的 IOPS 數目
4
大小範圍(以 GB 為單位)
20-12000 Gi
硬碟
SSD
收回原則
ibmc-block-silver: 刪除
ibmc-block-retain-silver: 保留

金級

名稱
ibmc-block-gold
ibmc-block-retain-gold
類型
耐久性儲存體
檔案系統
ext4
每 GB 的 IOPS 數目
10
大小範圍(以 GB 為單位)
20-4000 Gi
硬碟
SSD
收回原則
ibmc-block-gold: 刪除
ibmc-block-retain-gold: 保留

自訂

名稱
ibmc-block-custom
ibmc-block-retain-custom
類型
效能檔案系統
ext4
IOPS 及大小
容量範圍(以吉位元組為單位)/IOPS 範圍(以 100 為單位)
  • 20-39 Gi / 100-1000 IOPS
  • 40-79 Gi / 100-2000 IOPS
  • 80-99 Gi / 100-4000 IOPS
  • 100-499 Gi / 100-6000 IOPS
  • 500-999 Gi / 100-10000 IOPS
  • 1000-1999 Gi / 100-20000 IOPS
  • 2000-2999 Gi / 200-40000 IOPS
  • 3000-3999 Gi / 200-48000 IOPS
  • 4000-7999 Gi / 300-48000 IOPS
  • 8000-9999 Gi / 500-48000 IOPS
  • 10000-12000 Gi / 1000-48000 IOPS
硬碟
IOPS 與 GB 的比例決定佈建之硬碟的類型。 若要判定 IOPS 與 GB 的比例,您可將 IOPS 除以儲存空間的大小。
範例:您選擇了 500Gi 的儲存空間,其 IOPS 為 100。 您的比例為 0.2 (100 IOPS/500Gi)。
按比例劃分的硬碟類型概覽:
  • 小於或等於 0.3:SATA
  • 大於 0.3:SSD
收回原則
ibmc-block-custom: 刪除
ibmc-block-retain-custom: 保留

自訂的儲存空間類別範例

您可以建立自訂的儲存空間類別,並使用 PVC 中的儲存空間類別。

IBM Cloud Kubernetes Service 提供預先定義的儲存空間類別,以佈建具有特定層級及配置的區塊儲存空間。 有時,您可能希望以預先定義的儲存類別中未涵蓋的不同配置來配置儲存空間。 您可以使用本主題中的範例,來尋找範例自訂儲存空間類別。

若要建立自訂的儲存空間類別,請參閱自訂儲存空間類別。 然後,在 PVC 中使用自訂的儲存空間類別

建立拓蹼察覺儲存空間

若要在多區域叢集裡使用區塊儲存空間,必須將 Pod 排定至與區塊儲存空間實例相同的區域,以讀取及寫入磁區。 在 Kubernetes 引進拓蹼察覺磁區排程之前,儲存空間的動態佈建會在建立 PVC 時自動建立區塊儲存空間實例。 然後,在建立 Pod 時,Kubernetes 排程器會嘗試將 Pod 部署至與區塊儲存空間實例相同的資料中心。

在不瞭解 Pod 限制的情況下,建立區塊儲存空間實例可能會導致不想要的結果。 例如,Pod 可能無法排定至與儲存空間相同的工作者節點,因為工作者節點的資源不足,或者工作者節點有污點,而且不容許排定 Pod。 使用拓蹼察覺磁區排程時,除非建立可使用儲存空間的第一個 Pod,否則會延遲區塊儲存空間實例。

若要使用「具拓撲意識的卷排程」功能,請確保您已安裝 IBM Cloud Block Storage 外掛程式,版本為 1.2.0 或更新版本。

下列範例顯示如何建立儲存空間類別,以將區塊儲存空間實例的建立延遲到可以排定使用此儲存空間的第一個 Pod。 若要延遲建立,您必須包括 volumeBindingMode: WaitForFirstConsumer 選項。 若未包含此選項,volumeBindingMode 將自動設定為 Immediate,且在建立 PVC 時,系統會一併建立區塊儲存實例。

耐力型區塊儲存的範例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-bronze-delayed
  parameters:
    billingType: hourly
    classVersion: "2"
    fsType: ext4
    iopsPerGB: "2"
    sizeRange: '[20-12000]Gi'
    type: Endurance
  provisioner: ibm.io/ibmc-block
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer

效能型區塊儲存的範例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-performance-storageclass
  labels:
  kubernetes.io/cluster-service: "true"
  provisioner: ibm.io/ibmc-block
  parameters:
    billingType: "hourly"
    classVersion: "2"
    sizeIOPSRange: |-
    "[20-39]Gi:[100-1000]"
    "[40-79]Gi:[100-2000]"
    "[80-99]Gi:[100-4000]"
    "[100-499]Gi:[100-6000]"
    "[500-999]Gi:[100-10000]"
    "[1000-1999]Gi:[100-20000]"
    "[2000-2999]Gi:[200-40000]"
    "[3000-3999]Gi:[200-48000]"
    "[4000-7999]Gi:[300-48000]"
    "[8000-9999]Gi:[500-48000]"
    "[10000-12000]Gi:[1000-48000]"
    type: "Performance"
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer

指定區域及地區

如果您要在特定區域中建立區塊儲存空間,則可以在自訂的儲存空間類別中指定區域及地區。

如果您使用 IBM Cloud Block Storage 外掛程式 1.0.0 版,或您要在特定區域中靜態佈建區塊儲存空間,請使用自訂的儲存空間類別。 在所有其他情況下,請直接在 PVC 中指定區域

下列 .yaml 檔案自訂以 ibm-block-silver 非保留儲存空間類別為基礎的儲存空間類別:type"Endurance"iopsPerGB4sizeRange"[20-12000]Gi",而 reclaimPolicy 設為 "Delete"。 區域指定為 dal12。 若要使用不同的儲存空間類別作為基礎,請參閱儲存空間類別參照

在與叢集和工作者節點相同的地區和區域中建立儲存空間類別。 若要取得您的叢集所在的區域,請執行 ibmcloud ks cluster get --cluster <cluster_name_or_ID> ,並在 **大師 URL** 中尋找區域前綴,例如 https://c2.eu-de.containers.cloud.ibm.com:11111`` 中的 eu-de 。 要取得您的工作節點所屬的區域,請執行 ibmcloud ks worker ls --cluster <cluster_name_or_ID>

耐力型區塊儲存的範例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-silver-mycustom-storageclass
  labels:
    kubernetes.io/cluster-service: "true"
provisioner: ibm.io/ibmc-block
parameters:
  zone: "dal12"
  region: "us-south"
  type: "Endurance"
  iopsPerGB: "4"
  sizeRange: "[20-12000]Gi"
reclaimPolicy: "Delete"

效能型區塊儲存的範例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
    name: ibmc-block-performance-storageclass
labels:
  kubernetes.io/cluster-service: "true"
provisioner: ibm.io/ibmc-block
parameters:
  zone: "dal12"
  region: "us-south"
  type: "Performance"
  sizeIOPSRange: |-
  "[20-39]Gi:[100-1000]"
  "[40-79]Gi:[100-2000]"
  "[80-99]Gi:[100-4000]"
  "[100-499]Gi:[100-6000]"
  "[500-999]Gi:[100-10000]"
  "[1000-1999]Gi:[100-20000]"
  "[2000-2999]Gi:[200-40000]"
  "[3000-3999]Gi:[200-48000]"
  "[4000-7999]Gi:[300-48000]"
  "[8000-9999]Gi:[500-48000]"
  "[10000-12000]Gi:[1000-48000]"
reclaimPolicy: "Delete"

使用 XFS 檔案系統裝載區塊儲存空間

下列範例建立使用 XFS 檔案系統來佈建區塊儲存空間的儲存空間類別。

耐力型區塊儲存的範例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-custom-xfs
labels:
  addonmanager.kubernetes.io/mode: Reconcile
provisioner: ibm.io/ibmc-block
parameters:
  type: "Endurance"
  iopsPerGB: "4"
  sizeRange: "[20-12000]Gi"
  fsType: "xfs"
reclaimPolicy: "Delete"

效能型區塊儲存的範例。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ibmc-block-custom-xfs
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
provisioner: ibm.io/ibmc-block
parameters:
  classVersion: "2"
  type: "Performance"
  sizeIOPSRange: |-
    [20-39]Gi:[100-1000]
    [40-79]Gi:[100-2000]
    [80-99]Gi:[100-4000]
    [100-499]Gi:[100-6000]
    [500-999]Gi:[100-10000]
    [1000-1999]Gi:[100-20000]
    [2000-2999]Gi:[200-40000]
    [3000-3999]Gi:[200-48000]
    [4000-7999]Gi:[300-48000]
    [8000-9999]Gi:[500-48000]
    [10000-12000]Gi:[1000-48000]
  fsType: "xfs"
reclaimPolicy: "Delete"

從叢集移除持續性儲存空間

在叢集裡設定持續性儲存空間時,有三個主要元件:Kubernetes 持續性磁區要求 (PVC)(用於要求儲存空間)、Kubernetes 持續性磁區 (PV)(將裝載到 Pod,並在 PVC 中進行說明)和 IBM Cloud 基礎架構實例(例如,標準檔案儲存空間或區塊儲存空間)。 這三個元件可能需要個別刪除,具體取決於儲存空間的建立方式。

瞭解儲存空間移除選項

從 IBM Cloud 帳戶移除持續性儲存空間,會根據儲存空間的佈建方式及已移除的元件而不同。

當我刪除叢集時,我的持久儲存會被刪除嗎?
在叢集刪除期間,您可以選擇移除持續性儲存空間。 不過,根據儲存空間的佈建方式,移除儲存空間可能不會包括所有儲存空間元件。 若您使用設定了 reclaimPolicy: Delete 的儲存類別來動態配置儲存空間,則在刪除叢集時,您的 PVC、PV 以及儲存實例將會自動被刪除。 對於靜態配置的儲存空間,或是您使用設定了 ` `reclaimPolicy: Retain 的儲存類別所配置的儲存空間,當您刪除叢集時,PVC 和 PV 將會被移除,但您的儲存實例和資料仍會保留。 仍然會向您收取儲存空間實例的費用。 此外,如果您已刪除處於性能不佳狀況的叢集,則即使您選擇要移除儲存空間,此儲存空間可能仍會存在。
如果我想保留叢集,該如何刪除儲存空間?
當您已使用設定 reclaimPolicy: Delete 的儲存空間類別來動態佈建儲存空間時,可以移除 PVC 以開始持續性儲存空間的刪除處理程序。 PVC、PV 及儲存空間實例會自動予以移除。 對於靜態配置的儲存空間,或是您使用設定了 reclaimPolicy: Retain`` 的儲存類別所配置的儲存空間,您必須手動移除 PVC、PV 以及儲存實例,以避免產生進一步的費用。
刪除儲存空間後,計費會如何停止?
取決於所刪除的儲存空間元件及時間,計費週期可能不會立即停止。 如果您刪除 PVC 及 PV,但未刪除 IBM Cloud 帳戶中的儲存空間實例,則該實例仍然存在,因此仍需要為此付費。

如果您刪除 PVC、PV 及儲存空間實例,則會根據您在佈建儲存空間時所選擇的 billingType 以及所選擇的刪除儲存空間方式,來停止計費週期。

  • 當您透過 IBM Cloud 控制台或 CLI 手動取消持久儲存實例時,計費將依下列方式停止:

    • 按小時計費儲存空間:立即停止計費。 取消儲存空間後,可能最長 72 小時內仍會在主控台裡看到該儲存空間實例。
    • 按月計費儲存空間:您可以選擇立即取消或在週年日取消。 在這兩種情況下,會一直計費直到現行計費週期結束,而且下一個計費週期會停止計費。 取消儲存空間後,可能最長 72 小時內仍會在主控台或 CLI 中看到該儲存空間實例。
    • 立即取消:選擇此選項,以立即移除儲存空間。 您和您的使用者都無法再使用儲存空間或回復資料。
    • 週年日:選擇此選項,以在下一個週年日取消儲存空間。 儲存空間實例會一直保持作用中狀態,直到下一個週年日為止,而且您在此日期之前都可以繼續使用它們,例如讓團隊有時間來備份資料。
  • 如果您已使用設定 reclaimPolicy: Delete 的儲存空間類別來動態佈建儲存空間,而且選擇移除 PVC,則會立即移除 PV 及儲存空間實例。 對於按小時計費的儲存空間,會立即停止計費。 對於按月計費的儲存空間,仍會向您收取當月剩餘時間的費用。 移除儲存空間且停止計費之後,最多可能長達 72 小時仍會在主控台或 CLI 中看到該儲存空間實例。

在刪除持久儲存空間之前,我需要注意哪些事項?
清除持續性儲存空間時,也會刪除其中儲存的所有資料。 如果您需要資料的副本,請進行備份。
我已刪除我的儲存實例。 為什麼我仍然可以看到我的實例?
移除持續性儲存空間後,要完全處理好移除作業並且讓儲存空間從 IBM Cloud 主控台或 CLI 中消失,最多可能需要長達 72 小時。

清除持續性儲存空間

從 IBM Cloud 帳戶中移除 PVC、PV 及儲存空間實例,以避免持續性儲存空間的進一步費用。

開始之前:

若要清除持續性資料,請執行下列動作:

  1. 列出叢集裡的 PVC,並記下 PVC 的 NAMESTORAGECLASS,以及連結至 PVC 並顯示為 VOLUME 的 PV 名稱。

    kubectl get pvc
    

    輸出範例

    NAME                  STATUS    VOLUME                                     CAPACITY   ACCESSMODES   STORAGECLASS            AGE
    claim1   Bound     pvc-06886b77-102b-11e8-968a-f6612bb731fb   20Gi       RWO           class       78d
    claim2     Bound     pvc-457a2b96-fafc-11e7-8ff9-b6c8f770356c   4Gi        RWX           class 105d
    claim3      Bound     pvc-1efef0ba-0c48-11e8-968a-f6612bb731fb   24Gi       RWX           class        83d
    
  2. 檢閱儲存空間類別的 ReclaimPolicybillingType

    kubectl describe storageclass <storageclass_name>
    

    如果收回原則指明為 Delete,則在您移除 PVC 時,也會移除 PV 及實體儲存空間。 如果收回原則指明為 Retain,或如果您已佈建儲存空間,但沒有儲存空間類別,則在您移除 PVC 時,不會移除 PV 及實體儲存空間。 您必須個別移除 PVC、PV 及實體儲存空間。

    如果儲存空間依月收費,即使在計費週期結束之前已移除儲存空間,也仍需要依整月付費。

  3. 移除任何裝載 PVC 的 Pod。 列出裝載 PVC 的 Pod。 若 CLI 輸出中未顯示任何 Pod,則表示您沒有任何 Pod 使用該 PVC。

    kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.persistentVolumeClaim.claimName}{" "}{end}{end}' | grep "<pvc_name>"
    

    輸出範例

    depl-12345-prz7b:    claim1
    
  4. 移除使用 PVC 的 Pod。 如果 Pod 是部署的一部分,便移除部署。

    kubectl delete pod <pod_name>
    
  5. 驗證已移除 Pod。

    kubectl get pods
    
  6. 移除 PVC。

    kubectl delete pvc <pvc_name>
    
  7. 檢閱 PV 的狀態。 請使用您先前擷取的 PV 名稱 VOLUME。 移除 PVC 時,會釋放連結至 PVC 的 PV。 視佈建儲存空間的方式而定,如果自動刪除 PV,您的 PV 會進入 Deleting 狀況,或者如果您必須手動刪除 PV,則 PV 會進入 Released 狀況。 附註:若為自動刪除的 PV,則在刪除它之前,狀況可能短暫地顯示為 Released。 請在幾分鐘後重新執行該指令以查看該 PV 是否已移除。

    kubectl get pv <pv_name>
    
  8. 如果 PV 未刪除,請手動移除 PV。

    kubectl delete pv <pv_name>
    
  9. 驗證已移除 PV。

    kubectl get pv
    
  10. 請列出您的 PV 所指向的實體儲存實例,並記錄 id 該實體儲存實例的相關資訊。

    ibmcloud sl block volume-list --columns id --columns notes | grep <pv_name>
    

    輸出範例

    12345678   {"plugin":"ibmcloud-block-storage-plugin-689df949d6-4n9qg","region":"us-south","cluster":"aa1a11a1a11b2b2bb22b22222c3c3333","type":"Endurance","ns":"default","pvc":"block-storage-pvc","pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7","storageclass":"ibmc-block-silver","reclaim":"Delete"}
    

    瞭解 Notes 欄位資訊:

    "plugin":"ibm-file-plugin-5b55b7b77b-55bb7"
    叢集所使用的儲存外掛程式。
    "region":"us-south"
    您的叢集所處的區域。
    "cluster":"aa1a11a1a11b2b2bb22b22222c3c3333"
    與該儲存實例相關聯的叢集 ID。
    "type":"Endurance"
    檔案或區塊儲存的類型,可選值為 EndurancePerformance
    "ns":"default"
    儲存實例所部署的命名空間。
    "pvc":"block-storage-pvc"
    與儲存實例相關聯的 PVC 名稱。
    "pv":"pvc-d979977d-d79d-77d9-9d7d-d7d97ddd99d7"
    與該儲存實例相關聯的 PV。
    "storageclass":"ibmc-file-gold"
    儲存類別的類型:青銅、白銀、黃金或自訂。
  11. 移除實體儲存空間實例。

    ibmcloud sl block volume-cancel <classic_block_id>
    
  12. 驗證已移除實體儲存空間實例。

刪除程序最長可能需要 72 小時才能完成。

ibmcloud sl block volume-list

設定監視 limited 連線功能 PV

當您建立使用 Block Storage for Classic的 Pod 及 PVC 時,會將 2 個目標埠指派給裝載儲存空間的基礎持續性磁區 (PV)。 多個目標埠容許在一個埠關閉時進行失效接手。

在舊版 Block Storage for Classic 驅動程式中,在實施期間裝載 PV 時找不到 2 個目標埠導致部署失敗。

不過,有時,例如在 IaaS 維護時間期間,您可能想要 Pod 順利部署,且在持續性磁區上只能使用 1 個目標埠。

從 Block Storage for Classic 驅動程式 2.4.12 版開始,Pod 將順利部署,即使 PV 只能指派 1 個目標埠。 除了此行為變更之外,PV 現在還包括新標籤,以指出網路可用性,其中標籤 healthy 表示已指派 2 個目標埠,而 limited 表示在裝載期間只能指派 1 個目標埠。

若要監視 Pod 連線至 Block Storage for Classic 受到限制的實例,您可以設定自訂警示來尋找 limited 標籤。 然後,將警示臨界值配置為 >0

  1. 從 IBM Cloud Monitoring 儀表板中,選取 新建警示 > 度量

  2. 選取 rom 查詢,然後輸入 kube_persistentvolume_labels{label_ibm_io_pv_connectivity_status='limited'}

  3. 將臨界值設為 >0,並設定您要用於此警示的嚴重性。

  4. 選取通知通道並儲存警示。

為區塊儲存指定可信設定檔

您可以使用受信任的設定檔,授權不同的 IBM Cloud 身分存取您帳戶中的資源,包括您的儲存解決方案。 可信賴的設定檔可集中存取控制、消除對長期使用的 API 金鑰的需求,並允許您將權限的範圍精確到特定任務所需的最小值。 如需詳細資訊,請參閱 設定儲存元件的可信設定檔