部署使用 COS 的應用

建立持續性磁區要求 (PVC),以為叢集佈建 IBM Cloud Object Storage。

根據您在 PVC 中選擇的設定,您可以使用下列方式來佈建 IBM Cloud Object Storage:

  • 動態配置:當您建立 PVC 時,系統會自動建立相應的持久性卷 (PV) 以及您 IBM Cloud Object Storage 服務實例中的儲存桶。
  • 靜態配置:您可以在 PVC 中引用 IBM Cloud Object Storage 服務實例中的現有儲存桶。 當您建立 PVC 時,只會自動建立相符的 PV,並將其鏈結至 IBM Cloud Object Storage 中的現有儲存區。

開始之前:

若要將 IBM Cloud Object Storage 新增至叢集,請執行下列動作:

  1. 建立配置檔以定義持續性磁區要求 (PVC)。 如果您將 IBM Cloud Object Storage 認證新增至預設儲存空間類別,請不要在 PVC 中列出密鑰。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <name> # Enter the name of the PVC.
      namespace: <namespace> # Enter the namespace where you want to create the PVC. The PVC must be created in the same namespace where you created the Kubernetes secret for your service credentials and where you want to run your pod.
      annotations:
        ibm.io/auto-create-bucket: "<true_or_false>"
        ibm.io/auto-delete-bucket: "<true_or_false>"
        ibm.io/bucket: "<bucket_name>"
        ibm.io/object-path: "<bucket_subdirectory>"
        ibm.io/quota-limit: "true/false" # Disable or enable a quota limit for your PVC. To use this annotation you must specify the -set quotaLimit=true option during installation.
        ibm.io/endpoint: "https://<s3fs_service_endpoint>"
        ibm.io/tls-cipher-suite: "default"
        ibm.io/secret-name: "<secret_name>" # The name of your Kubernetes secret that you created.
        ibm.io/secret-namespace: "<secret-namespace>" # By default, the COS plug-in searches for your secret in the same namespace where you create the PVC. If you created your secret in a namespace other than the namespace where you want to create your PVC, enter the namespace where you created your secret.
        ibm.io/add-mount-param: "<option-1>,<option-2>" # s3fs mount options
        ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX" # A csv of allow listed IPs.
        ibm.io/bucket-versioning: "false" # Set to true to enable bucket versioning.
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: <size>
      storageClassName: <storage_class>
    
    ibm.io/auto-create-bucket
    請從下列選項中進行選擇。
    true: 當您建立 PVC 時,IBM Cloud Object Storage 服務實例中的 PV 和儲存桶會自動建立。 選擇此選項,以在 IBM Cloud Object Storage 服務實例中建立新的儲存區。 請注意,服務認證必須具有 Writer 許可權才能自動建立儲存區。
    false: 若要存取現有儲存桶中的資料,請選擇此選項。 當您建立 PVC 時,系統會自動建立 PV,並將其連結至您在 ibm.io/bucket 中指定的儲存桶。
    ibm.io/auto-delete-bucket
    請從下列選項中進行選擇。
    true: 當您刪除 PVC 時,您的資料、儲存桶及 PV 將會自動被移除。 您的 IBM Cloud Object Storage 服務實例仍然存在,並未刪除。 若您選擇將此選項設定為「true」,則必須設定「ibm.io/auto-create-bucket: true」及「ibm.io/bucket: ""」,以便您的儲存桶能自動以「tmp-s3fs-xxxx」此格式建立名稱。
    false: 當您刪除 PVC 時,PV 會自動被刪除,但您的資料以及 IBM Cloud Object Storage 服務實例中的儲存桶仍會保留。 若要存取資料,您必須以現有儲存區的名稱建立新的 PVC。
    ibm.io/bucket
    請從下列選項中進行選擇。
    若已將 ibm.io/auto-create-bucket 設定為 true``:請在 IBM Cloud Object Storage 中輸入您要建立的儲存桶名稱。 此外,若已將「ibm.io/auto-delete-bucket」設定為「true」,則必須將此欄位留空,系統才會自動為您的儲存桶指派格式為 tmp-s3fs-xxxx 的名稱。 名稱在 IBM Cloud Object Storage 中必須是唯一的。
    若將「 ibm.io/auto-create-bucket 」設定為「 false 」:請輸入您要在叢集中存取的現有儲存桶名稱。
    ibm.io/object-path
    選用項目:輸入儲存區中您要裝載的現有子目錄名稱。 如果您只要裝載子目錄,而不是裝載整個儲存區,請使用此選項。 若要掛載子目錄,您必須設定 ibm.io/auto-create-bucket: "false" ,並在 ibm.io/bucket`` 中提供儲存桶的名稱。
    ibm.io/quota-limit
    若要使用此註釋,您必須在安裝期間指定 --set quotaLimit=true 選項。 如果您想要使用此註釋,但在安裝期間未指定 --set quotaLimit=true,請 重新安裝 helm Chart
    若將 ibm.io/quota-limit 設定為 true``,您的 PVC 將根據您指定的 storage: 大小,為該儲存桶設定可用的最大儲存空間(以位元組為單位)。
    如果 ibm.io/quota-limit 設為 false,則不會對 PVC 施行配額,表示實際儲存空間量 (以位元組為單位) 可能會超出您指定的 storage: <size> (視應用程式而定)。
    ibm.io/endpoint
    如果您是在與叢集不同的位置建立 IBM Cloud Object Storage 服務實例,請輸入您要使用的 IBM Cloud Object Storage 服務實例的私有或公有雲服務端點。 如需相關資訊及可用服務端點的概觀,請參閱 其他端點資訊。 預設情況下,ibmc Helm 外掛程式會自動擷取您的叢集位置,並透過與您的叢集位置相符的 IBM Cloud Object Storage 私有雲服務端點來建立儲存類別。 如果您的經典叢集位於多區域都會區(例如 dal10 ),則會使用該多區域都會區(例如達拉斯)的 IBM Cloud Object Storage 私有雲服務端點。 若要驗證儲存類別中的服務端點是否與您的服務實例的服務端點相符,請執行 oc describe storageclass <storageclassname>。 請務必以 https://<s3fs_private_service_endpoint> 的格式輸入私有雲服務端點,或以 http://<s3fs_public_service_endpoint> 的格式輸入公有雲服務端點。 如果您的儲存類別中的服務端點與您的 IBM Cloud Object Storage 服務實例的服務端點相符,請勿在 PVC YAML 檔案中包含 ibm.io/endpoint 選項。
    ibm.io/add-mount-param
    輸入 s3fs Fuse 磁區的裝載選項。 例如 ibm.io/add-mount-param: "del_cache,retries=6"。 如需選項清單,請參閱 s3fs 線上指令說明
    ibm.io/access-policy-allowed-ips
    輸入可以存取磁區的 IP 清單 (以逗點區隔)。 例如,ibm.io/access-policy-allowed-ips: "XX.XXX.XX.XXX, XX.XX.XX.XXX, XX.XX.XX.XX"
    storage
    在規格資源要求區段中,輸入 IBM Cloud Object Storage 儲存區的大小 (GB)。 您在 IBM Cloud Object Storage 上實際使用的空間可能有所不同,並將根據 定價表進行計費。 如果您在安裝外掛程式時已啟用配額,則儲存區的配額等於此大小。
    storageClassName
    請從下列選項中進行選擇。
    若為 ibm.io/auto-create-bucket: "true" :請輸入您要為新儲存桶使用的儲存類別。
    若為 ibm.io/auto-create-bucket: "false" :請輸入您用來建立現有儲存桶的儲存類別。
    如果您是手動在 IBM Cloud Object Storage 服務實例中建立儲存桶,或是不記得當時使用的儲存類別,請在 IBM Cloud 儀表板中找到您的服務實例,並檢視現有儲存桶的「 類別 」與「 位置 」。 然後,使用適當的儲存空間類別。 您儲存空間類別中所設定的 IBM Cloud Object Storage API 端點,是根據您叢集所在的地區。 若要存取位於與您的叢集所在區域不同的區域中的儲存桶,您必須建立自己的儲存類別,並使用該儲存桶對應的 API 端點。
    ibm.io/secret-name
    輸入保留您稍早建立之 IBM Cloud Object Storage 認證的密碼名稱。 如果您將 IBM Cloud Object Storage 認證 新增至預設儲存類別,則不得列出 PVC 中的密鑰。 如果您想要在從叢集裡的 PVC 建立新儲存區時整合 Key Protect 加密,則必須在建立 IBM Cloud Object Storage 密鑰 時包括根金鑰 CRN。 請注意,您無法將 Key Protect 加密新增至現有儲存區。
    secret-namespace
    依預設,COS 外掛程式會在您建立 PVC 的相同名稱空間中搜尋您的密碼。 如果您已在您要建立 PVC 之名稱空間以外的名稱空間中建立密碼,請輸入您在其中建立密碼的名稱空間。
    ibm.io/bucket-versioning
    儲存桶的版本控制預設設定為「false」。 設定為 true 以啟用水桶版本控制。 設定為 false 可停用已啟用版本控制的水桶的版本控制。 請注意,服務憑證必須具有 Manager 或 Writer 權限,才能在水桶上啟用或停用水桶版本控制。 如需更多資訊,請參閱《 版本控制入門 》。
  2. 在叢集裡建立 PVC。

    oc apply -f filepath/pvc.yaml
    
  3. 驗證您的 PVC 已建立並已連結至 PV。

    oc get pvc
    

    輸出範例

    NAME                  STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                     AGE
    s3fs-test-pvc         Bound     pvc-b38b30f9-1234-11e8-ad2b-t910456jbe12   8Gi        RWO            ibmc-s3fs-standard-cross-region  1h
    
  4. 選用項目:如果您計劃使用非 root 使用者身分存取資料,或直接使用主控台或 API 將檔案新增至現有 IBM Cloud Object Storage 儲存區,請確定已指派檔案的正確許可權,讓您的應用程式可以根據需要順利讀取及更新檔案。

  5. 若要將 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>
            securityContext:
              runAsUser: <non_root_user>
            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
    您要部署至叢集的容器的名稱。
    runAsUser
    在規格儲存器安全環境定義區段中,您可以選擇性地設定執行身分使用者值。
    mountPath
    在規格儲存器磁區裝載區段中,輸入在儲存器內裝載磁區的目錄絕對路徑。 若要讓不同應用程式共用同一個卷,您可以為每個應用程式指定 卷的子路徑
    volumeMounts.name
    在規格儲存器磁區裝載區段中,輸入要裝載至 Pod 的磁區名稱。
    volumes.name
    在磁區區段中,輸入要裝載至 Pod 的磁區名稱。 通常,此名稱與 volumeMounts/name 相同。
    claimName
    在磁區持續性磁區要求區段中,輸入連結您要使用之 PV 的 PVC 名稱。

