您可以在阿里云容器服务 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"
说明 如果您所使用的集群是多 AZ 的模式,使用云盘的时候需要进行 AZ 调度,即把 Pod 调度到与云盘相同的 AZ。
具体配置为在 yaml 中对 pod 添加 nodeSelector,如下:
nodeSelector:
        failure-domain.beta.kubernetes.io/zone: cn-hangzhou-b

通过 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. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,单击左侧导航栏中的集群 > 存储,进入数据卷列表页面。
  3. 选择所需的集群,单击页面右上角的创建


  4. 在创建数据卷对话框中,配置数据卷的相关参数。
    • 数据卷类型:本示例中为云盘
    • 数据卷名:创建的数据卷的名称。数据卷名必须和 云盘 ID 一致。
    • 访问模式:默认为 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

默认选项

在多 AZ 的集群中,需要您手动创建上述 StorageClass,这样可以更准确的定义所需要云盘的 AZ 信息;

集群默认提供了下面几种 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