This topic describes the common scenarios of static disks and how to use static disks to create PVs for stateful services.

Prerequisites

Background information

The common scenarios of disks are as follows:
  • Create applications that have high disk I/O requirements and do not require shared data. For example, MySQL, Redis, and other data storage services.
  • Write logs at high speeds.
  • Store data in a way that is independent of the lifetime of a Pod.

Scenarios of static disks: You have purchased a disk.

How to use static disks: Manually create a PV and a PVC. For more information, see Use static volumes.

Limits

  • Disks are non-shared storage devices provided by Alibaba Cloud. Each disk can be mounted to only one Pod at a time.
  • Disks can only be mounted to nodes that are located in the same zone.

Create a PV

  1. Create a pv-static.yaml file with the following content.
    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>"
    Note
    • alicloud-pvname: <your-disk-id>: the name of the PV. This parameter must be set to the same value as that of the disk ID.
    • failure-domain.beta.kubernetes.io/zone: <your-zone>: the zone where the disk is located. Example: cn-hangzhou-b.
    • failure-domain.beta.kubernetes.io/region: <your-region>: the region where the disk is located. Example: cn-hangzhou.

    If your cluster is deployed across multiple zones, you must specify the failure-domain.beta.kubernetes.io/zone and failure-domain.beta.kubernetes.io/region parameters to ensure that your Pod is scheduled to the zone where the disk is located.

  2. Run the following command to create a PV:
    kubectl create -f pv-static.yaml

Expected result

In the left-side navigation pane, choose Clusters > Persistent Volumes to go to the PVs and PVCs page. Click the Persistent Volumes tab and select the target cluster. You can view the newly created PV.

Create a PVC

  1. Create a pvc-static.yaml file with the following content.
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-disk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      selector:
        matchLabels:
          alicloud-pvname: <your-disk-id>
  2. Run the following command to create a PVC:
    kubectl create -f pvc-static.yaml

Expected result

In the left-side navigation pane, choose Applications > Persistent Volume Claims to go to the PVs and PVCs page. Click the Persistent Volume Claims tab and select the target cluster and namespace. You can view the newly created PVC.

Create an application

  1. Create a static. yaml file with the following content.
    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. Run the following command to create a Deployment.
    kubectl create -f static.yaml

Expected result

In the left-side navigation pane, choose Applications > Deployments to go to the Deployments page. Select the target cluster and namespace. You can view the newly created Deployment.

Use static disks as persistent storage

  1. Run the following command to view the Pod that is managed by the new Deployment:
    $ kubectl get pod | grep static
    
    nginx-static-78c7dcb9d7-g****   2/2     Running     0          32s
  2. Run the following command to check whether a new disk is mounted to the /data path:
    $ kubectl exec nginx-static-78c7dcb9d7-g**** df | grep data
    
    /dev/vdf        20511312    45080  20449848   1% /data
  3. Run the following command to view the files in the /data path:
    $ kubectl exec nginx-static-78c7dcb9d7-g**** ls /data
    
    lost+found
  4. Run the following command to create a file named static in the /data path:
    $ kubectl exec nginx-static-78c7dcb9d7-g**** touch /data/static
  5. Run the following command to view the files in the /data path:
    $ kubectl exec nginx-static-78c7dcb9d7-g**** ls /data
    static
    lost+found
  6. Run the following command to delete the Pod named nginx-static-78c7dcb9d7-g****.
    $ kubectl delete pod nginx-static-78c7dcb9d7-g****
    
    pod "nginx-static-78c7dcb9d7-g****" deleted
  7. Open another kubectl CLI and run the following command to view the process of how the Pod is deleted and a new Pod is created in Kubernetes:
    $ kubectl get pod -w -l app=nginx
    
    NAME                            READY   STATUS            RESTARTS   AGE
    nginx-static-78c7dcb9d7-g****   2/2     Running           0          50s
    nginx-static-78c7dcb9d7-g****   2/2     Terminating       0          72s
    nginx-static-78c7dcb9d7-h****   0/2     Pending           0          0s
    nginx-static-78c7dcb9d7-h****   0/2     Pending           0          0s
    nginx-static-78c7dcb9d7-h****   0/2     Init:0/1          0          0s
    nginx-static-78c7dcb9d7-g****   0/2     Terminating       0          73s
    nginx-static-78c7dcb9d7-h****   0/2     Init:0/1          0          5s
    nginx-static-78c7dcb9d7-g****   0/2     Terminating       0          78s
    nginx-static-78c7dcb9d7-g****   0/2     Terminating       0          78s
    nginx-static-78c7dcb9d7-h****   0/2     PodInitializing   0          6s
    nginx-static-78c7dcb9d7-h****   2/2     Running           0          8s
  8. Run the following command to view the newly created Pod:
    $ kubectl get pod
    NAME                            READY   STATUS      RESTARTS   AGE
    nginx-static-78c7dcb9d7-h****   2/2     Running     0          14s
  9. Run the following command to verify that file static in the /data path is not deleted. This indicates that data in the static disk is persistently stored.
    $ kubectl exec nginx-static-78c7dcb9d7-h6brd ls /data
    static
    lost+found