建立部署

建立 PVC 及部署配置檔之後,請在叢集裡建立部署。

  1. 建立部署。

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

    oc 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:    mypvc
        ReadOnly:    false
    
  3. 登入應用程式 Pod 並寫入資料,以驗證您可以將資料寫入 IBM Cloud Object Storage 服務實例。 登入可裝載 PV 的 Pod。

    oc exec <pod_name> -it bash
    
  4. 導覽至您在應用程式部署中定義的磁區裝載路徑。

  5. 建立文字檔。

    echo "This is a test" > test.txt
    
  6. 在 IBM Cloud 控制台中,導航至您的 IBM Cloud Object Storage 服務實例。

  7. 從功能表中,選取儲存區

  8. 開啟儲存區,並驗證您可以看到所建立的 test.txt

在有狀態集合中使用物件儲存空間

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

開始之前,請先完成本主題開頭所述的先決步驟。

若要部署使用物件儲存空間的有狀態集合,請執行下列動作:

  1. 建立有狀態集的配置檔,以及您用來公開有狀態集的服務。 下列範例顯示如何將 NGINX 部署為有 3 個抄本的有狀態集,其中每個抄本使用個別的儲存區,或者所有抄本共用相同儲存區。

    以下範例示範如何建立一個包含三個複本的帶狀態集合,且每個複本使用獨立的儲存桶。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-v01
      namespace: default
      labels:
        app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web-v01
      namespace: default
    spec:
      selector:
        matchLabels:
          app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML
      serviceName: "nginx-v01"
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: mypvc
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: mypvc
          annotations:
            ibm.io/auto-create-bucket: "true"
            ibm.io/auto-delete-bucket: "true"
            ibm.io/bucket: ""
            ibm.io/secret-name: mysecret
            volume.beta.kubernetes.io/storage-class: ibmc-s3fs-standard-perf-cross-region
            volume.beta.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "ibmc-s3fs-standard-perf-cross-region"
          resources:
            requests:
              storage: 1Gi
    

    以下範例示範如何建立一個包含三個複本、且共用同一儲存桶 mybucket 的有狀態集。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-v01
      namespace: default
      labels:
        app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web-v01
      namespace: default
    spec:
      selector:
        matchLabels:
          app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML
      serviceName: "nginx-v01"
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: mypvc
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: mypvc
          annotations:
            ibm.io/auto-create-bucket: "false"
            ibm.io/auto-delete-bucket: "false"
            ibm.io/bucket: mybucket
            ibm.io/secret-name: mysecret
            volume.beta.kubernetes.io/storage-class: ibmc-s3fs-standard-perf-cross-region
            volume.beta.kubernetes.io/storage-provisioner: ibm.io/ibmc-s3fs
        spec:
          accessModes: [ "ReadOnlyMany" ]
          storageClassName: "ibmc-s3fs-standard-perf-cross-region"
          resources:
            requests:
              storage: 1Gi
    
