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

背景信息

云盘的使用场景包括:
  • 对磁盘I/O要求高的应用,且没有共享数据的需求,如MySQL、Redis等数据存储服务。
  • 高速写日志。
  • 持久化存储数据,不因Pod生命周期的结束而消失。

静态云盘的使用场景:

已经购买了云盘实例的情况。

静态云盘使用方式:

需手动创建PV及PVC。

前提条件

使用限制

  • 云盘为阿里云存储团队提供的非共享存储,只能同时被一个Pod挂载。
  • 集群中只有与云盘在同一个可用区(Zone)的节点才可以挂载云盘。

创建PV

  1. 创建pv-static.yaml文件。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: <your-disk-id>
      labels:
        alicloud-pvname: <your-disk-id>
        failure-domain.beta.kubernetes.io/zone: <your-zone>
        failure-domain.beta.kubernetes.io/region: <your-region>
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      flexVolume:
        driver: "alicloud/disk"
        fsType: "ext4"
        options:
          volumeId: "<your-disk-id>"
    说明
    • alicloud-pvname: <your-disk-id>:PV的名称。需要与volumeID云盘ID一致。
    • failure-domain.beta.kubernetes.io/zone: <your-zone>:云盘所在的可用区。例如:cn-hangzhou-b
    • failure-domain.beta.kubernetes.io/region: <your-region>:云盘所在的地域。例如:cn-hangzhou

    failure-domain.beta.kubernetes.io/zonefailure-domain.beta.kubernetes.io/region,在多可用区的情况下,必须配置,可保证您的Pod调度到云盘所在的可用区。

  2. 执行以下命令,创建PV。
    $ kubectl create -f pv-static.yaml

预期结果

在 Kubernetes 菜单下,单击左侧导航栏的 集群 > 存储卷,进入 存储卷列表页面,选择目标集群,可以看到刚刚创建的PV。

创建PVC

创建云盘存储声明PVC,使用selector筛选PV,精确配置PVC和PV的绑定关系。

  1. 创建pvc-static.yaml文件。
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-disk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      selector:
        matchLabels:
          alicloud-pvname: <your-disk-id>
  2. 执行以下命令,创建PVC。
    $ kubectl create -f pvc-static.yaml

预期结果

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

创建应用

  1. 创建static.yaml文件。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-static
      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: pvc-disk
  2. 执行以下命令,创建Deployment。
    $ kubectl create -f static.yaml

预期结果

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

静态云盘的持久化存储

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