本文为您介绍有状态服务-动态云盘的常见使用场景及方法。

背景信息

动态云盘的使用场景:

没有购买云盘,在应用部署时自动购买云盘的情况。

动态云盘的使用方式:
  1. 手动创建PVC,在PVC中声明StorageClass。
  2. 部署应用时通过StorageClass自动创建PV。

前提条件

Provisioner插件

容器服务Kubernetes版在创建集群时,默认安装Provisioner插件。

创建StorageClass

阿里云容器服务Kubernetes在系统初始化的时候会默认创建4个StorageClass,且使用参数的默认情况。同时这4个StorageClass仅适用于单可用区集群,若是多可用区集群,则需要自己另行创建StorageClass。这4个StorageClass分别为:
  • alicloud-disk-common:自动创建普通云盘。
  • alicloud-disk-efficiency:自动创建高效云盘。
  • alicloud-disk-ssd:自动创建SSD云盘。
  • alicloud-disk-available:提供高可用选项,先尝试自动创建高效云盘;如果相应可用区的高效云盘资源售尽,再尝试自动创建SSD云盘,如果该可用区的SSD云盘也售尽,则尝试自动创建普通云盘。
  1. 创建storageclass.yaml文件。
    kind: StorageClass
    apiVersion: storage.k8s.io/v1beta1
    metadata:
      name: alicloud-disk-ssd-hangzhou-b
    provisioner: alicloud/disk
    reclaimPolicy: Retain
    parameters:
      type: cloud_ssd
      regionid: cn-hangzhou
      zoneid: cn-hangzhou-b
      fstype: "ext4"
      readonly: "false"
    参数解释:
    • provisioner:动态云盘配置为 alicloud/disk,标识使用provisioner 插件自动创建阿里云云盘。
    • reclaimPolicy:云盘的回收策略。支持DeleteRetain,默认情况为Delete
      说明 如果配置为 Delete,删除PVC时,云盘会一起删除,云盘上的数据不可恢复。
    • type:自动创建云盘的类型,支持cloudcloud_efficiencycloud_ssdavailable
    • regionid:(可选)自动创建云盘所在的region。与集群的region相同。
    • zoneid:(可选)自动创建云盘所在的zone。
      • 单可用区集群,与集群所在zone相同。
      • 多可用区集群,zoneid可同时配置多个,例如:
        zoneid: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c
    • fstype:(可选)自动创建云盘所使用的文件系统,默认情况为ext4
    • readonly:(可选)挂载自动创建云盘的权限是否为可读,支持true:云盘具有只读权限,false:云盘具有可读可写权限,默认情况为false
    • encrypted:(可选)自动创建的云盘是否加密,支持true:加密,false:不加密,默认情况为false
  2. 执行以下命令,创建StorageClass。
    $ kubectl create -f storageclass.yaml

创建PVC

  1. 创建pvc-ssd.yaml文件。
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: disk-ssd
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: alicloud-disk-ssd-hangzhou-b
      resources:
        requests:
          storage: 20Gi
  2. 执行以下命令,创建PVC。
    $ kubectl create -f pvc-ssd.yaml

预期结果

在 Kubernetes 菜单下,单击左侧导航栏的 应用 > 存储声明,进入 存储声明列表页面,选择目标集群和命名空间,可以看到该PVC绑定的存储类型为 StorageClass中声明的 alicloud-disk-ssd-hangzhou-b,并且关联存储卷。

创建应用

  1. 创建pvc-dynamic.yaml文件。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-dynamic
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
              - name: disk-pvc
                mountPath: "/data"
          volumes:
            - name: disk-pvc
              persistentVolumeClaim:
                claimName: disk-ssd
  2. 执行以下命令,创建Deployment。
    $ kubectl create -f nginx-dynamic.yaml

预期结果

在 Kubernetes 菜单下,单击左侧导航栏的 应用 > 部署,进入 部署列表页面,选择目标集群和命名空间,可以看到刚刚创建的deployment。

动态云盘的持久化存储

  1. 执行以下命令,查看部署的deployment所在Pod的名称。
    $ kubectl get pod | grep dynamic
    nginx-dynamic-5c74594ccb-zl9pf     2/2     Running     0          3m
  2. 执行以下命令,查看/data路径下是否挂载了新的云盘。
    $ kubectl exec nginx-dynamic-5c74594ccb-zl9pf df | grep data
    /dev/vdh        20511312    45080  20449848   1% /data
  3. 执行以下命令,查看/data路径下的文件。
    $ kubectl exec nginx-dynamic-5c74594ccb-zl9pf ls /data
    lost+found
  4. 执行以下命令,在/data路径下创建文件dynamic
    $ kubectl exec nginx-dynamic-5c74594ccb-zl9pf touch /data/dynamic
  5. 执行以下命令,查看/data路径下的文件。
    $ kubectl exec nginx-dynamic-5c74594ccb-zl9pf ls /data
    dynamic
    lost+found
  6. 执行以下命令,删除名称为nginx-dynamic-5c74594ccb-zl9pf的Pod。
    $ kubectl delete pod nginx-dynamic-5c74594ccb-zl9pf
    pod "nginx-dynamic-5c74594ccb-zl9pf" deleted
  7. 同时在另一个窗口中,执行以下命令,查看Pod删除及Kubernetes重建Pod的过程。
    $ kubectl get pod -w -l app=nginx
    NAME                               READY   STATUS    RESTARTS   AGE
    nginx-dynamic-5c74594ccb-zl9pf     2/2     Running   0          6m48s
    nginx-dynamic-5c74594ccb-zl9pf   2/2   Terminating   0     7m32s
    nginx-dynamic-5c74594ccb-45sd4   0/2   Pending   0     0s
    nginx-dynamic-5c74594ccb-45sd4   0/2   Pending   0     0s
    nginx-dynamic-5c74594ccb-45sd4   0/2   Init:0/1   0     0s
    nginx-dynamic-5c74594ccb-zl9pf   0/2   Terminating   0     7m32s
    nginx-dynamic-5c74594ccb-zl9pf   0/2   Terminating   0     7m33s
    nginx-dynamic-5c74594ccb-zl9pf   0/2   Terminating   0     7m33s
    nginx-dynamic-5c74594ccb-45sd4   0/2   PodInitializing   0     5s
    nginx-dynamic-5c74594ccb-45sd4   2/2   Running   0     22s
  8. 执行以下命令,查看Kubernetes重建的Pod名称。
    $ kubectl get pod 
    NAME                               READY   STATUS      RESTARTS   AGE
    nginx-dynamic-5c74594ccb-45sd4     2/2     Running     0          2m
  9. 执行以下命令,查看/data路径下的文件,刚刚创建的文件dynamic并没有被删除,说明动态云盘的数据可持久保存。
    $ kubectl exec nginx-dynamic-5c74594ccb-45sd4 ls /data
    dynamic
    lost+found