name

輸入有狀態集合的名稱。 您輸入的名稱將用於建立您的 PVC 的名稱,格式為:<volume_name>-< statefulset_name>-<replica_number>

serviceName

輸入您要用來公開有狀態集合的服務名稱。

replicas

輸入有狀態集合的抄本數目。

matchLabels

在規格選取器比對標籤區段中,輸入您要併入有狀態集合及 PVC 中的所有標籤。 您在有狀態集(stateful set)的 volumeClaimTemplates 中包含的標籤,不會被 Kubernetes 識別。 相反地,您必須在有狀態集(stateful set)的 YAML 檔案中,於 spec.selector.matchLabels spec.template.metadata.labels 區段內定義這些標籤。 為確保所有有狀態集(stateful set)的複本均納入服務的負載平衡範圍,請加入與您在服務 YAML 檔案中「spec.selector」區段所使用的相同標籤。

labels

在規格 meta 資料標籤區段中,輸入您新增至有狀態集 YAML 的 spec.selector.matchLabels 區段的相同標籤。

terminationGracePeriodSeconds

請輸入秒數,以讓 kubelet 有足夠時間安全地終止執行您的有狀態集複本的 Pod。 如需相關資訊,請參閱 刪除 Pod

VolumeClaimTemplates.name

在規格磁區要求範本 meta 資料區段中,輸入磁區的名稱。 請使用您在「spec.containers.volumeMount.name」區段中定義的相同名稱。 您在此處輸入的名稱將用於建立您的 PVC 名稱,格式為:<volume_name>-<statefulset_name>-<replica_number>

