您可以在阿里雲Container Service Kubernetes 叢集中使用阿里雲雲端硬碟儲存卷。

目前,阿里雲雲端硬碟提供兩種 Kubernetes 掛載方式:

说明 對建立的雲端硬碟容量有如下要求:
  • 普通雲端硬碟:最小5Gi
  • 高效雲端硬碟:最小20Gi
  • SSD雲端硬碟:最小20Gi

靜態儲存卷

您可以直接通過volume使用阿里雲雲端硬碟儲存卷或者通過 PV/PVC 使用阿里雲雲端硬碟儲存卷。

前提條件

使用雲端硬碟資料卷之前,您需要先在 ECS 管理主控台上建立雲端硬碟。有關如何建立雲端硬碟,參見建立雲端碟

使用說明

  • 雲端硬碟為非共用儲存,只能同時被一個 pod 掛載。
  • 使用雲端硬碟儲存卷前需要先申請一個雲端硬碟,並獲得磁碟 ID。參見 建立雲端碟
  • volumeId: 表示所掛載雲端硬碟的磁碟ID;volumeName、PV Name要與之相同。
  • 叢集中只有與雲端硬碟在同一個可用性區域(Zone)的節點才可以掛載雲端硬碟。

直接通過 volume 使用

使用disk-deploy.yaml檔案建立 Pod。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-disk-deploy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-flexvolume-disk
        image: nginx
        volumeMounts:
          - name: "d-bp1j17ifxfasvts3tf40"
            mountPath: "/data"
      volumes:
        - name: "d-bp1j17ifxfasvts3tf40"
          flexVolume:
            driver: "alicloud/disk"
            fsType: "ext4"
            options:
              volumeId: "d-bp1j17ifxfasvts3tf40"

通過 PV/PVC 使用

步驟 1 建立雲端硬碟類型的 PV

您可以使用 yaml 檔案或者控制台介面建立雲端硬碟類型的 PV。

通過 yaml 檔案建立 PV

使用 disk-pv.yaml 檔案建立 PV。

说明 pv name 要與阿里雲盤 ID 相同。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: d-bp1j17ifxfasvts3tf40
  labels:
    failure-domain.beta.kubernetes.io/zone: cn-hangzhou-b
    failure-domain.beta.kubernetes.io/region: cn-hangzhou
spec:
  capacity:
    storage: 20Gi
  storageClassName: disk
  accessModes:
    - ReadWriteOnce
  flexVolume:
    driver: "alicloud/disk"
    fsType: "ext4"
    options:
      volumeId: "d-bp1j17ifxfasvts3tf40"

通過控制台介面建立雲端硬碟資料卷

  1. 登入Container Service管理主控台
  2. 在 Kubernetes 菜單下,單擊左側導覽列中的叢集 > 儲存卷,進入資料卷列表頁面。
  3. 選擇所需的叢集,單擊頁面右上方的建立


  4. 在建立資料卷對話方塊中,配置資料卷的相關參數。
    • 資料卷類型:本樣本中為雲端硬碟
    • 訪問模式:預設為 ReadWriteOnce。
    • 雲端硬碟 ID:您可以選擇與叢集屬於相同地區和可用性區域下處於待掛載狀態的雲端硬碟。
    • 檔案系統類型:您可以選擇以什麼資料類型將資料存放區到雲端硬碟上,支援的類型包括 ext4、ext3、xfs、vfat。預設為 ext4。
    • 標籤:為該資料卷添加標籤。


  5. 完成配置後,單擊建立

步驟 2 建立 PVC

使用 disk-pvc.yaml 檔案建立 PVC。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-disk
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: disk
  resources:
    requests:
      storage: 20Gi

步驟 3 建立 Pod

使用disk-pod.yaml檔案建立 pod。

apiVersion: v1
kind: Pod
metadata:
  name: "flexvolume-alicloud-example"
spec:
  containers:
    - name: "nginx"
      image: "nginx"
      volumeMounts:
        - name: pvc-disk
          mountPath: "/data"
  volumes:
  - name: pvc-disk
    persistentVolumeClaim:
      claimName: pvc-disk

動態儲存裝置卷

動態儲存裝置卷需要您手動建立 StorageClass,並在PVC中通過 storageClassName 來指定期望的雲端硬碟類型。

建立 StorageClass

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: alicloud-disk-common-hangzhou-b
provisioner: alicloud/disk
parameters:
  type: cloud_ssd
  regionid: cn-hangzhou
  zoneid: cn-hangzhou-b

參數說明:

  • provisioner:配置為 alicloud/disk,標識使用阿里雲雲端硬碟 Provsioner 外掛程式建立。
  • type:標識雲端硬碟類型,支援 cloud、cloud_efficiency、cloud_ssd、available 四種類型;其中 available 會對高效、SSD、普通雲端硬碟依次嘗試建立,直到建立成功。
  • regionid:期望建立雲端硬碟的地區。
  • reclaimPolicy: 雲端硬碟的回收策略,預設為Delete,支援Retain。
  • zoneid:期望建立雲端硬碟的可用性區域。

建立服務

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: disk-common
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: alicloud-disk-common-hangzhou-b
  resources:
    requests:
      storage: 20Gi
---
kind: Pod
apiVersion: v1
metadata:
  name: disk-pod-common
spec:
  containers:
  - name: disk-pod
    image: nginx
    volumeMounts:
      - name: disk-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: disk-pvc
      persistentVolumeClaim:
        claimName: disk-common

預設選項

叢集預設提供了下面幾種 StorageClass,可以在單 AZ 類型的叢集中使用。

  • alicloud-disk-common:普通雲端硬碟。
  • alicloud-disk-efficiency:高效雲端硬碟。
  • alicloud-disk-ssd:SSD雲端硬碟。
  • alicloud-disk-available:提供高可用選項,先試圖建立高效雲端硬碟;如果相應AZ的高效雲端硬碟資源售盡,再試圖建立SSD盤;如果SSD售盡,則試圖建立普通雲端硬碟。

使用雲端硬碟建立多執行個體StatefulSet

使用 volumeClaimTemplates 的方式來建立,這樣會動態建立多個 PVC 和 PV 並綁定。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: disk-common
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: disk-common
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "alicloud-disk-common"
      resources:
        requests:
          storage: 10Gi