ibm.io/auto-create-bucket

在規格磁區要求範本 meta 資料區段中,設定註釋以配置如何建立儲存區。 請從下列選項中進行選擇:

  • true: 選擇此選項,系統會為每個有狀態集(stateful set)的複本自動建立一個儲存桶。 請注意,服務認證必須具有 Writer 許可權才能自動建立儲存區。
  • false: 若要讓狀態集的各複本共用現有的儲存桶,請選擇此選項。 請務必在您的有狀態集 (StatefulSet) YAML 檔案中,於 spec.volumeClaimTemplates.metadata.annotions.ibm.io/bucket 區段內定義儲存桶的名稱。
ibm.io/auto-delete-bucket

在規格磁區要求範本 meta 資料區段中,設定註釋以配置如何刪除儲存區。 請從下列選項中進行選擇:

  • true: 當您刪除 PVC 時,您的資料、儲存桶及 PV 會自動被移除。 您的 IBM Cloud Object Storage 服務實例仍然存在,並未刪除。 若您選擇將此選項設為 true,則必須設定 ibm.io/auto-create-bucket: trueibm.io/bucket: "",以便您的儲存桶能自動以 tmp-s3fs-xxxx 此格式建立名稱。
  • false: 當您刪除 PVC 時,PV 會自動被刪除,但您的資料以及 IBM Cloud Object Storage 服務實例中的儲存桶仍會保留。 若要存取資料,您必須以現有儲存區的名稱建立新的 PVC。
ibm.io/bucket

在規格磁區要求範本 meta 資料區段中,設定儲存區詳細資料的註釋。 請從下列選項中進行選擇:

  • 若將 ibm.io/auto-create-bucket 設定為 true :請在 IBM Cloud Object Storage 中輸入您要建立的儲存桶名稱。 此外,若已將「ibm.io/auto-delete-bucket」設定為「true」,則必須將此欄位留空,系統才會自動為您的儲存桶指派格式為 tmp-s3fs-xxxx 的名稱。 名稱在 IBM Cloud Object Storage 中必須是唯一的。
  • 若將 ibm.io/auto-create-bucket 設定為 false :請輸入您要在叢集中存取的現有儲存桶名稱。
ibm.io/secret-name

在規格磁區要求範本 meta 資料註釋區段中,輸入密鑰名稱,該密鑰會保留您先前建立的 IBM Cloud Object Storage 認證。 如果您將 IBM Cloud Object Storage 認證 新增至預設儲存類別,則不得列出 PVC 中的密鑰。

kubernetes.io/storage-class

在規格磁區要求範本 meta 資料註釋區段中,輸入您要使用的儲存類別。 請從下列選項中進行選擇:

  • 若為 ibm.io/auto-create-bucket: "true":請輸入您要為新儲存桶使用的儲存類別。
  • 若為 ibm.io/auto-create-bucket: "false":請輸入您用來建立現有儲存桶的儲存類別。

若要列出現有的儲存類別,請執行 oc get sc | grep s3。 若未指定儲存類別,該 PVC 將採用叢集中設定的預設儲存類別進行建立。 請確保預設儲存類別使用「ibm.io/ibmc-s3fs」配置程式,以便您的有狀態集能透過物件儲存進行配置。

storageClassName

在規格磁區要求範本規格區段中,輸入您在有狀態集 YAML 的 spec.volumeClaimTemplates.metadata.annotations.volume.beta.kubernetes.io/storage-class 區段中輸入的相同儲存空間類別。

storage

在規格磁區要求範本規格資源要求區段中,輸入 IBM Cloud Object Storage 儲存區的虛構大小 (GB)。 Kubernetes 需要大小,但 IBM Cloud Object Storage 中不需要。 您可以輸入任何想要的大小。 您在 IBM Cloud Object Storage 上實際使用的空間可能有所不同,並將根據 定價表進行計費。